diff --git a/internal/game/player.go b/internal/game/player.go index e6ae62d..3099ae1 100644 --- a/internal/game/player.go +++ b/internal/game/player.go @@ -16,15 +16,16 @@ type Player struct { Username string Avatar string - Cards [2]*Card // 手牌 - Chip int32 // 玩家筹码 - TotalBetChip int32 // 本次游戏已下注筹码 - Status int32 // 状态: 1待准备开始,2已准备开始,3等待其他玩家动作,[4第一回合小盲注跟注,5待大盲注,5待小盲注,] 6待跟注,7已弃牌,8结算中 - BetOpts []int32 // status=[4,6]时下注可操作按钮: 1跟注,2加注(-[0]+),3All-In,4弃牌,5过牌 - BetMin int32 // 最低下注额 - BetMax int32 // 最高下注额 -1不限 - RoundBetTimes int32 // 当前回合下注次数 - Hand *Hand // 手牌牌型 + Cards [2]*Card // 手牌 + Chip int32 // 玩家筹码 + TotalBetChip int32 // 本次游戏已下注筹码 + Status int32 // 状态: 1待准备开始,2已准备开始,3等待其他玩家动作,[4第一回合小盲注跟注,5待大盲注,5待小盲注,] 6待跟注,7已弃牌,8结算中 + BetOpts []int32 // status=[4,6]时下注可操作按钮: 1跟注,2加注(-[0]+),3All-In,4弃牌,5过牌 + BetMin int32 // 最低下注额 + BetMax int32 // 最高下注额 -1不限 + RoundBetTimes int32 // 当前回合下注次数 + Hand *Hand // 手牌牌型 + RoundCheckRaiseOnly bool // 该回合仅过牌下注 GameTable *Table // 当前牌桌 ProtoWriter letter.ProtoWriter @@ -48,6 +49,7 @@ func (p *Player) RoundInit() { p.TotalBetChip = 0 p.Cards[0] = nil p.Cards[1] = nil + p.RoundCheckRaiseOnly = false } // WaitBet 将状态置为:3等待下注 diff --git a/internal/service/table.go b/internal/service/table.go index 4a40be2..bce2208 100644 --- a/internal/service/table.go +++ b/internal/service/table.go @@ -215,7 +215,7 @@ func HandleReqLeaveTable(player *game.Player, msg *api.ReqLeaveTable) (proto.Mes player.GameTable.PlayersLock.Lock() defer player.GameTable.PlayersLock.Unlock() - if player.GameTable.Stage != 1 { + if !collect.In(player.GameTable.Stage, 1, 7, 9) { return &api.ResFail{Msg: "牌局进行中不能退出"}, nil } if player.Status != 1 { @@ -532,13 +532,16 @@ func HandleReqBetting(player *game.Player, msg *api.ReqBetting) (proto.Message, } case 5: // 过牌 table.LastPosBetType = 5 - // player.RoundBetTimes++ + player.RoundBetTimes++ betNotice.Line2 = "过牌" default: return &api.ResFail{Msg: fmt.Sprintf("未知操作#%d", msg.BetType)}, nil } + // 第一轮只有未加注时大盲注可过牌,大盲注了不算只过牌 + player.RoundCheckRaiseOnly = msg.BetType == 5 && table.Stage != 2 + // 通知下注结果 if betNotice.Line1 != "" || betNotice.Line2 != "" { player.GameTable.NoticeAllPlayer(betNotice) @@ -556,16 +559,21 @@ func HandleReqBetting(player *game.Player, msg *api.ReqBetting) (proto.Message, // return &api.ResSuccess{}, nil //} - if !raise { - + if !raise { // 判断该轮开始过牌玩家 // 当前玩家未加注, 判断是否结束本轮下注 if nextPlayer.RoundBetTimes == player.RoundBetTimes { - // 开启下一轮 - err := table.RoundOver() - if err != nil { - return &api.ResFail{Code: 500, Msg: err.Error()}, nil + // 5 true -> next; !5 false -> next; !5 true -> continue + if !nextPlayer.RoundCheckRaiseOnly || table.LastPosBetType == 5 { + // 开启下一轮 + err := table.RoundOver() + if err != nil { + return &api.ResFail{Code: 500, Msg: err.Error()}, nil + } + return &api.ResSuccess{}, nil + } else { + // 下个玩家为过牌玩家,当前玩家已下注 + nextPlayer.RoundBetTimes-- } - return &api.ResSuccess{}, nil } }