Ребят подскажите пожалуйста, пишу техасский холдем. Написал уже все комбинации, теперь нужно написать как-то метод сравнения карт всех игроков, с лежащими на столе картами и отсортировать на выходе руки от самой слабой до самой сильной. Гляньте пожалуйста код и подскажите как что я упустил и что нужно сделать чтобы выглядело так:
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
}
}