github.com/jefffederman/gophe@v0.0.0-20221203163656-b38beff92772/evaluator.go (about) 1 /* 2 Package gophe implements a Texas-Holdem Poker Hand Evaluator based 3 on HenryRLee's implementation using a Perfect Hash Algoritihim. It 4 currently handles hands of 5-7 cards, and uses pre-computed hash tables 5 (I reformatted HenryRLee's into go files) to evaluate hands extremely fast. 6 */ 7 package gophe 8 9 func hashQuinary(q [13]byte, size uint8) int { 10 sum := 0 11 for i, v := range q { 12 sum += int(dp[v][12-i][size]) 13 size -= v 14 if size == 0 { 15 break 16 } 17 } 18 return sum 19 } 20 21 func EvaluateHand(h Hand) Rank { 22 if suits[h.getSuitHash()] > 0 { 23 return Rank{flush[h.getSuitBinary()[suits[h.getSuitHash()]-1]]} 24 } 25 hash := hashQuinary(h.getQuinary(), h.Size()) 26 switch h.Size() { 27 case 5: 28 return Rank{noflush5[hash]} 29 case 6: 30 return Rank{noflush6[hash]} 31 case 7: 32 return Rank{noflush7[hash]} 33 } 34 return Rank{noflush5[hash]} 35 } 36 37 func EvaluateCards(cards ...Card) Rank { 38 h := NewHand() 39 for _, v := range cards { 40 h.ModifyHand(v) 41 } 42 return EvaluateHand(*h) 43 }