метод сравнения
Ребят подскажите пожалуйста, пишу техасский холдем. Написал уже все комбинации, теперь нужно написать как-то метод сравнения карт всех игроков, с лежащими на столе картами и отсортировать на выходе руки от самой слабой до самой сильной. Гляньте пожалуйста код и подскажите как что я упустил и что нужно сделать чтобы выглядело так:
example 1: Input: 4cKs4h8s7s Ad4s Ac4d As9s KhKd 5d6d Output: Ac4d=Ad4s 5d6d As9s KhKd example 2: Input: 2h3h4h5d8d KdKs 9hJh Output: KdKs 9hJh const suitValue = {'T': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14} class PokerHand { private hand: any; constructor(hand) { this.hand = hand } breakHighCardTie(player, opponent) { const playerHand = this.getFaceValues(player).reverse() const opponentHand = this.getFaceValues(opponent).reverse() for (let i = 0; i < playerHand.length; i++) { if (playerHand[i] > opponentHand[i]) return "win: player1" if (playerHand[i] < opponentHand[i]) return "win: player2" if (i === playerHand.length - 1 && playerHand[i] === opponentHand[i]) return "tie" } } //переводит комбинации в числа "KS AS TS QS JS" => [ 10, 11, 12, 13, 14 ] getFaceValues(hand) { hand = hand.replace(/\s/g, '').split('') const inOrder = [] hand.forEach((value, idx) => { if (idx % 2 === 0) inOrder.push(suitValue[value] || parseInt(value)) }) return inOrder.sort((a, b) => a - b) } straightFlush(hand) { return this.isInOrder(hand) && this.isSameSuit(hand) } fourOfAKind(hand) { const values = this.groupValues(hand) return values.filter(value => { return value === 4 }).length === 1 } fullHouse(hand) { const values = this.groupValues(hand) return values.every(value => { return value === 2 || value === 3 }) } flush(hand) { return this.isSameSuit(hand) } straight(hand) { return this.isInOrder(hand) } threeOfAKind(hand) { const values = this.groupValues(hand) return values.filter(value => { return value === 3 }).length === 1 } twoPair(hand) { const values = this.groupValues(hand) return values.filter(value => { return value === 2 }).length === 2 } onePair(hand) { const values = this.groupValues(hand) return values.filter(value => { return value === 2 }).length === 1 } groupValues(hand) { hand = hand.replace(/\s/g, '').split('') hand = hand.filter((suit, idx) => { return idx % 2 === 0 }) hand = hand.reduce((acc, cur) => { acc[cur] = (acc[cur] || 0) + 1; return acc }, {}) return this.getValues(hand) } //Object.values() getValues(obj) { return Object.keys(obj).map(value => obj[value]) } //Flush isSameSuit(hand) { hand = hand.replace(/\s/g, '').split('') hand = hand.filter((suit, idx) => { return idx % 2 !== 0 }) return hand.every((value) => { return value === hand[0] }) } //Straight isInOrder(hand) { hand = hand.replace(/\s/g, '').split('') const inOrder = [] hand.forEach((value, idx) => { if (idx % 2 === 0) inOrder.push(suitValue[value] || parseInt(value)) }) inOrder.sort((a, b) => a - b) for (let i = 0; i < inOrder.length - 1; i++) { if ((inOrder[i + 1] - inOrder[i]) != 1) return false } return true } } |
Не храни набор карт в виде строки. В конструкторе преобразуй руку в массив объектов - карт [{suit, kind}, ...]. Все методы упростятся.
|
Часовой пояс GMT +3, время: 06:26. |