game_sync/gamerule/dezhoupoker/dezhouPokerAlgorithm.go

824 lines
23 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package dezhoupoker
import (
"fmt"
"sort"
)
const (
KindOfCard_HighCard int32 = iota //0 高牌:先比最大的牌,如相同则依次比剩余的单张
KindOfCard_OnePair //1 一对:先比对子,对子相同则依次比单张。
KindOfCard_TwoPair //2 两对:先比大对,再比小对,都相同则比单张。
KindOfCard_ThreeKind //3 三条:先比三条,三条相同比单张
KindOfCard_Straight //4 顺子比顺子的大小。A2345是最小的顺子。
KindOfCard_Flush //5 同花:比最大的单张,如相同则依次比剩余的单张。
KindOfCard_Fullhouse //6 葫芦:先比三条,三条相同比对子
KindOfCard_FourKind //7 四条:先比四条,四条相同比单张。
KindOfCard_StraightFlush //8 同花顺
KindOfCard_RoyalFlush //9 皇家同花顺
KindOfCard_Invalide //无效边池对应的牌型
KindOfCard_Max
)
//对子延伸牌型
const (
KindOfCardEx_OverPair int32 = iota //高对overpair是一个玩家自己手上的对子它比公共牌上任何一张牌可能组成的对子更大
KindOfCardEx_TopPair //由玩家手里的一张牌和最大的一张公共牌组成的对子叫做顶对top pair
KindOfCardEx_MiddlePair //玩家手上的一张牌和牌面上的一张中等牌组成的对子
KindOfCardEx_UnderPair //比所有公共牌数字都小的对子。因此,任何与牌面组成的对子将打败低对
)
var KindOfCardStr = []string{
"高牌",
"一对",
"两对",
"三条",
"顺子",
"同花",
"葫芦",
"四条",
"同花顺",
"皇家同花顺",
"无效",
}
type CardData struct {
Color int32
Value int32
Card int32
}
func (this *CardData) Init(card int32) {
this.Card = card
this.Color = this.Card / PER_CARD_COLOR_MAX
this.Value = this.Card % PER_CARD_COLOR_MAX
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
type CardDataManager struct {
CardDataPool []CardData //带花色排序
CardData2Pool []CardData //不带花色排序
CardValueCount map[int32]int32
CardColorCount map[int32]int32
}
func (this *CardDataManager) Init() {
this.CardValueCount = make(map[int32]int32)
this.CardColorCount = make(map[int32]int32)
}
func (this *CardDataManager) AddCard(card int32) {
var cardData CardData
cardData.Init(card)
this.CardDataPool = append(this.CardDataPool, cardData)
if _, ok := this.CardValueCount[cardData.Value]; ok {
this.CardValueCount[cardData.Value]++
} else {
this.CardValueCount[cardData.Value] = 1
}
if _, ok := this.CardColorCount[cardData.Color]; ok {
this.CardColorCount[cardData.Color]++
} else {
this.CardColorCount[cardData.Color] = 1
}
}
func (this *CardDataManager) ReCal() {
this.CardData2Pool = append(this.CardData2Pool, this.CardDataPool...)
//升序
len := len(this.CardData2Pool)
for i := 0; i < len; i++ {
for j := i + 1; j < len; j++ {
if this.CardData2Pool[i].Value > this.CardData2Pool[j].Value {
this.CardData2Pool[i], this.CardData2Pool[j] = this.CardData2Pool[j], this.CardData2Pool[i]
}
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
type CardsInfo struct {
Kind int32 //牌型
KindCards []int32
Value int64 //牌力大小。KK_KK_KK_VV_VV_VV_VV_VV
ValueScore int32 //计算得分,在数值控制里面用
}
func (this *CardsInfo) KindStr() string {
return KindOfCardStr[this.Kind]
}
func (this *CardsInfo) MakeValue(kindValue, kind1Value, kind2Value, poker1Value, poker2Value, poker3Value, poker4Value, poker5Value int32) int64 {
kind_value := kindValue*10000 + kind1Value*100 + kind2Value
poker_value := poker1Value*100000000 + poker2Value*1000000 + poker3Value*10000 + poker4Value*100 + poker5Value
result_Value := int64(kind_value)*10000000000 + int64(poker_value)
return result_Value
}
func (this *CardsInfo) CalValue() {
switch this.Kind {
case KindOfCard_RoyalFlush:
this.Value = this.MakeValue(this.Kind, 0, 0, 0, 0, 0, 0, 0)
case KindOfCard_StraightFlush:
this.Value = this.MakeValue(this.Kind, 0, 0, this.ValueToWeight(this.KindCards[0]), 0, 0, 0, 0)
case KindOfCard_FourKind:
this.Value = this.MakeValue(this.Kind, this.ValueToWeight(this.KindCards[0]), 0, this.ValueToWeight(this.KindCards[4]), 0, 0, 0, 0)
case KindOfCard_Fullhouse:
this.Value = this.MakeValue(this.Kind, this.ValueToWeight(this.KindCards[0]), this.ValueToWeight(this.KindCards[3]), 0, 0, 0, 0, 0)
case KindOfCard_Flush:
this.Value = this.MakeValue(this.Kind, 0, 0, this.ValueToWeight(this.KindCards[0]), this.ValueToWeight(this.KindCards[1]), this.ValueToWeight(this.KindCards[2]), this.ValueToWeight(this.KindCards[3]), this.ValueToWeight(this.KindCards[4]))
case KindOfCard_Straight:
this.Value = this.MakeValue(this.Kind, 0, 0, this.ValueToWeight(this.KindCards[0]), 0, 0, 0, 0)
case KindOfCard_ThreeKind:
this.Value = this.MakeValue(this.Kind, this.ValueToWeight(this.KindCards[0]), 0, this.ValueToWeight(this.KindCards[3]), this.ValueToWeight(this.KindCards[4]), 0, 0, 0)
case KindOfCard_TwoPair:
this.Value = this.MakeValue(this.Kind, this.ValueToWeight(this.KindCards[0]), this.ValueToWeight(this.KindCards[2]), this.ValueToWeight(this.KindCards[4]), 0, 0, 0, 0)
case KindOfCard_OnePair:
this.Value = this.MakeValue(this.Kind, this.ValueToWeight(this.KindCards[0]), 0, this.ValueToWeight(this.KindCards[2]), this.ValueToWeight(this.KindCards[3]), this.ValueToWeight(this.KindCards[4]), 0, 0)
case KindOfCard_HighCard:
this.Value = this.MakeValue(this.Kind, 0, 0, this.ValueToWeight(this.KindCards[0]), this.ValueToWeight(this.KindCards[1]), this.ValueToWeight(this.KindCards[2]), this.ValueToWeight(this.KindCards[3]), this.ValueToWeight(this.KindCards[4]))
default:
this.Value = this.MakeValue(this.Kind, 0, 0, 0, 0, 0, 0, 0)
}
}
func (this *CardsInfo) ValueToWeight(pokerCard int32) int32 {
cardValue := pokerCard % PER_CARD_COLOR_MAX
if cardValue == POKER_A {
return POKER_A_Weight
} else {
return cardValue
}
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
type KindOfCardFigureUp struct {
}
var KindOfCardFigureUpSington = &KindOfCardFigureUp{}
func (this *KindOfCardFigureUp) FigureUpByCard(handcards [HandCardNum]int32, communityCards [CommunityCardNum]int32) *CardsInfo {
return this.figureUp(handcards[:], communityCards[:])
}
func (this *KindOfCardFigureUp) figureUp(handcards []int32, communityCards []int32) *CardsInfo {
var tempCard []int
for i := int32(0); i < HandCardNum; i++ {
tempCard = append(tempCard, int(handcards[i]))
}
for i := int32(0); i < CommunityCardNum; i++ {
tempCard = append(tempCard, int(communityCards[i]))
}
//按照升序排序
sort.Ints(tempCard)
var cardDataManager CardDataManager
cardDataManager.Init()
for i := int32(0); i < TotalCardNum; i++ {
cardDataManager.AddCard(int32(tempCard[i]))
}
cardDataManager.ReCal()
//根据value 排序
cardsInfo := this.CalCardKind(&cardDataManager)
if cardsInfo != nil {
cardsInfo.CalValue()
}
return cardsInfo
}
func (this *KindOfCardFigureUp) CalCardKind(cardDataManager *CardDataManager) *CardsInfo {
card_info := this.IsRoyalFlush(cardDataManager)
if card_info != nil {
return card_info
}
card_info = this.IsStraightFlush(cardDataManager)
if card_info != nil {
return card_info
}
card_info = this.IsFourKind(cardDataManager)
if card_info != nil {
return card_info
}
card_info = this.IsFullhouse(cardDataManager)
if card_info != nil {
return card_info
}
card_info = this.IsFlush(cardDataManager)
if card_info != nil {
return card_info
}
card_info = this.IsStraight(cardDataManager)
if card_info != nil {
return card_info
}
card_info = this.IsThreeKind(cardDataManager)
if card_info != nil {
return card_info
}
card_info = this.IsTwoPair(cardDataManager)
if card_info != nil {
return card_info
}
card_info = this.IsOnePair(cardDataManager)
if card_info != nil {
return card_info
}
card_info = this.IsHighCard(cardDataManager)
if card_info != nil {
return card_info
}
fmt.Println("出错了, 永远不应该走到这里 : ", cardDataManager.CardDataPool)
return nil
}
//皇家同花顺 KindOfCard_RoyalFlush
func (this *KindOfCardFigureUp) IsRoyalFlush(cardDataManager *CardDataManager) *CardsInfo {
var cur_poker CardData
cur_poker.Init(cardDataManager.CardDataPool[TotalCardNum-1].Card)
var rst_kind_card []int32
rst_kind_card = append(rst_kind_card, cur_poker.Card)
for i := TotalCardNum - 2; i >= 0; i-- {
if cardDataManager.CardDataPool[i].Card != cur_poker.Card-1 ||
cardDataManager.CardDataPool[i].Color != cur_poker.Color {
rst_kind_card = nil
cur_poker.Init(cardDataManager.CardDataPool[i].Card)
rst_kind_card = append(rst_kind_card, cur_poker.Card)
continue
}
cur_poker.Init(cardDataManager.CardDataPool[i].Card)
rst_kind_card = append(rst_kind_card, cur_poker.Card)
if len(rst_kind_card) >= 4 {
break
}
}
if len(rst_kind_card) < 4 {
return nil
}
if cur_poker.Value != POKER_10 {
return nil
}
//已经找到10J,Q,K, 找同色 A
for i := int32(0); i < TotalCardNum; i++ {
if cardDataManager.CardDataPool[i].Value == POKER_A && cardDataManager.CardDataPool[i].Color == cur_poker.Color {
cardInfo := &CardsInfo{
Kind: KindOfCard_RoyalFlush,
}
//牌型对应的牌
//A
cardInfo.KindCards = append(cardInfo.KindCards, cardDataManager.CardDataPool[i].Card)
//KQJ 10
for i := 0; i < len(rst_kind_card); i++ {
cardInfo.KindCards = append(cardInfo.KindCards, rst_kind_card[i])
}
return cardInfo
}
}
return nil
}
//同花顺 KindOfCard_StraightFlush
func (this *KindOfCardFigureUp) IsStraightFlush(cardDataManager *CardDataManager) *CardsInfo {
var cur_poker CardData
cur_poker.Init(cardDataManager.CardDataPool[TotalCardNum-1].Card)
var rst_kind_card []int32
rst_kind_card = append(rst_kind_card, cur_poker.Card)
for i := TotalCardNum - 2; i >= 0; i-- {
if cardDataManager.CardDataPool[i].Card != cur_poker.Card-1 || cur_poker.Color != cardDataManager.CardDataPool[i].Card/PER_CARD_COLOR_MAX {
rst_kind_card = nil
cur_poker.Init(cardDataManager.CardDataPool[i].Card)
rst_kind_card = append(rst_kind_card, cur_poker.Card)
continue
}
cur_poker.Init(cardDataManager.CardDataPool[i].Card)
rst_kind_card = append(rst_kind_card, cur_poker.Card)
if len(rst_kind_card) >= 5 {
break
}
}
if len(rst_kind_card) == 5 {
cardInfo := &CardsInfo{
Kind: KindOfCard_StraightFlush,
}
//牌型对应的牌
for i := 0; i < len(rst_kind_card); i++ {
cardInfo.KindCards = append(cardInfo.KindCards, rst_kind_card[i])
}
return cardInfo
} else {
return nil
}
}
//四条:先比四条,四条相同比单张。 KindOfCard_FourKind
func (this *KindOfCardFigureUp) IsFourKind(cardDataManager *CardDataManager) *CardsInfo {
for cardValue, cardCount := range cardDataManager.CardValueCount {
if cardCount == 4 {
cardInfo := &CardsInfo{
Kind: KindOfCard_FourKind,
}
//4张 牌型牌
for i := TotalCardNum - 1; i >= 0; i-- {
curCard := cardDataManager.CardData2Pool[i]
if curCard.Value == cardValue {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
}
}
//第5张牌型牌
fithCard := int32(0)
for i := TotalCardNum - 1; i >= 0; i-- {
curCard := cardDataManager.CardData2Pool[i]
if curCard.Card != cardInfo.KindCards[0] {
if curCard.Value == POKER_A {
fithCard = curCard.Card
break
} else {
if cardValue != curCard.Value && fithCard < curCard.Value {
fithCard = curCard.Card
}
}
}
}
cardInfo.KindCards = append(cardInfo.KindCards, fithCard)
return cardInfo
}
}
return nil
}
//葫芦:先比三条,三条相同比对子 KindOfCard_Fullhouse
func (this *KindOfCardFigureUp) IsFullhouse(cardDataManager *CardDataManager) *CardsInfo {
card2Value := INVALIDE_CARD
card3Value := INVALIDE_CARD
card3Count := int32(0)
for cardValue, cardCount := range cardDataManager.CardValueCount {
if cardCount == 3 {
card3Count++
if card3Value == POKER_A {
continue
}
if card3Value < cardValue || cardValue == POKER_A {
card3Value = cardValue
}
} else if cardCount == 2 {
if card2Value == POKER_A {
continue
}
if card2Value < cardValue || cardValue == POKER_A {
card2Value = cardValue
}
}
}
//总共7张如果有两个3条就必然不会有2对.如果有两个3条把较小的哪个当做两对
if card3Count >= 2 {
for cardValue, cardCount := range cardDataManager.CardValueCount {
if cardCount == 3 {
if card3Value != cardValue {
card2Value = cardValue
break
}
}
}
}
if card2Value != INVALIDE_CARD && card3Value != INVALIDE_CARD {
cardInfo := &CardsInfo{
Kind: KindOfCard_Fullhouse,
}
//3对
for i := int32(0); i < TotalCardNum; i++ {
curCard := cardDataManager.CardDataPool[i]
if curCard.Value == card3Value {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
}
}
//2对
for i := int32(0); i < TotalCardNum; i++ {
curCard := cardDataManager.CardDataPool[i]
if curCard.Value == card2Value {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
}
}
return cardInfo
}
return nil
}
//同花:比最大的单张,如相同则依次比剩余的单张。 KindOfCard_Flush
func (this *KindOfCardFigureUp) IsFlush(cardDataManager *CardDataManager) *CardsInfo {
sameColorCount := int32(0)
sameColorValue := int32(0)
for colorValue, colorCount := range cardDataManager.CardColorCount {
if colorCount > sameColorCount {
sameColorCount = colorCount
sameColorValue = colorValue
}
}
if sameColorCount < 5 {
return nil
}
cardInfo := &CardsInfo{
Kind: KindOfCard_Flush,
}
bHasPoker_A := false
var temp_rst []int
for i := TotalCardNum - 1; i >= 0; i-- {
curCard := cardDataManager.CardDataPool[i]
if curCard.Color == sameColorValue {
temp_rst = append(temp_rst, int(curCard.Card))
if curCard.Value == POKER_A {
bHasPoker_A = true
}
}
}
sort.Ints(temp_rst)
if bHasPoker_A {
cardInfo.KindCards = append(cardInfo.KindCards, int32(temp_rst[0]))
data_len := len(temp_rst)
for i := data_len - 1; i >= 0; i-- {
cardInfo.KindCards = append(cardInfo.KindCards, int32(temp_rst[i]))
if len(cardInfo.KindCards) >= 5 {
break
}
}
} else {
data_len := len(temp_rst)
for i := data_len - 1; i >= 0; i-- {
cardInfo.KindCards = append(cardInfo.KindCards, int32(temp_rst[i]))
if len(cardInfo.KindCards) >= 5 {
break
}
}
}
return cardInfo
}
//顺子比顺子的大小。A2345是最小的顺子,AKQJ10是最大的顺子。 KindOfCard_Straight
func (this *KindOfCardFigureUp) IsStraight(cardDataManager *CardDataManager) *CardsInfo {
//需要先判断是最大的顺子,才能再判定普通顺子
card_info := this.IsStraightMax(cardDataManager)
if card_info == nil {
card_info = this.IsStraightNormal(cardDataManager)
}
return card_info
}
func (this *KindOfCardFigureUp) IsStraightNormal(cardDataManager *CardDataManager) *CardsInfo {
var cur_poker CardData
cur_poker.Init(cardDataManager.CardData2Pool[TotalCardNum-1].Card)
var rst_kind_card []int32
rst_kind_card = append(rst_kind_card, cur_poker.Card)
for i := TotalCardNum - 2; i >= 0; i-- {
if cardDataManager.CardData2Pool[i].Value == cur_poker.Value {
continue
}
if cardDataManager.CardData2Pool[i].Value != cur_poker.Value-1 {
rst_kind_card = nil
cur_poker.Init(cardDataManager.CardData2Pool[i].Card)
rst_kind_card = append(rst_kind_card, cur_poker.Card)
continue
}
cur_poker.Init(cardDataManager.CardData2Pool[i].Card)
rst_kind_card = append(rst_kind_card, cur_poker.Card)
if len(rst_kind_card) >= 5 {
break
}
}
if len(rst_kind_card) == 5 {
cardInfo := &CardsInfo{
Kind: KindOfCard_Straight,
}
cardInfo.KindCards = rst_kind_card
return cardInfo
} else {
return nil
}
}
func (this *KindOfCardFigureUp) IsStraightMax(cardDataManager *CardDataManager) *CardsInfo {
var cur_poker CardData
cur_poker.Init(cardDataManager.CardData2Pool[TotalCardNum-1].Card)
var rst_kind_card []int32
rst_kind_card = append(rst_kind_card, cur_poker.Card)
for i := TotalCardNum - 2; i >= 0; i-- {
if cardDataManager.CardData2Pool[i].Value == cur_poker.Value {
continue
}
if cardDataManager.CardData2Pool[i].Value != cur_poker.Value-1 {
rst_kind_card = nil
cur_poker.Init(cardDataManager.CardData2Pool[i].Card)
rst_kind_card = append(rst_kind_card, cur_poker.Card)
continue
}
cur_poker.Init(cardDataManager.CardData2Pool[i].Card)
rst_kind_card = append(rst_kind_card, cur_poker.Card)
if len(rst_kind_card) >= 4 {
break
}
}
if len(rst_kind_card) < 4 {
return nil
}
if cur_poker.Value == POKER_10 && cardDataManager.CardData2Pool[0].Value == POKER_A {
cardInfo := &CardsInfo{
Kind: KindOfCard_Straight,
}
cardInfo.KindCards = append(cardInfo.KindCards, cardDataManager.CardData2Pool[0].Card)
cardInfo.KindCards = append(cardInfo.KindCards, rst_kind_card...)
return cardInfo
} else {
return nil
}
}
//三条:先比三条,三条相同比单张 KindOfCard_ThreeKind
func (this *KindOfCardFigureUp) IsThreeKind(cardDataManager *CardDataManager) *CardsInfo {
santiaoValue := int32(INVALIDE_CARD)
for cardValue, cardCount := range cardDataManager.CardValueCount {
if cardCount == 3 {
santiaoValue = cardValue
}
}
if santiaoValue == INVALIDE_CARD {
return nil
}
cardInfo := &CardsInfo{
Kind: KindOfCard_ThreeKind,
}
//前3张
for i := TotalCardNum - 1; i >= 0; i-- {
curCard := cardDataManager.CardDataPool[i]
if curCard.Value == santiaoValue {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
}
}
if cardDataManager.CardData2Pool[0].Value == POKER_A && santiaoValue != POKER_A {
//第4张牌
cardInfo.KindCards = append(cardInfo.KindCards, cardDataManager.CardData2Pool[0].Card)
//第5张牌
for i := TotalCardNum - 1; i >= 0; i-- {
curCard := cardDataManager.CardData2Pool[i]
if curCard.Value != santiaoValue && curCard.Value != POKER_A {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
break
}
}
} else {
//第4张 第 5 张牌
for i := TotalCardNum - 1; i >= 0; i-- {
curCard := cardDataManager.CardData2Pool[i]
if curCard.Value != santiaoValue {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
if len(cardInfo.KindCards) >= 5 {
break
}
}
}
}
return cardInfo
}
//两对:先比大对,再比小对,都相同则比单张。 KindOfCard_TwoPair
func (this *KindOfCardFigureUp) IsTwoPair(cardDataManager *CardDataManager) *CardsInfo {
var card2Value []int
for cardValue, cardCount := range cardDataManager.CardValueCount {
if cardCount == 2 {
card2Value = append(card2Value, int(cardValue))
}
}
if len(card2Value) < 2 {
return nil
}
sort.Ints(card2Value)
cardInfo := &CardsInfo{
Kind: KindOfCard_TwoPair,
}
if len(card2Value) == 3 {
if card2Value[0] == int(POKER_A) {
//删除中间
card2Value = append(card2Value[:1], card2Value[2:]...)
} else {
//删除第一个
card2Value = append(card2Value[:0], card2Value[1:]...)
}
}
if card2Value[0] == int(POKER_A) {
card2Value[0], card2Value[1] = card2Value[1], card2Value[0]
}
for j := 1; j >= 0; j-- {
//2对
for i := int32(0); i < TotalCardNum; i++ {
curCard := cardDataManager.CardDataPool[i]
if curCard.Value == int32(card2Value[j]) {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
}
}
}
//第5张牌
if cardDataManager.CardData2Pool[0].Value == POKER_A && int32(card2Value[1]) != POKER_A {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, cardDataManager.CardData2Pool[0].Card)
} else {
//第5张牌
for i := TotalCardNum - 1; i >= 0; i-- {
curCard := cardDataManager.CardData2Pool[i]
if curCard.Value != int32(card2Value[0]) && curCard.Value != int32(card2Value[1]) {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
break
}
}
}
return cardInfo
}
//一对:先比对子,对子相同则依次比单张。 KindOfCard_OnePair
func (this *KindOfCardFigureUp) IsOnePair(cardDataManager *CardDataManager) *CardsInfo {
card1Value := INVALIDE_CARD
for cardValue, cardCount := range cardDataManager.CardValueCount {
if cardCount == 2 {
card1Value = cardValue
break
}
}
if card1Value == INVALIDE_CARD {
return nil
}
cardInfo := &CardsInfo{
Kind: KindOfCard_OnePair,
}
//1对
for i := int32(0); i < TotalCardNum; i++ {
curCard := cardDataManager.CardDataPool[i]
if curCard.Value == card1Value {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
}
}
//第3 ~ 5张牌
if cardDataManager.CardData2Pool[0].Value == POKER_A && card1Value != POKER_A {
//牌型牌
//第 3 张
cardInfo.KindCards = append(cardInfo.KindCards, cardDataManager.CardData2Pool[0].Card)
//第4 ~ 5张牌
for i := TotalCardNum - 1; i >= 0; i-- {
curCard := cardDataManager.CardData2Pool[i]
if curCard.Value != card1Value && curCard.Value != POKER_A {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
if len(cardInfo.KindCards) >= 5 {
break
}
}
}
} else {
//第3 ~ 5张牌
for i := TotalCardNum - 1; i >= 0; i-- {
curCard := cardDataManager.CardData2Pool[i]
if curCard.Value != card1Value {
//牌型牌
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
if len(cardInfo.KindCards) >= 5 {
break
}
}
}
}
return cardInfo
}
//高牌:先比最大的牌,如相同则依次比剩余的单张 KindOfCard_HighCard
func (this *KindOfCardFigureUp) IsHighCard(cardDataManager *CardDataManager) *CardsInfo {
cardInfo := &CardsInfo{
Kind: KindOfCard_HighCard,
}
if cardDataManager.CardData2Pool[0].Value == POKER_A {
//牌型牌
//第 1 张牌
cardInfo.KindCards = append(cardInfo.KindCards, cardDataManager.CardData2Pool[0].Card)
//第2 ~ 5张牌
for i := TotalCardNum - 1; i >= 0; i-- {
curCard := cardDataManager.CardData2Pool[i]
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
if len(cardInfo.KindCards) >= 5 {
break
}
}
} else {
//第1 ~ 5张牌
for i := TotalCardNum - 1; i >= 0; i-- {
curCard := cardDataManager.CardData2Pool[i]
cardInfo.KindCards = append(cardInfo.KindCards, curCard.Card)
if len(cardInfo.KindCards) >= 5 {
break
}
}
}
return cardInfo
}