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  }