Задать вопрос
vovvkka
@vovvkka

Как проверить, что набор карт образует покерную комбинацию «стрит»?

Создаю приложение покер, нужно определять текущую комбинацию из карт, я определил все кроме одной - стрит.
Прочитать подробнее про эту комбинацию, можете перейдя по ссылке и пролистнув немного вниз.

У меня есть идея как это сделать, допустим приходит массив (всегда строковый):

const ranks = ['5', '9', '6', '7', '8']

Я отсортирую и получу массив ['5', '6', '7', '8', '9'].
Думал, что могу использовать по типу такого: if (ranks[1] === ranks[0] + 1).
Но, к строкам он будет просто добавлять + 1, и проверка будет всегда выдавать false.

Как это реализовать?

Второе, в картах есть и валет дама король туз, а карты генерируются у меня случайно, допустим пришло:

const ranks = ['10', 'j', 'q', 'k', 'a'] // j - валет, q - дама, k - король, a - туз

Это стрит, но как проверять последовательность?
  • Вопрос задан
  • 150 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Сделать вспомогательный объект, где для нечисловых карт будут указываться их числовые эквиваленты. Массив карт превратить в массив соответствующих им чисел (карты используется как ключ для извлечения значения из объекта, если ничего не найдено, то карта приводится к числу); отсортировать массив; убедиться, что разность соседних значений всегда составляет единицу.

const weights = {
  j: 11,
  q: 12,
  k: 13,
  a: 14,
};

const isStraight = hand => hand
  .map(n => weights[n] ?? +n)
  .sort((a, b) => a - b)
  .every((n, i, a) => !i || (n - a[i - 1] === 1));
Ответ написан
Комментировать
Anopeng
@Anopeng
Веб-программист, учу фронт и бек
А почему используешь строки для запоминания карт? JS - динамически-типизированный язык, приведение типов происходит автоматически. Так что, правильнее тут будет заменить все строки на числа.
К решению:

1. Я описал выше. И прибавление само будет совершаться правильно

2.
1) Вместо букв используй "цену" карты: j = 11, q = 12, k = 13, a = 14
2) При выводе заменяй числа на буквы
const ranks = [10, 11, 12, 13, 14]; // 10, j, q, k, a
const readableRank = r => r > 10 ? [ 'j', 'q', 'k', 'a' ][r - 11] : r;

// Где-то вывод последовательности (например):
const result = ranks.map(readableRank);
// .map() вызывает функцию для каждого элемента массива и создает новый из результатов
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
hahenty
@hahenty
('•')
'2,3,4,5,6,7,8,9,10,j,q,k,a'.indexOf( ['10', 'j', 'q', 'k', 'a'].join() ) > -1;

'2,3,4,5,6,7,8,9,10,j,q,k,a'.indexOf( ['7', '8', '9', '10', 'j'].join() ) > -1;

'2,3,4,5,6,7,8,9,10,j,q,k,a'.indexOf( ['9', '10', 'j', 'q', 'k'].join() ) > -1;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы