diff --git a/cmd/main.go b/cmd/main.go index d52b919..7230ff2 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -4,6 +4,7 @@ import ( "fmt" "math/rand" "texas-poker-bk/internal/conf" + "texas-poker-bk/internal/game" "texas-poker-bk/internal/server" "time" ) @@ -20,32 +21,32 @@ func startServer() { } func main() { - startServer() + //startServer() - //public := [5]*game.Card{ - // {Dot: game.Poker10, Suit: game.Club}, - // {Dot: game.Poker6, Suit: game.Spade}, - // {Dot: game.Poker7, Suit: game.Diamond}, - // {Dot: game.Poker5, Suit: game.Heart}, - // {Dot: game.PokerK, Suit: game.Diamond}, - //} - //h1 := [2]*game.Card{ - // {Dot: game.PokerA, Suit: game.Spade}, - // {Dot: game.Poker5, Suit: game.Spade}, - //} - //h2 := [2]*game.Card{ - // {Dot: game.Poker6, Suit: game.Club}, - // {Dot: game.Poker3, Suit: game.Diamond}, - //} - //h3 := [2]*game.Card{ - // {Dot: game.Poker9, Suit: game.Club}, - // {Dot: game.Poker10, Suit: game.Heart}, - //} - //hand1, err := game.AnalyzeMaxHand(h1, public) - //hand2, err := game.AnalyzeMaxHand(h2, public) - //hand3, err := game.AnalyzeMaxHand(h3, public) - //fmt.Println(err, hand1) - //fmt.Println(err, hand2) - //fmt.Println(err, hand3) + public := [5]*game.Card{ + {Dot: game.Poker10, Suit: game.Club}, + {Dot: game.Poker6, Suit: game.Spade}, + {Dot: game.Poker7, Suit: game.Diamond}, + {Dot: game.Poker5, Suit: game.Heart}, + {Dot: game.PokerK, Suit: game.Diamond}, + } + h1 := [2]*game.Card{ + {Dot: game.PokerA, Suit: game.Spade}, + {Dot: game.Poker5, Suit: game.Spade}, + } + h2 := [2]*game.Card{ + {Dot: game.Poker6, Suit: game.Club}, + {Dot: game.Poker3, Suit: game.Diamond}, + } + h3 := [2]*game.Card{ + {Dot: game.Poker9, Suit: game.Club}, + {Dot: game.Poker10, Suit: game.Heart}, + } + hand1, err := game.AnalyzeMaxHand(h1, public) + hand2, err := game.AnalyzeMaxHand(h2, public) + hand3, err := game.AnalyzeMaxHand(h3, public) + fmt.Println(err, hand1) + fmt.Println(err, hand2) + fmt.Println(err, hand3) } diff --git a/internal/game/card.go b/internal/game/card.go index 3557358..2abeecd 100644 --- a/internal/game/card.go +++ b/internal/game/card.go @@ -1,10 +1,19 @@ package game +import ( + "fmt" + "texas-poker-bk/tool/strings" +) + type Card struct { Dot PokerDot // 点数 Suit PokerSuit // 花色 } +func (c *Card) String() string { + return fmt.Sprintf("{%s %s}", strings.FullLeft(c.Dot.String(), 2, " "), c.Suit.Pattern()) +} + // Compare 比较点数和花色 // return (-n: c < c2); (0: c == c2); (+n: c > c2) func (c *Card) Compare(c2 *Card) int { @@ -24,8 +33,13 @@ func (c PokerSuit) String() string { return colors[c] } +func (c PokerSuit) Pattern() string { + return cardPatterns[c] +} + // 常量在编译期就要确定值,只能将一些基本类型声明为常量 var colors = [4]string{"diamond", "club", "heart", "spade"} +var cardPatterns = [4]string{"♦", "♣", "♥", "♠"} var CardColors = [4]string{"D", "C", "H", "S"} const ( diff --git a/internal/game/hand.go b/internal/game/hand.go index 19cc6cc..7fd2f78 100644 --- a/internal/game/hand.go +++ b/internal/game/hand.go @@ -2,6 +2,7 @@ package game import ( "errors" + "fmt" "math" "strconv" ) @@ -50,6 +51,15 @@ func (h *Hand) GetPoint() int { return h.point } +func (h *Hand) String() string { + return fmt.Sprintf("%s(%s)[%d] [%s,%s,%s,%s,%s]", + h.CardType.Name(), + h.CardType.NameZh(), + h.point, + h.cards[0], h.cards[1], h.cards[2], h.cards[3], h.cards[4], + ) +} + type CardType int func (ct CardType) String() string { @@ -152,14 +162,35 @@ func GetCardFace(cards *[5]*Card) [4]int { for _, c := range cards { faceMap[c.Dot]++ } - // 0:单牌个数 1:对子个数 2:三条个数 3四条个数 TODO 将对子三条四条排序到前面 + // 0:单牌个数 1:对子个数 2:三条个数 3四条个数 var face = [4]int{} for dot := range faceMap { face[faceMap[dot]-1]++ } + // 将对子三条四条排序到前面 + for i := 0; i < len(cards); i++ { + for j := i + 1; j < len(cards); j++ { + l, r := faceMap[cards[i].Dot], faceMap[cards[j].Dot] + if l < r || (l == r && cards[i].Dot < cards[j].Dot) { // 同点数牌张数多的 或 张数相同点数大的排到前面 + cards[i], cards[j] = cards[j], cards[i] + } + } + } return face } +// getHighCardPoint 高牌,返回散牌点数 +// max = 4432 = 13<<8 + 13<<6 + 13<<4 + 13<<2 + 12 +// example: (1<<8 + 1<<6 + 13<<4)对2+A < (2<<8 + 2<<6 + 1<<4)对3+2 +func getHighCardPoint(cards [5]*Card) int { + totalPoint := 0 + for i, c := range cards { + // 牌权重降序 + totalPoint += int(c.Dot+1) << (8 - i*2) + } + return totalPoint +} + // isRoyalFlush 皇家同花顺 func isRoyalFlush(cards [5]*Card) bool { return PokerA == cards[0].Dot && isStraight(cards) && isFlush(cards) @@ -217,15 +248,3 @@ func isTwoPairs(face [4]int) bool { func isOnePair(face [4]int) bool { return face[1] > 0 } - -// getHighCardPoint 高牌,返回散牌点数 -// max = 4432 = 13<<8 + 13<<6 + 13<<4 + 13<<2 + 12 -// example: (1<<8 + 1<<6 + 13<<4)对2+A < (2<<8 + 2<<6 + 1<<4)对3+2 -func getHighCardPoint(cards [5]*Card) int { - totalPoint := 0 - for i, c := range cards { - // 牌权重降序 - totalPoint += int(c.Dot+1) << (8 - i*2) - } - return totalPoint -} diff --git a/tool/strings/strings.go b/tool/strings/strings.go new file mode 100644 index 0000000..80e0e46 --- /dev/null +++ b/tool/strings/strings.go @@ -0,0 +1,8 @@ +package strings + +func FullLeft(origin string, fullLen int, full string) string { + for i := len(origin); i < fullLen; i += len(full) { + origin += full + } + return origin +}