У меня есть домашнее задание, где я создаю пакет игральных карт, и в качестве бонуса я их произвожу. Мы должны рандомизировать их так, чтобы ни одна из трех карт подряд не имела такой же масти. Я их рандомизировал с использованием метода Фишера-Йейтса.
Он работает большую часть времени, но есть еще шанс, что три карты могут иметь один и тот же костюм подряд.
Как я могу запустить цикл и проверить три карты в строке, чтобы убедиться, что они одинаковые, так что, если это правда, я могу снова запустить функцию рандомизации?
Вот мой код:
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 (подходит [i]), но тогда как сравниваю ли это с колодой [i + 1] и [i + 2]? Как мне создать сравнение костюма, который я ищу, и костюм в колоде?
Кроме того, элементы карты называются в массиве: "Ace of Diamonds", "5 of Spades",
Вам может быть проще представить каждую карту как объект {Suit:'Hearts', Face:'Ace'}
. Это позволит вам легко определить, какой костюм для карты, без необходимости выполнять строковые манипуляции. Если у вас есть жесткое требование использовать строки для представления карт, вы можете просто использовать регулярное выражение для извлечения слова после of
вы закончили.
С точки зрения поиска 3 одинаковых костюмов, вам не нужно искать каждый костюм самостоятельно. Просто взгляните на одну карту за раз и посмотрите, соответствует ли ее костюм костюму i-1
и i-2
(при этом, конечно, помните о первых картах).