283 lines
4.8 KiB
Go
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())
|
|
}
|