【问题标题】:JavaScript shuffling deck so no three same suitJavaScript 洗牌,所以没有三个相同的花色
【发布时间】:2017-06-02 17:37:54
【问题描述】:

我有一个家庭作业,我在其中创建一副扑克牌,作为奖励,我将它们随机化。我们应该将它们随机化,这样连续的三张牌就不会有相同的花色。我使用 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(suits[i]),但是我如何将它与deck[i + 1] 和[i + 2] 进行比较?如何比较我正在寻找的套装和套牌中的套装?

此外,卡片元素在数组中命名:“Ace of Diamonds”、“5 of Spades”

【问题讨论】:

    标签: javascript arrays string search


    【解决方案1】:

    您可能会发现将每张卡片表示为对象{Suit:'Hearts', Face:'Ace'} 更容易。这将使您无需进行字符串操作即可轻松确定卡片的花色。如果您有硬性要求使用字符串来表示卡片,您可以使用正则表达式在您的示例中提取 of 之后的单词。

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

    【讨论】:

    • 所以我正在处理将它们作为字符串的要求。如何在每个 ' of ' 之后提取子字符串?
    • @as.beaulieu,我认为“如何提取子字符串”已在上面得到解答。 (使用正则表达式。)如果遇到问题,您应该尝试并更具体地询问您的难点,可能是在一个单独的更集中的问题中。
    • 为什么不把数据当作对象而不是字符串来处理,然后由于字符串的要求,最后只将它们作为字符串返回?
    • 如何将正则表达式与变量一起使用?我认为我还会使用 * 符号在整个字符串中搜索某个子字符串吗?它会是像 suit[i]* 这样的东西吗?
    • @as.beaulieu 对于正则表达式,我会在一个单独的问题中提出这个问题,但对于后代"4 of Hearts".replace(/(.*?) of (.*)/,'$2') 返回"Hearts"。但是使用对象进行遍历并且只在最后做字符串可能会更好,因为它可以让你不必多次评估正则表达式(这可能很昂贵)。
    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 2017-01-03
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多