Browse Source

card fight bugfix

master
tangmingyou 4 years ago
parent
commit
a4480a9dcb
  1. 53
      cmd/main.go
  2. 14
      internal/game/card.go
  3. 45
      internal/game/hand.go
  4. 8
      tool/strings/strings.go

53
cmd/main.go

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"math/rand" "math/rand"
"texas-poker-bk/internal/conf" "texas-poker-bk/internal/conf"
"texas-poker-bk/internal/game"
"texas-poker-bk/internal/server" "texas-poker-bk/internal/server"
"time" "time"
) )
@ -20,32 +21,32 @@ func startServer() {
} }
func main() { func main() {
startServer() //startServer()
//public := [5]*game.Card{ public := [5]*game.Card{
// {Dot: game.Poker10, Suit: game.Club}, {Dot: game.Poker10, Suit: game.Club},
// {Dot: game.Poker6, Suit: game.Spade}, {Dot: game.Poker6, Suit: game.Spade},
// {Dot: game.Poker7, Suit: game.Diamond}, {Dot: game.Poker7, Suit: game.Diamond},
// {Dot: game.Poker5, Suit: game.Heart}, {Dot: game.Poker5, Suit: game.Heart},
// {Dot: game.PokerK, Suit: game.Diamond}, {Dot: game.PokerK, Suit: game.Diamond},
//} }
//h1 := [2]*game.Card{ h1 := [2]*game.Card{
// {Dot: game.PokerA, Suit: game.Spade}, {Dot: game.PokerA, Suit: game.Spade},
// {Dot: game.Poker5, Suit: game.Spade}, {Dot: game.Poker5, Suit: game.Spade},
//} }
//h2 := [2]*game.Card{ h2 := [2]*game.Card{
// {Dot: game.Poker6, Suit: game.Club}, {Dot: game.Poker6, Suit: game.Club},
// {Dot: game.Poker3, Suit: game.Diamond}, {Dot: game.Poker3, Suit: game.Diamond},
//} }
//h3 := [2]*game.Card{ h3 := [2]*game.Card{
// {Dot: game.Poker9, Suit: game.Club}, {Dot: game.Poker9, Suit: game.Club},
// {Dot: game.Poker10, Suit: game.Heart}, {Dot: game.Poker10, Suit: game.Heart},
//} }
//hand1, err := game.AnalyzeMaxHand(h1, public) hand1, err := game.AnalyzeMaxHand(h1, public)
//hand2, err := game.AnalyzeMaxHand(h2, public) hand2, err := game.AnalyzeMaxHand(h2, public)
//hand3, err := game.AnalyzeMaxHand(h3, public) hand3, err := game.AnalyzeMaxHand(h3, public)
//fmt.Println(err, hand1) fmt.Println(err, hand1)
//fmt.Println(err, hand2) fmt.Println(err, hand2)
//fmt.Println(err, hand3) fmt.Println(err, hand3)
} }

14
internal/game/card.go

@ -1,10 +1,19 @@
package game package game
import (
"fmt"
"texas-poker-bk/tool/strings"
)
type Card struct { type Card struct {
Dot PokerDot // 点数 Dot PokerDot // 点数
Suit PokerSuit // 花色 Suit PokerSuit // 花色
} }
func (c *Card) String() string {
return fmt.Sprintf("{%s %s}", strings.FullLeft(c.Dot.String(), 2, " "), c.Suit.Pattern())
}
// Compare 比较点数和花色 // Compare 比较点数和花色
// return (-n: c < c2); (0: c == c2); (+n: c > c2) // return (-n: c < c2); (0: c == c2); (+n: c > c2)
func (c *Card) Compare(c2 *Card) int { func (c *Card) Compare(c2 *Card) int {
@ -24,8 +33,13 @@ func (c PokerSuit) String() string {
return colors[c] return colors[c]
} }
func (c PokerSuit) Pattern() string {
return cardPatterns[c]
}
// 常量在编译期就要确定值,只能将一些基本类型声明为常量 // 常量在编译期就要确定值,只能将一些基本类型声明为常量
var colors = [4]string{"diamond", "club", "heart", "spade"} var colors = [4]string{"diamond", "club", "heart", "spade"}
var cardPatterns = [4]string{"♦", "♣", "♥", "♠"}
var CardColors = [4]string{"D", "C", "H", "S"} var CardColors = [4]string{"D", "C", "H", "S"}
const ( const (

45
internal/game/hand.go

@ -2,6 +2,7 @@ package game
import ( import (
"errors" "errors"
"fmt"
"math" "math"
"strconv" "strconv"
) )
@ -50,6 +51,15 @@ func (h *Hand) GetPoint() int {
return h.point 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 type CardType int
func (ct CardType) String() string { func (ct CardType) String() string {
@ -152,14 +162,35 @@ func GetCardFace(cards *[5]*Card) [4]int {
for _, c := range cards { for _, c := range cards {
faceMap[c.Dot]++ faceMap[c.Dot]++
} }
// 0:单牌个数 1:对子个数 2:三条个数 3四条个数 TODO 将对子三条四条排序到前面 // 0:单牌个数 1:对子个数 2:三条个数 3四条个数
var face = [4]int{} var face = [4]int{}
for dot := range faceMap { for dot := range faceMap {
face[faceMap[dot]-1]++ 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 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 皇家同花顺 // isRoyalFlush 皇家同花顺
func isRoyalFlush(cards [5]*Card) bool { func isRoyalFlush(cards [5]*Card) bool {
return PokerA == cards[0].Dot && isStraight(cards) && isFlush(cards) 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 { func isOnePair(face [4]int) bool {
return face[1] > 0 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
}

8
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
}
Loading…
Cancel
Save