117 lines
2.3 KiB
Go
117 lines
2.3 KiB
Go
package blackjack
|
||
|
||
import (
|
||
"errors"
|
||
)
|
||
|
||
// 牌型
|
||
const (
|
||
CardTypeInvalid = 0
|
||
CardTypeA10 = 1 // 黑杰克:一张A 一张10
|
||
CardTypeFive = 2 // 五小龙:五张牌且没有爆牌
|
||
CardTypeOther = 3 // 其它点数:点数小于等于21
|
||
CardTypeBoom = 4 // 爆牌:点数大于21
|
||
)
|
||
|
||
var CardTypeSort = map[int32]int{
|
||
CardTypeBoom: 1,
|
||
CardTypeOther: 2,
|
||
CardTypeFive: 3,
|
||
CardTypeA10: 4,
|
||
}
|
||
|
||
// 获取牌型和点数
|
||
func GetCardsType(cards []*Card) (int32, []int32) {
|
||
l := len(cards)
|
||
if l <= 0 || l > MaxCardNum {
|
||
return 0, []int32{}
|
||
}
|
||
// 黑杰克
|
||
if l == 2 {
|
||
if (cards[0].Point() == 1 && cards[1].Point() == 10) || (cards[0].Point() == 10 && cards[1].Point() == 1) {
|
||
return CardTypeA10, []int32{21}
|
||
}
|
||
}
|
||
// 所有点数
|
||
var point int32
|
||
for _, v := range cards {
|
||
point += int32(v.Point())
|
||
}
|
||
points := []int32{point}
|
||
for _, v := range cards {
|
||
if v.Point() == 1 {
|
||
if point+10 > 21 {
|
||
break
|
||
}
|
||
point += 10
|
||
points = append(points, point)
|
||
}
|
||
}
|
||
i := -1 // 最大点数且不爆的点数下标
|
||
for k, v := range points {
|
||
if v <= 21 {
|
||
i = k
|
||
} else {
|
||
break
|
||
}
|
||
}
|
||
// 五小龙
|
||
if l == 5 {
|
||
if i > -1 {
|
||
if points[i] == 21 {
|
||
return CardTypeFive, []int32{21}
|
||
} else {
|
||
return CardTypeFive, points[:i+1]
|
||
}
|
||
}
|
||
}
|
||
// 爆牌
|
||
if points[0] > 21 {
|
||
return CardTypeBoom, []int32{points[0]}
|
||
}
|
||
// 其他点数
|
||
if points[i] == 21 {
|
||
return CardTypeOther, []int32{21}
|
||
}
|
||
return CardTypeOther, points[:i+1]
|
||
}
|
||
|
||
// 手牌比大小
|
||
// bankCards 庄家手牌
|
||
// playerCards 闲家手牌
|
||
// 返回值
|
||
// -1 c1 < c2
|
||
// 0 c1 == c2
|
||
// 1 c1 > c2
|
||
func CompareCards(bankCards, playerCards []*Card) (int, error) {
|
||
t1, p1 := GetCardsType(bankCards)
|
||
t2, p2 := GetCardsType(playerCards)
|
||
|
||
if t1 == CardTypeInvalid || t2 == CardTypeInvalid {
|
||
return 0, errors.New("Invalid CardType ")
|
||
}
|
||
// 牌型比较
|
||
if CardTypeSort[t1] > CardTypeSort[t2] {
|
||
return 1, nil
|
||
}
|
||
if CardTypeSort[t1] < CardTypeSort[t2] {
|
||
return -1, nil
|
||
}
|
||
// 庄闲都爆牌,则庄赢
|
||
if t1 == CardTypeBoom {
|
||
return 1, nil
|
||
}
|
||
// 黑杰克,五小龙 平局
|
||
if t1 == CardTypeA10 || t1 == CardTypeFive {
|
||
return 0, nil
|
||
}
|
||
// 比点数
|
||
if p1[len(p1)-1] > p2[len(p2)-1] {
|
||
return 1, nil
|
||
}
|
||
if p1[len(p1)-1] == p2[len(p2)-1] {
|
||
return 0, nil
|
||
}
|
||
return -1, nil
|
||
}
|