JavaScript shuffling deck所以没有三个相同的西装

时间:2017-06-02 17:37:55

标签: javascript arrays string search

我有一个家庭作业,在那里我创建了一副扑克牌,作为奖励,我将它们随机化。我们应该将它们随机化,以便连续三张牌都没有相同的套装。我使用Fisher-Yates方法将它们随机化。

它大部分时间都有效,但仍有可能三张牌可以连续使用同一套牌。

如何运行一个循环并连续扫描三张卡片以查看它们是否相同,如果它是真的,我可以再次运行我的随机函数吗?

这是我的代码:

var suits = ["Hearts", "Diamonds", "Spades", "Clovers"];
var faces = ["Ace", 2, 3, 4, 5, 6, 7, 8, 9, 10, "Jack", "Queen", "Kings", "Joker"]
var a = " of "
var deck = [];
var temp = null;

//Looping through arrays, combining faces to each suit
//Faces is length-1 to not insert all jokers
for (i = 0; i < suits.length; i++) {
  for (j = 0; j < faces.length-1; j++) {
    //Looping through each of the suits
    deck.push(faces[j] + a + suits[i])
  }
}
//Inserting 1 joker to the deck
deck.push(faces[13])
console.log(deck)

//Shuffle the deck, using Fisher-Yates shuffle
//Researched from Frank Mitchell: https://www.frankmitchell.org/2015/01/fisher-yates/

for (k = deck.length - 1; k > 0; k -= 1) {
  m = Math.floor(Math.random() * (k + 1))
  temp = deck[k]
  deck[k] = deck[m]
  deck[m] = temp
}

console.log("^^^^^^^^^^^^^^^^^^^^^")
console.log("---Shuffling Deck----")
console.log("vvvvvvvvvvvvvvvvvvvvv")
console.log(deck)

注意:我猜的最好,我知道它需要更多的进程是为每个套装类型做一个for循环(运行这个搜索循环四次),然后使用indexOf(suit [i]),但那么如何将它与deck [i + 1]和[i + 2]进行比较?如何创建我正在寻找的套装的比较,以及套牌中的套装?

此外,卡元素在阵列中命名:&#34;钻石王牌&#34;,&#34;黑桃&#34;

1 个答案:

答案 0 :(得分:2)

您可能会发现将每张卡表示为对象{Suit:'Hearts', Face:'Ace'}更容易。这样您就可以轻松确定卡片的哪种套装,而无需进行字符串操作。如果您很难要求使用字符串来表示卡片,那么您可以使用正则表达式在您的exapmle中of之后提取单词。

在寻找3件相同的西装方面,你不需要独立寻找每件西装。只需一次看一张卡片,看看它的套装是否与i-1i-2相匹配(当然要注意第一张卡片。)