From 101e16a4886d9a4ccc00361d10a79ab7a74709ff Mon Sep 17 00:00:00 2001 From: nothamor Date: Tue, 28 May 2024 13:01:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BE=E5=AE=B6=E4=B9=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin/baccarat/baccarat.go | 186 ++++++++++++++++++++++++++++++++++++ plugin/baccarat/cache.go | 30 ++++++ router/router.go | 6 +- 3 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 plugin/baccarat/baccarat.go create mode 100644 plugin/baccarat/cache.go diff --git a/plugin/baccarat/baccarat.go b/plugin/baccarat/baccarat.go new file mode 100644 index 0000000..b526881 --- /dev/null +++ b/plugin/baccarat/baccarat.go @@ -0,0 +1,186 @@ +package baccarat + +import ( + "amor/common" + redisrepo "amor/repository/redisRepo" + "fmt" + "strings" + + "github.com/notnil/joker/pkg/hand" + "github.com/redis/rueidis" + "github.com/shopspring/decimal" + "github.com/spf13/cast" + zero "github.com/wdvxdr1123/ZeroBot" +) + +const ( + EntryMsgTemplate = "庄家手牌: %s\n闲家手牌: %s\n%s" +) + +func Entry(ctx *zero.Ctx) { + // bjl 100 庄/闲/和 + msg := strings.Split(ctx.Event.Message.String(), " ") + if len(msg) != 3 { + ctx.Send("命令格式错误") + return + } + + if ctx.Event.GroupID == 0 { + ctx.Send("请在群聊中使用") + return + } + + betAmount := cast.ToInt64(msg[1]) + if betAmount <= 0 { + ctx.Send("下注金额必须大于0") + return + } + userBalance, err := redisrepo.GetUserBalance(ctx.Event.UserID) + if err != nil { + if err == rueidis.Nil { + userBalance = common.Config.Game.Balance + redisrepo.Register(ctx.Event.UserID) + } else { + ctx.Send("获取用户余额失败") + return + } + } + if userBalance < betAmount { + ctx.Send("你的余额不足, 请重新下注") + return + } + bet := msg[2] + if bet != "庄" && bet != "闲" && bet != "和" { + ctx.Send("下注类型错误") + return + } + + round := NewRound(betAmount) + + // 发牌, 顺序: 闲庄闲庄 + round.PlayerHand = append(round.PlayerHand, round.Deck.Pop()) + round.DealerHand = append(round.DealerHand, round.Deck.Pop()) + round.PlayerHand = append(round.PlayerHand, round.Deck.Pop()) + round.DealerHand = append(round.DealerHand, round.Deck.Pop()) + + // 计算点数 + playerPoint := CalculateCardPoint(round.PlayerHand) + dealerPoint := CalculateCardPoint(round.DealerHand) + + result := "" + playerHaveThirdCard := false + if playerPoint == 8 || playerPoint == 9 { + result = "闲家例牌, 闲赢" + redisrepo.AddUserBalance(ctx.Event.UserID, betAmount) + ctx.Send(fmt.Sprintf(EntryMsgTemplate, round.DealerHand, round.PlayerHand, result)) + return + } + if playerPoint == 0 || playerPoint == 1 || playerPoint == 2 || playerPoint == 3 || playerPoint == 4 || playerPoint == 5 { + if dealerPoint == 8 || dealerPoint == 9 { + result = "庄家例牌, 庄赢" + redisrepo.SubUserBalance(ctx.Event.UserID, betAmount) + ctx.Send(fmt.Sprintf(EntryMsgTemplate, round.DealerHand, round.PlayerHand, result)) + return + } + if dealerPoint != 8 && dealerPoint != 9 { + result = fmt.Sprintf("闲家%d点, 庄家%d点, 闲家补牌\n", playerPoint, dealerPoint) + round.PlayerHand = append(round.PlayerHand, round.Deck.Pop()) + playerPoint = CalculateCardPoint(round.PlayerHand) + playerHaveThirdCard = true + } + } + + if dealerPoint == 0 || dealerPoint == 1 || dealerPoint == 2 { + result += fmt.Sprintf("庄家%d点, 庄家补牌\n", dealerPoint) + round.DealerHand = append(round.DealerHand, round.Deck.Pop()) + } + if dealerPoint == 3 && playerHaveThirdCard { + if round.PlayerHand[2].String()[:1] != "8" { + result += fmt.Sprintf("庄家%d点, 庄家补牌\n", dealerPoint) + round.DealerHand = append(round.DealerHand, round.Deck.Pop()) + } + } + if dealerPoint == 4 && playerHaveThirdCard { + playerThirdCard := round.PlayerHand[2].String()[:1] + if playerThirdCard == "2" || playerThirdCard == "3" || playerThirdCard == "4" || playerThirdCard == "5" || playerThirdCard == "6" || playerThirdCard == "7" { + result += fmt.Sprintf("庄家%d点, 庄家补牌\n", dealerPoint) + round.DealerHand = append(round.DealerHand, round.Deck.Pop()) + } + } + if dealerPoint == 5 && playerHaveThirdCard { + playerThirdCard := round.PlayerHand[2].String()[:1] + if playerThirdCard == "4" || playerThirdCard == "5" || playerThirdCard == "6" || playerThirdCard == "7" { + result += fmt.Sprintf("庄家%d点, 庄家补牌\n", dealerPoint) + round.DealerHand = append(round.DealerHand, round.Deck.Pop()) + } + } + if dealerPoint == 6 && playerHaveThirdCard { + playerThirdCard := round.PlayerHand[2].String()[:1] + if playerThirdCard == "6" || playerThirdCard == "7" { + result += fmt.Sprintf("庄家%d点, 庄家补牌\n", dealerPoint) + round.DealerHand = append(round.DealerHand, round.Deck.Pop()) + } + } + + dealerFinalPoint := CalculateCardPoint(round.DealerHand) + playerFinalPoint := CalculateCardPoint(round.PlayerHand) + + if dealerFinalPoint > playerFinalPoint { + result += "庄赢\n" + if bet == "庄" { + result += fmt.Sprintf("恭喜你赢得了本局游戏, 你赢得了%d", round.Bet) + // 庄赢时, 闲家下注金额的5%作为佣金 + redisrepo.AddUserBalance(ctx.Event.UserID, decimal.NewFromInt(round.Bet).Mul(decimal.NewFromFloat(0.95)).IntPart()) + } else { + result += "很遗憾, 你输了本局游戏" + redisrepo.SubUserBalance(ctx.Event.UserID, betAmount) + } + } + if dealerFinalPoint < playerFinalPoint { + result += "闲赢\n" + if bet == "闲" { + result += fmt.Sprintf("恭喜你赢得了本局游戏, 你赢得了%d", round.Bet) + redisrepo.AddUserBalance(ctx.Event.UserID, betAmount) + } else { + result += "很遗憾, 你输了本局游戏" + redisrepo.SubUserBalance(ctx.Event.UserID, betAmount) + } + } + if dealerFinalPoint == playerFinalPoint { + result += "平局\n" + if bet == "和" { + result += fmt.Sprintf("恭喜你赢得了本局游戏, 你赢得了%d", decimal.NewFromInt(round.Bet).Mul(decimal.NewFromInt(8)).IntPart()) + redisrepo.AddUserBalance(ctx.Event.UserID, decimal.NewFromInt(round.Bet).Mul(decimal.NewFromInt(8)).IntPart()) + } else { + result += "很遗憾, 你输了本局游戏" + redisrepo.SubUserBalance(ctx.Event.UserID, betAmount) + } + } +} + +func CalculateCardPoint(cards []hand.Card) (point int) { + for _, card := range cards { + cardStr := card.String()[:1] + point += ScoreMap()[cardStr] + } + point %= 10 + return +} + +func ScoreMap() map[string]int { + return map[string]int{ + "T": 0, + "J": 0, + "Q": 0, + "K": 0, + "A": 1, + "2": 2, + "3": 3, + "4": 4, + "5": 5, + "6": 6, + "7": 7, + "8": 8, + "9": 9, + } +} diff --git a/plugin/baccarat/cache.go b/plugin/baccarat/cache.go new file mode 100644 index 0000000..8800797 --- /dev/null +++ b/plugin/baccarat/cache.go @@ -0,0 +1,30 @@ +package baccarat + +import ( + "math/rand" + "sync" + "time" + + "github.com/google/uuid" + "github.com/notnil/joker/pkg/hand" +) + +var RoundMap sync.Map + +type Round struct { + ID string + Deck *hand.Deck + DealerHand []hand.Card + PlayerHand []hand.Card + Bet int64 +} + +func NewRound(bet int64) *Round { + return &Round{ + ID: uuid.New().String(), + Deck: hand.NewDealer(rand.New(rand.NewSource(time.Now().Unix()))).Deck(), + DealerHand: []hand.Card{}, + PlayerHand: []hand.Card{}, + Bet: bet, + } +} diff --git a/router/router.go b/router/router.go index 8ae388b..e7ed08c 100644 --- a/router/router.go +++ b/router/router.go @@ -2,6 +2,7 @@ package router import ( "amor/plugin" + "amor/plugin/baccarat" "amor/plugin/blackjack" "amor/plugin/chips" "amor/plugin/member" @@ -10,7 +11,7 @@ import ( ) func Router() { - // 注册 + // // 注册 zero.OnFullMatch("register").Handle(member.Register) // 筹码余额 @@ -27,4 +28,7 @@ func Router() { zero.OnFullMatch("hit").Handle(blackjack.Hit) zero.OnFullMatch("stand").Handle(blackjack.Stand) zero.OnFullMatch("double").Handle(blackjack.Double) + + // 百家乐 + zero.OnCommand("bjl").Handle(baccarat.Entry) }