8

我正在尝试创建一个 JavaScript 纸牌游戏,并希望不重复地挑选 5 张牌:

var colors = ["hearts", "spades", "diamonds", "clubs" ];
var values = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];

color = colors[parseInt(Math.random()*colors.length,10)]
value = values[parseInt(Math.random()*values.length,10)]

如果我选择了 5 张牌,如何确保没有重复?

4

3 回答 3

10

准备所有 48 张牌的数组(你缺少 A 吗?)

每次选择一张卡片时,将其从阵列中移除。

下一次抽奖将来自缩减后的数组,因此不能有重复。

选择:

从同一个数组开始,然后随机播放。拿前五张牌。

于 2013-09-19T11:55:15.533 回答
3

您还可以创建一个标记列表,将已使用的卡片放入其中!

var myGivenCards = {}

对每张卡片重复一遍:

color = colors[parseInt(Math.random()*colors.length,10)]
value = values[parseInt(Math.random()*values.length,10)]
if (typeof(myGivenCards[color+values])==='undefined') {
  //not used
  myGivenCards[color+values] = true;
}
于 2013-09-19T12:03:25.180 回答
2

正如其他人所说,使用 Fisher-Yates-Shuffle,然后选择前五个:

 var colors = ["hearts", "spades", "diamonds", "clubs"];
 var values = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];

 // from http://jsfromhell.com/array/shuffle by Jonas Raoni Soares Silva
 function shuffle(o) { //v1.0
     for (var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
     return o;
 };

 var cards = [];
 for (var j = 0; j < colors.length; j++) {
     for (var i = 0; i < values.length; i++) {
         cards.push(colors[j] + values[i]);
     }
 }
 shuffle(cards);
 console.log(cards.slice(0, 5));
于 2013-09-19T12:11:45.977 回答