220 lines
5.7 KiB
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
|
|
}
|