扑克手牌实现

This commit is contained in:
kercylan98 2023-06-21 20:03:26 +08:00
parent 13d5d2e7dc
commit 789abc065a
2 changed files with 87 additions and 4 deletions

View File

@ -1,12 +1,62 @@
package builtin
func NewPoker() {
import "github.com/kercylan98/minotaur/utils/maths"
func NewPoker[PlayerID comparable](pile *PokerCardPile, options ...PokerOption[PlayerID]) *Poker[PlayerID] {
poker := &Poker[PlayerID]{
pile: pile,
handCards: map[PlayerID][][]PokerCard{},
}
for _, option := range options {
option(poker)
}
return poker
}
type Poker struct {
type Poker[PlayerID comparable] struct {
pile *PokerCardPile
comparePoint map[PokerPoint]int
compareColor map[PokerColor]int
handCards map[PlayerID][][]PokerCard
}
func (slf *Poker) Generate() {
// HandCard 获取玩家特定索引的手牌组
func (slf *Poker[PlayerID]) HandCard(playerId PlayerID, index int) []PokerCard {
return slf.handCards[playerId][index]
}
// HandCards 获取玩家所有手牌
// - 获取结果为多份手牌
func (slf *Poker[PlayerID]) HandCards(playerId PlayerID) [][]PokerCard {
return slf.handCards[playerId]
}
// HandCardGroupCount 获取玩家共有多少副手牌
func (slf *Poker[PlayerID]) HandCardGroupCount(playerId PlayerID) int {
return len(slf.handCards[playerId])
}
// GetPile 获取牌堆
func (slf *Poker[PlayerID]) GetPile() *PokerCardPile {
return slf.pile
}
// Compare 比较两张扑克牌大小
func (slf *Poker[PlayerID]) Compare(card1 PokerCard, expression maths.CompareExpression, card2 PokerCard) bool {
var point1, point2 int
if slf.comparePoint == nil {
point1, point2 = int(card1.GetPoint()), int(card2.GetPoint())
} else {
point1, point2 = slf.comparePoint[card1.GetPoint()], slf.comparePoint[card2.GetPoint()]
}
if maths.Compare(point1, expression, point2) {
return true
}
var color1, color2 int
if slf.comparePoint == nil {
color1, color2 = int(card1.GetColor()), int(card2.GetColor())
} else {
color1, color2 = slf.compareColor[card1.GetColor()], slf.compareColor[card2.GetColor()]
}
return maths.Compare(color1, expression, color2)
}

View File

@ -0,0 +1,33 @@
package builtin
type PokerOption[PlayerID comparable] func(poker *Poker[PlayerID])
// WithPokerPointOrderOfSize 通过特定的点数大小顺序创建扑克玩法
// - 顺序由大到小points 数组必须包含每一个点数
func WithPokerPointOrderOfSize[PlayerID comparable](points [15]PokerPoint) PokerOption[PlayerID] {
return func(poker *Poker[PlayerID]) {
var compare = make(map[PokerPoint]int)
for i, point := range points {
compare[point] = len(points) - i
}
if len(compare) != len(points) {
panic("not every point included")
}
poker.comparePoint = compare
}
}
// WithPokerColorOrderOfSize 通过特定的花色大小顺序创建扑克玩法
// - 顺序由大到小colors 数组必须包含每一种花色
func WithPokerColorOrderOfSize[PlayerID comparable](colors [4]PokerColor) PokerOption[PlayerID] {
return func(poker *Poker[PlayerID]) {
var compare = make(map[PokerColor]int)
for i, color := range colors {
compare[color] = len(colors) - i
}
if len(compare) != len(colors) {
panic("not every color included")
}
poker.compareColor = compare
}
}