0

我对 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))];
}

黑桃符号实际上不在我的数组中,我只是将其放入以提高可见性。

4

4 回答 4

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();
    }
}

较旧的浏览器需要一个 shim Array.indexOf,可以在MDN上找到

作为旁注,可以对原始数组进行切片,但这似乎更容易,除非您出于某种原因必须更改原始数组!

于 2013-07-27T09:37:27.050 回答
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它意味着你得到了所有的卡片

于 2013-07-27T09:43:55.790 回答
0

我只想:

  • 制作您订购的卡片组(即“包”)
  • 使用有效的洗牌算法从“pack”中制作“deck”
  • 用于deck.pop()从该牌组中取出连续的牌

当你开发你的应用程序时,有一个抽象来表示一副纸牌可能会很有用。现在看起来可能有点矫枉过正,但从长远来看,这是值得的。如果做得好,它也应该可以在其他项目中重复使用。

于 2013-07-27T09:42:46.723 回答
-2

使用删除关键字。

样本:

var x = [1,2,3];
delete x[1]; // delete element '2'
for (i in x) { 
  console.log(x[i]); // outputs 1, 3
}
于 2013-07-27T09:37:52.570 回答