2025-06-04 09:51:39 +08:00

283 lines
4.8 KiB
Go

package poker
import (
"fmt"
"math/rand"
"samba/proto"
"strings"
"time"
"unicode/utf8"
)
func init() {
rand.Seed(time.Now().UnixNano())
}
// 1:第一副牌 2:第二副牌
type Ext int
const (
Ext1 Ext = 1 // 第一副牌
Ext2 Ext = 2 // 第二副牌
)
func (c Ext) String() string {
switch c {
case Ext1:
return "1"
case Ext2:
return "2"
default:
return "unknown"
}
}
type Color int
const (
ColorUnknown Color = 0
Spade Color = 1 // 黑
Heart Color = 2 // 红
Club Color = 3 // 梅
Diamond Color = 4 // 方
)
func (c Color) String() string {
switch c {
case Spade:
return "♠"
case Heart:
return "♥"
case Club:
return "♣"
case Diamond:
return "◆"
default:
return "unknown"
}
}
func (c Color) Int() int { return int(c) }
type Point int
const (
PointUnknown Point = 0
PointA Point = 1
Point2 Point = 2
Point3 Point = 3
Point4 Point = 4
Point5 Point = 5
Point6 Point = 6
Point7 Point = 7
Point8 Point = 8
Point9 Point = 9
Point10 Point = 10
PointJ Point = 11
PointQ Point = 12
PointK Point = 13
PointMinJoker Point = 14
PointMaxJoker Point = 15
)
func (p Point) String() string {
switch p {
case PointA:
return "A"
case Point2:
return "2"
case Point3:
return "3"
case Point4:
return "4"
case Point5:
return "5"
case Point6:
return "6"
case Point7:
return "7"
case Point8:
return "8"
case Point9:
return "9"
case Point10:
return "10"
case PointJ:
return "J"
case PointQ:
return "Q"
case PointK:
return "K"
case PointMinJoker:
return "MinJoker"
case PointMaxJoker:
return "MaxJoker"
default:
return "unknown"
}
}
func (p Point) Int() int { return int(p) }
type Poker struct {
Color Color // 花色
Point Point // 点数
Ext Ext // 第几副牌
}
func NewPoker(value int) *Poker {
pointColor := value % 1000
e := Ext(value / 1000)
return &Poker{Color: Color(pointColor / 100), Point: Point(pointColor % 100), Ext: e}
}
func NewPokerEx(c Color, p Point, e Ext) *Poker {
return &Poker{c, p, e}
}
func (p *Poker) ToInt() int {
return int(p.Ext)*1000 + int(p.Color*100) + int(p.Point)
}
// value会因为玩法规则导致不同牌的value一样
func (p *Poker) ToValue() int {
c := int(Diamond * 100)
if p.Color == Spade || p.Color == Club {
c = int(Spade * 100)
}
return c + int(p.Point)
}
func (p *Poker) ToString() string {
if p.Point != PointMinJoker && p.Point != PointMaxJoker {
return p.Ext.String() + p.Color.String() + p.Point.String()
//return p.Color.String() + p.Point.String()
} else {
return p.Point.String()
}
}
func PokersToString(pokers []*Poker) string {
s := ""
if len(pokers) == 0 {
return s
}
s = pokers[0].ToString()
for i := 1; i < len(pokers); i++ {
s += " " + pokers[i].ToString()
}
return s
}
// ♠4 ♥J ♥K ♣2 ♣3 ♣5 ♣7 ♣J ♣J
func StringToPoker(s string) *Poker {
var c Color
var p Point
_, size := utf8.DecodeRuneInString(s)
switch s[:size] {
case "♠":
c = Spade
case "♥":
c = Heart
case "♣":
c = Club
case "◆":
c = Diamond
}
switch s[size:] {
case "A":
p = PointA
case "2":
p = Point2
case "3":
p = Point3
case "4":
p = Point4
case "5":
p = Point5
case "6":
p = Point6
case "7":
p = Point7
case "8":
p = Point8
case "9":
p = Point9
case "10":
p = Point10
case "J":
p = PointJ
case "Q":
p = PointQ
case "K":
p = PointK
}
return NewPokerEx(c, p, Ext1)
}
func StringToPokers(s string) []*Poker {
var pokers []*Poker
parts := strings.Split(s, " ")
for _, part := range parts {
if part == "" {
continue
}
pokers = append(pokers, StringToPoker(part))
}
return pokers
}
func HandPokersToPokers(handPoker proto.CachetaHandPoker) []*Poker {
var pk []*Poker
for _, g := range handPoker.Groups {
for _, p := range g.Pokers {
pk = append(pk, NewPoker(p))
}
}
for _, p := range handPoker.Pokers {
pk = append(pk, NewPoker(p))
}
return pk
}
func HandPokersToString(handPoker proto.CachetaHandPoker) string {
var gp []*Poker
gStr := ""
for _, g := range handPoker.Groups {
gp = gp[:0]
for _, p := range g.Pokers {
gp = append(gp, NewPoker(p))
}
gStr += PokersToString(gp) + " "
}
gp = gp[:0]
for _, p := range handPoker.Pokers {
gp = append(gp, NewPoker(p))
}
hStr := PokersToString(gp) + " "
str := ""
if gStr != "" {
str += "组合:" + gStr + " "
}
if hStr != "" {
str += "散牌:" + hStr
}
return str
}
func GroupsHighPokersToString(wildPoker *Poker, groups []*GroupPokers, highPokers []*Poker) string {
gStr := ""
for _, g := range groups {
gStr += PokersToString(g.Pokers) + " "
}
hStr := PokersToString(highPokers) + " "
str := ""
if gStr != "" {
str += "组合:" + gStr + " "
}
if hStr != "" {
str += "散牌:" + hStr
}
return fmt.Sprintf("%s 万能牌:%s", str, wildPoker.ToString())
}