|
@@ -9,6 +9,7 @@ import (
|
|
|
"server/game/room"
|
|
|
"server/msg"
|
|
|
"server/user"
|
|
|
+ "sort"
|
|
|
"time"
|
|
|
|
|
|
"github.com/name5566/leaf/gate"
|
|
@@ -42,6 +43,16 @@ var GameConfig struct {
|
|
|
|
|
|
var SelfSitPos int32 = 4
|
|
|
|
|
|
+// 定义玩家手牌的类型
|
|
|
+type CardType int
|
|
|
+
|
|
|
+const (
|
|
|
+ CardTypeFlushStraight CardType = 1 // 同花顺
|
|
|
+ CardTypeFlush CardType = 2 // 同花
|
|
|
+ CardTypePair CardType = 3 // 对子
|
|
|
+ CardTypeSingle CardType = 4 // 散牌
|
|
|
+)
|
|
|
+
|
|
|
func InitGame() {
|
|
|
|
|
|
}
|
|
@@ -168,3 +179,130 @@ func shuffleCardDeck(deck *[]msg.ReqCard) {
|
|
|
(*deck)[i], (*deck)[j] = (*deck)[j], (*deck)[i]
|
|
|
})
|
|
|
}
|
|
|
+
|
|
|
+// 计算一个玩家的手牌的类型,按照同花顺>同花>对子>散牌的顺序
|
|
|
+func calculateCardType(cards []msg.ReqCard) CardType {
|
|
|
+ // 先判断是否是同花顺
|
|
|
+ isFlush := isFlush(cards)
|
|
|
+ isStraight := isStraight(cards)
|
|
|
+ if isFlush && isStraight {
|
|
|
+ return CardTypeFlushStraight
|
|
|
+ }
|
|
|
+ // 判断是否是同花
|
|
|
+ if isFlush {
|
|
|
+ return CardTypeFlush
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否是对子
|
|
|
+ isPair := isPair(cards)
|
|
|
+ if isPair {
|
|
|
+ return CardTypePair
|
|
|
+ }
|
|
|
+
|
|
|
+ // 散牌
|
|
|
+ return CardTypeSingle
|
|
|
+}
|
|
|
+
|
|
|
+// 判断是否是同花(三张牌花色相同)
|
|
|
+func isFlush(cards []msg.ReqCard) bool {
|
|
|
+ if len(cards) != 3 {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ return cards[0].Color == cards[1].Color && cards[1].Color == cards[2].Color
|
|
|
+}
|
|
|
+
|
|
|
+// 判断是否是顺子(三张牌点数连续)
|
|
|
+func isStraight(cards []msg.ReqCard) bool {
|
|
|
+ if len(cards) != 3 {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ // 复制一个新的切片用于排序
|
|
|
+ points := make([]int32, 3)
|
|
|
+ for i, card := range cards {
|
|
|
+ points[i] = card.Point
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序
|
|
|
+ sort.Slice(points, func(i, j int) bool {
|
|
|
+ return points[i] < points[j]
|
|
|
+ })
|
|
|
+
|
|
|
+ // 特殊情况:A,2,3
|
|
|
+ if points[0] == 1 && points[1] == 2 && points[2] == 3 {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ // 特殊情况:Q,K,A
|
|
|
+ if points[0] == 1 && points[1] == 12 && points[2] == 13 {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ // 普通情况:判断是否连续
|
|
|
+ return points[1] == points[0]+1 && points[2] == points[1]+1
|
|
|
+}
|
|
|
+
|
|
|
+// 判断是否是对子(三张牌中有两张点数相同)
|
|
|
+func isPair(cards []msg.ReqCard) bool {
|
|
|
+ if len(cards) != 3 {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ return cards[0].Point == cards[1].Point ||
|
|
|
+ cards[1].Point == cards[2].Point ||
|
|
|
+ cards[0].Point == cards[2].Point
|
|
|
+}
|
|
|
+
|
|
|
+// 计算一个玩家的手牌的总值
|
|
|
+func calculateCardTotalValue(cards []msg.ReqCard) int {
|
|
|
+ total := 0
|
|
|
+ for _, card := range cards {
|
|
|
+ total += int(card.Point)
|
|
|
+ }
|
|
|
+ return total
|
|
|
+}
|
|
|
+
|
|
|
+// 两个玩家对比手牌,如果手牌类型相同就比手牌总值,如果类型和值相同就比黑桃红桃方块梅花
|
|
|
+func compareCards(player1 *room.Player, player2 *room.Player) int {
|
|
|
+ cardType1 := calculateCardType(*player1.HandCards)
|
|
|
+ cardType2 := calculateCardType(*player2.HandCards)
|
|
|
+ if cardType1 == cardType2 {
|
|
|
+ return compareCardValue(*player1.HandCards, *player2.HandCards)
|
|
|
+ }
|
|
|
+ return int(cardType1 - cardType2)
|
|
|
+}
|
|
|
+
|
|
|
+// 两个玩家手牌类型相同,比手牌总值
|
|
|
+func compareCardValue(cards1 []msg.ReqCard, cards2 []msg.ReqCard) int {
|
|
|
+ // 计算手牌总值
|
|
|
+ cardValue1 := calculateCardTotalValue(cards1)
|
|
|
+ cardValue2 := calculateCardTotalValue(cards2)
|
|
|
+ if cardValue1 == cardValue2 {
|
|
|
+ return compareCardColor(cards1, cards2)
|
|
|
+ }
|
|
|
+ return int(cardValue1 - cardValue2)
|
|
|
+}
|
|
|
+
|
|
|
+// 两个玩家手牌类型和大小都相同,比黑桃红桃方块梅花
|
|
|
+// 返回值:
|
|
|
+// 正数:cards1 赢
|
|
|
+// 负数:cards2 赢
|
|
|
+// 0:平局(理论上不会发生,因为不可能有完全相同的牌)
|
|
|
+func compareCardColor(cards1 []msg.ReqCard, cards2 []msg.ReqCard) int {
|
|
|
+ // 先把牌按点数排序
|
|
|
+ sort.Slice(cards1, func(i, j int) bool {
|
|
|
+ return cards1[i].Point < cards1[j].Point
|
|
|
+ })
|
|
|
+ sort.Slice(cards2, func(i, j int) bool {
|
|
|
+ return cards2[i].Point < cards2[j].Point
|
|
|
+ })
|
|
|
+
|
|
|
+ // 从大牌开始比较花色
|
|
|
+ for i := 2; i >= 0; i-- {
|
|
|
+ if cards1[i].Color != cards2[i].Color {
|
|
|
+ // 花色数字越小,牌越大(黑桃0 > 红桃1 > 方块2 > 梅花3)
|
|
|
+ return int(cards2[i].Color - cards1[i].Color)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0
|
|
|
+}
|