JavaScript тасует колоду, поэтому нет трех одинаковых костюмов

1

У меня есть домашнее задание, где я создаю пакет игральных карт, и в качестве бонуса я их произвожу. Мы должны рандомизировать их так, чтобы ни одна из трех карт подряд не имела такой же масти. Я их рандомизировал с использованием метода Фишера-Йейтса.

Он работает большую часть времени, но есть еще шанс, что три карты могут иметь один и тот же костюм подряд.

Как я могу запустить цикл и проверить три карты в строке, чтобы убедиться, что они одинаковые, так что, если это правда, я могу снова запустить функцию рандомизации?

Вот мой код:

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",

Теги:
string
arrays
search

1 ответ

2
Лучший ответ

Вам может быть проще представить каждую карту как объект {Suit:'Hearts', Face:'Ace'}. Это позволит вам легко определить, какой костюм для карты, без необходимости выполнять строковые манипуляции. Если у вас есть жесткое требование использовать строки для представления карт, вы можете просто использовать регулярное выражение для извлечения слова после of вы закончили.

С точки зрения поиска 3 одинаковых костюмов, вам не нужно искать каждый костюм самостоятельно. Просто взгляните на одну карту за раз и посмотрите, соответствует ли ее костюм костюму i-1 и i-2 (при этом, конечно, помните о первых картах).

  • 0
    Так что я имею дело с требованием иметь их в виде строк. Как мне извлечь подстроку после каждого 'of'?
  • 0
    @ as.beaulieu, я думаю, "как мне извлечь подстроку" ответили выше. (Используйте регулярное выражение.) Вы должны попробовать это и спросить более конкретно о своей проблеме, если у вас возникли проблемы, возможно, в отдельном, более сфокусированном вопросе.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню