百家乐

This commit is contained in:
nothamor 2024-05-28 13:01:41 +08:00
parent c0d1178374
commit 101e16a488
3 changed files with 221 additions and 1 deletions

186
plugin/baccarat/baccarat.go Normal file
View File

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

30
plugin/baccarat/cache.go Normal file
View File

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

View File

@ -2,6 +2,7 @@ package router
import ( import (
"amor/plugin" "amor/plugin"
"amor/plugin/baccarat"
"amor/plugin/blackjack" "amor/plugin/blackjack"
"amor/plugin/chips" "amor/plugin/chips"
"amor/plugin/member" "amor/plugin/member"
@ -10,7 +11,7 @@ import (
) )
func Router() { func Router() {
// 注册 // // 注册
zero.OnFullMatch("register").Handle(member.Register) zero.OnFullMatch("register").Handle(member.Register)
// 筹码余额 // 筹码余额
@ -27,4 +28,7 @@ func Router() {
zero.OnFullMatch("hit").Handle(blackjack.Hit) zero.OnFullMatch("hit").Handle(blackjack.Hit)
zero.OnFullMatch("stand").Handle(blackjack.Stand) zero.OnFullMatch("stand").Handle(blackjack.Stand)
zero.OnFullMatch("double").Handle(blackjack.Double) zero.OnFullMatch("double").Handle(blackjack.Double)
// 百家乐
zero.OnCommand("bjl").Handle(baccarat.Entry)
} }