UNPKG

@alexjamesmalcolm/poker-odds-machine

Version:
181 lines 7.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.evaluate = void 0; const types_1 = require("./types"); const util_1 = require("./util"); function evaluate(cardGroup) { cardGroup.sortDesc(); // group by rank const rankCount = cardGroup.countBy('rank'); const quadRanks = []; const tripRanks = []; const pairRanks = []; let straightCardsCount = 0; let straightMaxCardRank = 0; let straightLastCardRank = 0; const allRanks = Object.keys(rankCount).reverse(); for (const rank of allRanks) { if (rankCount[rank] === 2) { pairRanks.push(Number(rank)); } else if (rankCount[rank] === 3) { tripRanks.push(Number(rank)); } else if (rankCount[rank] === 4) { quadRanks.push(Number(rank)); } if (straightCardsCount < 5) { if (straightLastCardRank && straightLastCardRank - 1 === Number(rank)) { straightCardsCount++; straightLastCardRank = Number(rank); } else { straightMaxCardRank = straightLastCardRank = Number(rank); straightCardsCount = 1; } } } // group by suit const suitCount = cardGroup.countBy('suit'); let flushSuit = 0; for (const suit in suitCount) { if (suitCount[suit] >= 5) { flushSuit = Number(suit); break; } } // straight flush if (flushSuit) { if (straightCardsCount === 5) { const straightFlushCards = cardGroup.cards.filter((card) => card.suit === flushSuit && card.rank <= straightMaxCardRank); if (straightFlushCards.length >= 5) { let index = 0; let count = 1; let isStraightFlush = false; for (let i = 1; i < straightFlushCards.length; i++) { if (straightFlushCards[i].rank !== straightFlushCards[i - 1].rank - 1) { index = i; count = 1; } else { count++; } if (count === 5) { isStraightFlush = true; break; } } if (isStraightFlush) return { handRank: types_1.HandRanks.straightFlush, hand: new types_1.CardGroup(straightFlushCards.slice(index, index + 5)), }; } } else if (straightCardsCount === 4 && straightMaxCardRank === types_1.Ranks.five) { const aceCards = cardGroup.cards.filter((card) => card.suit === flushSuit && card.rank === types_1.Ranks.ace); if (aceCards.length > 0) { const straightFlushCards = cardGroup.cards.filter((card) => card.suit === flushSuit && card.rank <= straightMaxCardRank); if (straightFlushCards.length === 4) return { handRank: types_1.HandRanks.straightFlush, hand: new types_1.CardGroup(straightFlushCards.concat(aceCards[0]).slice(0, 5)), }; } } } // quads if (quadRanks.length >= 1) { const quadCards = cardGroup.cards.filter((card) => card.rank === quadRanks[0]); const otherCards = cardGroup.cards.filter((card) => card.rank !== quadRanks[0]); return { handRank: types_1.HandRanks.quads, hand: new types_1.CardGroup(quadCards.concat(otherCards).slice(0, 5)), }; } // full house if (tripRanks.length === 1 && pairRanks.length >= 1) { const tripCards = cardGroup.cards.filter((card) => card.rank === tripRanks[0]); const pairCards = cardGroup.cards.filter((card) => card.rank === pairRanks[0]); return { handRank: types_1.HandRanks.fullHouse, hand: new types_1.CardGroup(tripCards.concat(pairCards)), }; } else if (tripRanks.length > 1) { const tripCards = cardGroup.cards.filter((card) => card.rank === tripRanks[0]); const pairCards = cardGroup.cards.filter((card) => card.rank === tripRanks[1]); return { handRank: types_1.HandRanks.fullHouse, hand: new types_1.CardGroup(tripCards.concat(pairCards.slice(0, 2))), }; } // flush if (flushSuit) { const flushCards = cardGroup.cards.filter((card) => card.suit === flushSuit); return { handRank: types_1.HandRanks.flush, hand: new types_1.CardGroup(flushCards.slice(0, 5)), }; } // straight if (straightCardsCount === 5) { const straightCards = util_1.uniqWith(cardGroup.cards.filter((card) => card.rank <= straightMaxCardRank), (c1, c2) => c1.rank === c2.rank); return { handRank: types_1.HandRanks.straight, hand: new types_1.CardGroup(straightCards.slice(0, 5)), }; } else if (straightCardsCount === 4 && straightMaxCardRank === types_1.Ranks.five) { const aceCards = cardGroup.cards.filter((card) => card.rank === types_1.Ranks.ace); if (aceCards.length > 0) { const straightCards = util_1.uniqWith(cardGroup.cards.filter((card) => card.rank <= straightMaxCardRank), (c1, c2) => c1.rank === c2.rank); return { handRank: types_1.HandRanks.straight, hand: new types_1.CardGroup(straightCards.concat(aceCards[0]).slice(0, 5)), }; } } // trips if (tripRanks.length === 1) { const tripCards = cardGroup.cards.filter((card) => card.rank === tripRanks[0]); const cards = cardGroup.cards.filter((card) => card.rank !== tripRanks[0]); return { handRank: types_1.HandRanks.trips, hand: new types_1.CardGroup(tripCards.concat(cards).slice(0, 5)), }; } // two pair if (pairRanks.length >= 2) { const pairedHigherCards = cardGroup.cards.filter((card) => card.rank === pairRanks[0]); const pairedLowerCards = cardGroup.cards.filter((card) => card.rank === pairRanks[1]); const unpairedCards = cardGroup.cards.filter((card) => card.rank !== pairRanks[0] && card.rank !== pairRanks[1]); return { handRank: types_1.HandRanks.twoPair, hand: new types_1.CardGroup(pairedHigherCards .concat(pairedLowerCards) .concat(unpairedCards) .slice(0, 5)), }; } // one pair if (pairRanks.length === 1) { const pairedCards = cardGroup.cards.filter((card) => card.rank === pairRanks[0]); const unpairedCards = cardGroup.cards.filter((card) => card.rank !== pairRanks[0]); return { handRank: types_1.HandRanks.pair, hand: new types_1.CardGroup(pairedCards.concat(unpairedCards).slice(0, 5)), }; } // high card return { handRank: types_1.HandRanks.highCard, hand: new types_1.CardGroup(cardGroup.cards.slice(0, 5)), }; } exports.evaluate = evaluate; //# sourceMappingURL=evaluate.js.map