从一副牌中发牌和从阵列中取出牌
Dealing Cards from a Deck and Removing the Cards from an Array
我有这样一组卡片名称:
var deckNames = [ "unused",
"sA", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "sJ", "sQ", "sK",
"hA", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "h9", "h10", "hJ", "hQ", "hK",
"cA", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "cJ", "cQ", "cK",
"dA", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "dJ", "dQ", "dK",
];
我想写一个函数,从数组中随机选择一张牌,同时从上面的 "deckNames" 数组中删除它。我写了以下内容,但似乎没有用。
var deal = function(){
var card = Math.floor(Math.random() * 52) + 1;
return deckNames[card];
deckNames.splice(card,1);
};
当我 运行 在控制台中使用 deal
函数时,它会从数组中随机选择并 returns 一张卡片,但是 deckNames
数组本身并没有得到发牌从阵列中移除。我怎样才能做到这一点?谢谢。
它不拼接,因为splice
调用是死代码;这意味着它永远不可能 运行。
一旦你 return
,你 "exit" 函数。返回前需要拼接:
var deal = function(){
var card = Math.floor(Math.random() * 52) + 1;
deckNames.splice(card,1);
return deckNames[card];
};
考虑:
var test = function(){
console.log("Hello");
return;
console.log("World");
};
test();
你认为打印出来的是什么?
编辑:
再次重读您的代码后,我意识到如果您发的牌足够多,仍然会出现一个主要问题。您已将 52
硬编码到函数中,但每次调用都会删除一张卡片。如果只有 10 张牌,但随机数生成器给你一个 50
会怎样?将 52
更改为 deckNames.length
以确保您没有尝试发牌(这将导致 "array out of bounds" 错误)。
您的 return
语句在甲板被修改之前结束您的功能。切换语句,使 return
成为函数中的最后一个东西。此外,正如@DavidE 指出的那样,您无法在卡片被移除后从阵列中获取卡片,因此您必须在移除之前检索它:
var deal = function(){
var index = Math.floor(Math.random() * 52) + 1;
var card = deckNames[index];
deckNames.splice(index, 1);
return card;
};
或者简单地说:
var deal = function(){
var card = Math.floor(Math.random() * 52) + 1;
return deckNames.splice(card, 1)[0];
};
(因为 splice
returns 删除的元素,包装在一个新数组中)。
其他一些需要考虑的事情:
数组索引从 0 开始,所以您可能不希望随机数生成器中有 +1
。你实际上想要数字从 0 到 51*:
var card = Math.floor(Math.random() * 52);
每发一张牌,牌组的大小就会减少。不是每次生成最多 51 个随机数,而是在调用函数时根据牌组的大小来生成该数字。否则你会得到索引超出范围的错误。见下文。
最终,这会给你这样的东西:
var deal = function(){
var card = Math.floor(Math.random() * deckNames.length);
return deckNames.splice(card, 1)[0];
};
首先,您可以摆脱您的 "unused"
,然后检查一下:
function deal(deck){
var card = Math.floor(Math.random()*deck.length); // notice you add the one later - that's not right
return deck.splice(card, 1);
}
var pulledCard = deal(deckNames); // now deckNames array is altered
现在学习这个:
function CardGame(deck){
this.deck = deck;
this.deal = function(){
return this.deck.splice(Math.random()*this.deck.length, 1)[0];
}
this.shuffle = function(){{
var l = this.deck.length;
this.deck.sort(function(a, b){
return 0.5 - Math.floor(Math.random()*(l+1))/l;
});
return this.deck;
}
}
var game = new CardGame(deckNames);
var alteredDeck = game.shuffle(); // alteredDeck is same as game.deck;
var singleCard = game.deal(); // game.deck is spliced
我有这样一组卡片名称:
var deckNames = [ "unused",
"sA", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "sJ", "sQ", "sK",
"hA", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "h9", "h10", "hJ", "hQ", "hK",
"cA", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "cJ", "cQ", "cK",
"dA", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "dJ", "dQ", "dK",
];
我想写一个函数,从数组中随机选择一张牌,同时从上面的 "deckNames" 数组中删除它。我写了以下内容,但似乎没有用。
var deal = function(){
var card = Math.floor(Math.random() * 52) + 1;
return deckNames[card];
deckNames.splice(card,1);
};
当我 运行 在控制台中使用 deal
函数时,它会从数组中随机选择并 returns 一张卡片,但是 deckNames
数组本身并没有得到发牌从阵列中移除。我怎样才能做到这一点?谢谢。
它不拼接,因为splice
调用是死代码;这意味着它永远不可能 运行。
一旦你 return
,你 "exit" 函数。返回前需要拼接:
var deal = function(){
var card = Math.floor(Math.random() * 52) + 1;
deckNames.splice(card,1);
return deckNames[card];
};
考虑:
var test = function(){
console.log("Hello");
return;
console.log("World");
};
test();
你认为打印出来的是什么?
编辑:
再次重读您的代码后,我意识到如果您发的牌足够多,仍然会出现一个主要问题。您已将 52
硬编码到函数中,但每次调用都会删除一张卡片。如果只有 10 张牌,但随机数生成器给你一个 50
会怎样?将 52
更改为 deckNames.length
以确保您没有尝试发牌(这将导致 "array out of bounds" 错误)。
您的 return
语句在甲板被修改之前结束您的功能。切换语句,使 return
成为函数中的最后一个东西。此外,正如@DavidE 指出的那样,您无法在卡片被移除后从阵列中获取卡片,因此您必须在移除之前检索它:
var deal = function(){
var index = Math.floor(Math.random() * 52) + 1;
var card = deckNames[index];
deckNames.splice(index, 1);
return card;
};
或者简单地说:
var deal = function(){
var card = Math.floor(Math.random() * 52) + 1;
return deckNames.splice(card, 1)[0];
};
(因为 splice
returns 删除的元素,包装在一个新数组中)。
其他一些需要考虑的事情:
数组索引从 0 开始,所以您可能不希望随机数生成器中有
+1
。你实际上想要数字从 0 到 51*:var card = Math.floor(Math.random() * 52);
每发一张牌,牌组的大小就会减少。不是每次生成最多 51 个随机数,而是在调用函数时根据牌组的大小来生成该数字。否则你会得到索引超出范围的错误。见下文。
最终,这会给你这样的东西:
var deal = function(){
var card = Math.floor(Math.random() * deckNames.length);
return deckNames.splice(card, 1)[0];
};
首先,您可以摆脱您的 "unused"
,然后检查一下:
function deal(deck){
var card = Math.floor(Math.random()*deck.length); // notice you add the one later - that's not right
return deck.splice(card, 1);
}
var pulledCard = deal(deckNames); // now deckNames array is altered
现在学习这个:
function CardGame(deck){
this.deck = deck;
this.deal = function(){
return this.deck.splice(Math.random()*this.deck.length, 1)[0];
}
this.shuffle = function(){{
var l = this.deck.length;
this.deck.sort(function(a, b){
return 0.5 - Math.floor(Math.random()*(l+1))/l;
});
return this.deck;
}
}
var game = new CardGame(deckNames);
var alteredDeck = game.shuffle(); // alteredDeck is same as game.deck;
var singleCard = game.deal(); // game.deck is spliced