我是一个相对较新的JavaScript,我构建了一个小应用程序,从一组52张卡中随机生成一张卡片(我将所有可能性存储在一个数组中)。但我想确保同一张卡无法生成两次。我无法找到办法。
var cardType = ["A♠","2♠","3♠","4♠","5♠","6♠","7♠","8♠","9♠","10♠","J♠","Q♠","K♠"];
function generateCard()
{
var card = cardType[Math.round(Math.random() * (cardType.length - 1))];
}
spade符号实际上并不在我的数组中,我只是将它放入可见性中。
答案 0 :(得分:3)
跟踪已生成的卡片,检查新生成的卡片是否已存在,如果已存在,请生成新卡片:
var already_generated = [];
var cardType = ["A♠","2♠","3♠","4♠","5♠"...];
function generateCard() {
var card = cardType[Math.round(Math.random() * (cardType.length - 1))];
if ( already_generated.indexOf(card) == -1 ) {
already_generated.push(card);
}else{
if (already_generated.length < cardType.length) generateCard();
}
}
较早的浏览器需要Array.indexOf
的垫片,可以在MDN
作为旁注,原始数组可以被切片,但这似乎更容易,除非您出于某种原因有来更改原始数组!
答案 1 :(得分:3)
预先将阵列洗牌,然后从阵列中弹出一张卡
var cardType = ["A♠","2♠","3♠","4♠","5♠","6♠","7♠","8♠","9♠","10♠","J♠","Q♠","K♠"];
//shuffles array
cardType.sort(function() { return 0.5 - Math.random() });
function generateCard()
{
return cardType.pop();
}
当你得到undefined
时,这意味着你得到了所有的卡
答案 2 :(得分:0)
我会:
deck.pop()
从该套牌中取出连续的牌在开发应用程序时,使用抽象来表示一副牌可能会很有用。现在看起来有点矫枉过正,但从长远来看它是值得的。如果做得恰当,它也应该可以在其他项目中重复使用。
答案 3 :(得分:-2)
使用delete关键字。
样品:
var x = [1,2,3];
delete x[1]; // delete element '2'
for (i in x) {
console.log(x[i]); // outputs 1, 3
}