From cd2dc2854ec54026d093c05cb6241635bd1c0518 Mon Sep 17 00:00:00 2001 From: James Brumond Date: Fri, 18 Mar 2022 19:16:15 -0700 Subject: [PATCH] working on hand evaluation --- src/hand.ts | 129 +++++++++++++++++++++++++++++++++++++++++++++++---- src/index.ts | 1 + 2 files changed, 121 insertions(+), 9 deletions(-) diff --git a/src/hand.ts b/src/hand.ts index c5e4921..cd8e85b 100644 --- a/src/hand.ts +++ b/src/hand.ts @@ -1,14 +1,125 @@ import { Card } from './cards'; +import { Suit } from './suits'; +import { Rank, standard } from './ranks'; -export class Hand extends Array { - public sortBySuit() { - // this.sort((a, b) => { - // // - // }); - } +export const pokerRanking = ranking([ + standard.ace, + standard.two, + standard.three, + standard.four, + standard.five, + standard.six, + standard.seven, + standard.eight, + standard.nine, + standard.ten, + standard.jack, + standard.queen, + standard.king, + standard.ace, +]); - public sortByRank() { - // - } +export interface EvaluateHandsOpts { + ranking?: Map; + wrapRanking?: boolean; + // TODO: Wild-card evaluation + wildCards?: null; + minSizes?: { + sameRank?: number; + sameSuit?: number; + sameSuitRuns?: number; + runs?: number; + }; +} + +export interface EvaluateHandsResult { + highCard: Card; + sameRank: Card[][]; + sameSuit: Card[][]; + sameSuitRuns: Card[][]; + runs: Card[][]; +} + +export function evaluatePossiblePokerHands(cards: Card[], wildCards?: null) { + return evaluatePossibleHands(cards, { + ranking: pokerRanking, + wrapRanking: false, + wildCards: wildCards, + minSizes: { + sameRank: 2, + sameSuit: 5, + sameSuitRuns: 5, + runs: 5 + } + }); +} + +export function evaluatePossibleHands(cards: Card[], opts: EvaluateHandsOpts = { }) : EvaluateHandsResult { + const byRank: Map = new Map(); + const bySuit: Map = new Map(); + + const minSizes = Object.assign({ + sameRank: 2, + sameSuit: 5, + sameSuitRuns: 5, + runs: 5, + }, opts.minSizes || { }); + + const runs: Card[][] = findRuns(cards, minSizes.runs); + const sameRank: Card[][] = [ ]; + const sameSuit: Card[][] = [ ]; + const sameSuitRuns: Card[][] = [ ]; + + cards.forEach((card) => { + if (byRank.has(card.rank)) { + byRank.get(card.rank).push(card); + } + + else { + const cards = [ card ]; + byRank.set(card.rank, cards); + sameRank.push(cards); + } + + if (bySuit.has(card.suit)) { + bySuit.get(card.suit).push(card); + } + + else { + const cards = [ card ]; + bySuit.set(card.suit, cards); + sameSuit.push(cards); + } + }); + + sameSuit.forEach((suitCards) => { + sameSuitRuns.push(...findRuns(suitCards, minSizes.sameSuitRuns)); + }); + + return { + highCard: findHighCard(cards, opts.ranking), + sameRank: sameRank.filter((cards) => cards.length >= minSizes.sameRank), + sameSuit: sameSuit.filter((cards) => cards.length >= minSizes.sameSuit), + sameSuitRuns, + runs + }; +} + +function findHighCard(cards: Card[], ranking: Map) : Card { + // +} + +function findRuns(cards: Card[], minLength: number) : Card[][] { + // +} + +function ranking(ranks: Rank[]) { + const rankingMap = new Map(); + + // ranks.forEach((rank, index) => { + // rankingMap.set(rank, ) + // }) + + return rankingMap; } diff --git a/src/index.ts b/src/index.ts index b3858ec..53aef32 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ export * from './shuffle'; export * from './cards'; +export * from './hand'; export * as decks from './decks'; export * as ranks from './ranks'; export * as suits from './suits';