Gogs пре 4 месеци
родитељ
комит
03fa1b340e
2 измењених фајлова са 141 додато и 0 уклоњено
  1. 3 0
      src/server/game/teen/opt.go
  2. 138 0
      src/server/game/teen/teen.go

+ 3 - 0
src/server/game/teen/opt.go

@@ -75,6 +75,9 @@ func ante(room *room.Room, sitPos int32, betAmount int32) {
 		PlayerOpt:   &msg.PlayerOpt{OptType: msg.PlayerOptType_OPT_ANTE},
 		UserId:      room.GetPlayerBySitPos(sitPos).GetUserId(),
 	})
+	game.Module.Skeleton.AfterFunc(time.Microsecond*500, func() {
+		sendRoomBet(room)
+	})
 }
 
 // 亮牌

+ 138 - 0
src/server/game/teen/teen.go

@@ -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
+}