game_sync/gamerule/redvsblack/cardkind.go

220 lines
5.7 KiB
Go

package redvsblack
import (
"sort"
)
const (
CardsKind_Single int = iota //散牌
CardsKind_Double //小对子2~8的对
CardsKind_BigDouble //大对子9~A的对
CardsKind_StraightA23 //顺子地龙
CardsKind_Straight //顺子普通
CardsKind_RoyalStraight //顺子天龙
CardsKind_Flush //同花
CardsKind_FlushStraightA23 //同花顺地龙
CardsKind_FlushStraight //同花顺普通
CardsKind_RoyalFlushStraight //同花顺天龙
CardsKind_ThreeSame //豹子
CardsKind_Max
)
type CardKindCheckInteface func(cardsInfo *handCardsInfo) *KindOfCard
var cardKindCheckList [CardsKind_Max]CardKindCheckInteface
func registeCardCheckFunc(kind int, kindFunc CardKindCheckInteface) {
cardKindCheckList[kind] = kindFunc
}
func getCardCheckFunc(kind int) CardKindCheckInteface {
if kind > CardsKind_Single && kind < CardsKind_Max {
return cardKindCheckList[kind]
}
return nil
}
func init() {
//1.CardsKind_Double
registeCardCheckFunc(CardsKind_Double, func(cardsInfo *handCardsInfo) *KindOfCard {
if cardsInfo.numValue != 2 {
return nil
}
//对子放到前头
if cardsInfo.cards2[0] != cardsInfo.cards2[1] {
cardsInfo.cards2[0], cardsInfo.cards2[1], cardsInfo.cards2[2] = cardsInfo.cards2[2], cardsInfo.cards2[1], cardsInfo.cards2[0]
}
if CardValueMap[cardsInfo.cards2[0]] < 8 {
return &KindOfCard{
Kind: CardsKind_Double,
maxValue: cardsInfo.maxValue,
maxColor: cardsInfo.maxColor,
}
}
return nil
})
//1.CardsKind_BigDouble
registeCardCheckFunc(CardsKind_BigDouble, func(cardsInfo *handCardsInfo) *KindOfCard {
if cardsInfo.numValue != 2 {
return nil
}
//对子放到前头
if cardsInfo.cards2[0] != cardsInfo.cards2[1] {
cardsInfo.cards2[0], cardsInfo.cards2[1], cardsInfo.cards2[2] = cardsInfo.cards2[2], cardsInfo.cards2[1], cardsInfo.cards2[0]
}
if CardValueMap[cardsInfo.cards2[0]] >= 8 {
return &KindOfCard{
Kind: CardsKind_BigDouble,
maxValue: cardsInfo.maxValue,
maxColor: cardsInfo.maxColor,
}
}
return nil
})
//2.顺子地龙
registeCardCheckFunc(CardsKind_StraightA23, func(cardsInfo *handCardsInfo) *KindOfCard {
if cardsInfo.numValue != 3 || cardsInfo.numColor < 2 {
return nil
}
if cardsInfo.cards2[0] == 0 && cardsInfo.cards2[1] == 1 && cardsInfo.cards2[2] == 2 {
return &KindOfCard{
Kind: CardsKind_StraightA23,
maxValue: cardsInfo.maxValue,
maxColor: cardsInfo.maxColor,
}
} else {
return nil
}
})
//3.顺子
registeCardCheckFunc(CardsKind_Straight, func(cardsInfo *handCardsInfo) *KindOfCard {
if cardsInfo.numValue != 3 || cardsInfo.numColor < 2 {
return nil
}
if IsRoundSlice(cardsInfo.cards2) && cardsInfo.cards2[0] != 0 {
return &KindOfCard{
Kind: CardsKind_Straight,
maxValue: cardsInfo.maxValue,
maxColor: cardsInfo.maxColor,
}
}
return nil
})
//4.皇家顺子
registeCardCheckFunc(CardsKind_RoyalStraight, func(cardsInfo *handCardsInfo) *KindOfCard {
if cardsInfo.numValue != 3 || cardsInfo.numColor < 2 {
return nil
}
if cardsInfo.cards2[0] == 0 && cardsInfo.cards2[1] == 11 && cardsInfo.cards2[2] == 12 {
return &KindOfCard{
Kind: CardsKind_RoyalStraight,
maxValue: cardsInfo.maxValue,
maxColor: cardsInfo.maxColor,
}
}
return nil
})
//5.同花
registeCardCheckFunc(CardsKind_Flush, func(cardsInfo *handCardsInfo) *KindOfCard {
if cardsInfo.numColor != 1 {
return nil
}
return &KindOfCard{
Kind: CardsKind_Flush,
maxValue: cardsInfo.maxValue,
maxColor: cardsInfo.maxColor,
}
})
//6.同花顺地龙
registeCardCheckFunc(CardsKind_FlushStraightA23, func(cardsInfo *handCardsInfo) *KindOfCard {
if cardsInfo.numColor != 1 {
return nil
}
if cardsInfo.numValue != 3 {
return nil
}
if cardsInfo.cards2[0] == 0 && cardsInfo.cards2[1] == 1 && cardsInfo.cards2[2] == 2 {
return &KindOfCard{
Kind: CardsKind_FlushStraightA23,
maxValue: cardsInfo.cards2[2],
maxColor: cardsInfo.maxColor,
}
}
return nil
})
//7.同花顺
registeCardCheckFunc(CardsKind_FlushStraight, func(cardsInfo *handCardsInfo) *KindOfCard {
if cardsInfo.numColor != 1 {
return nil
}
if cardsInfo.numValue != 3 {
return nil
}
if IsRoundSlice(cardsInfo.cards2) && cardsInfo.cards2[0] != 0 {
return &KindOfCard{
Kind: CardsKind_FlushStraight,
maxValue: cardsInfo.maxValue,
maxColor: cardsInfo.maxColor,
}
}
return nil
})
//8.同花顺 QKA
registeCardCheckFunc(CardsKind_RoyalFlushStraight, func(cardsInfo *handCardsInfo) *KindOfCard {
if cardsInfo.numColor != 1 {
return nil
}
if cardsInfo.numValue != 3 {
return nil
}
if cardsInfo.cards2[0] == 0 && cardsInfo.cards2[1] == 11 && cardsInfo.cards2[2] == 12 {
return &KindOfCard{
Kind: CardsKind_RoyalFlushStraight,
maxValue: cardsInfo.maxValue,
maxColor: cardsInfo.maxColor,
}
} else {
return nil
}
})
//9.豹子
registeCardCheckFunc(CardsKind_ThreeSame, func(cardsInfo *handCardsInfo) *KindOfCard {
if cardsInfo.numValue != 1 {
return nil
}
return &KindOfCard{
Kind: CardsKind_ThreeSame,
maxValue: cardsInfo.maxValue,
maxColor: cardsInfo.maxColor,
}
})
}
/*
* 查看一个切片是否是递增数组
*/
func IsRoundSlice(sl []int) bool {
sort.Ints(sl)
if len(sl) != 3 {
return false
}
for i := 0; i < len(sl)-1; i++ {
if sl[i]+1 != sl[i+1] {
return false
}
}
return true
}
/*
* 在一个切片中查找给定的数值是否存在
*/
func InSlice(value int, sl []int) bool {
for _, v := range sl {
if v == value {
return true
}
}
return false
}