123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- package teen
- import (
- "math/rand"
- "server/common"
- "server/game"
- "server/game/room"
- "server/msg"
- "time"
- "github.com/name5566/leaf/log"
- )
- // 向每个玩家发送当前回合的房间信息和玩家信息
- func sendCurrentRoundInfo(teenPattiRoom *room.Room) {
- for _, player := range teenPattiRoom.Players {
- if player.Agent != nil {
- nextRoundInfo := &msg.NextRound{
- Info: &msg.ReqJoinRoom{
- UserId: player.Id, // 设置当前玩家的 ID
- GameId: "teen_patti",
- RoomId: teenPattiRoom.Id,
- SitPos: player.SitPos,
- RoomInfo: buildRoom(teenPattiRoom), // 获取房间信息
- },
- }
- // 发送 NextRound 消息
- player.Agent.WriteMsg(nextRoundInfo)
- log.Debug("Sent current round info to player %v in room %v", player.Id, teenPattiRoom.Id)
- }
- }
- }
- // 打印 teenPattiRoom.Players 的详细信息
- func printPlayersInfo(teenPattiRoom *room.Room) {
- // 打印房间中的每个玩家
- for i, player := range teenPattiRoom.Players {
- if player != nil {
- log.Debug("Player %d: ID=%v, SitPos=%v, IsRobot=%v, Nickname=%v",
- i, player.Id, player.SitPos, player.IsRobot)
- } else {
- log.Debug("Player %d: Empty", i)
- }
- }
- }
- // 获取房间中所有空闲的座位号
- func getAvailableSitPos(teenPattiRoom *room.Room) []int32 {
- // 假设一个房间最多有 5 个座位
- maxSeats := int32(5)
- availableSitPos := []int32{}
- // 创建一个已占用座位的集合
- occupiedSeats := make(map[int32]bool)
- // 遍历当前房间的所有玩家
- for _, player := range teenPattiRoom.Players {
- if player != nil {
- occupiedSeats[player.SitPos] = true // 标记已占用的座位
- }
- }
- // 检查哪些座位没有被占用
- for i := int32(0); i < maxSeats; i++ { // 使用 int32 类型
- if !occupiedSeats[i] {
- availableSitPos = append(availableSitPos, i) // 如果座位没有被占用,加入空闲座位列表
- }
- }
- // 返回空闲座位的列表
- return availableSitPos
- }
- func removeOfflinePlayers(teenPattiRoom *room.Room) {
- // 遍历玩家列表,找出离线玩家
- for _, player := range teenPattiRoom.Players {
- if !player.IsRobot && player.Agent != nil {
- userData, ok := player.Agent.UserData().(*common.UserData)
- if !ok || userData == nil {
- continue // 避免崩溃
- }
- // 判断是否离线
- if userData.Status == 0 {
- // 直接调用 LeaveTeenPattiRoom 移除玩家
- LeaveTeenPattiRoom(teenPattiRoom, player.Id, "0")
- }
- }
- }
- }
- // 过滤出非机器人的玩家
- func filterNonRobotPlayers(teenPattiRoom *room.Room) []*room.Player {
- var players []*room.Player
- for _, player := range teenPattiRoom.Players {
- if !player.IsRobot {
- players = append(players, player)
- }
- }
- return players
- }
- // 初始化游戏
- func startNextRound(teenPattiRoom *room.Room) {
- teenPattiRoom.Status = room.RoomStatusWaiting
- var currentDealerSitPos int32 = -1
- removeOfflinePlayers(teenPattiRoom)
- // 计算房间内的非机器人玩家数量
- nonRobotPlayers := filterNonRobotPlayers(teenPattiRoom)
- if len(nonRobotPlayers) == 0 {
- // 没有真人玩家了,解散房间
- log.Debug("Room %v dissolved due to no players left.", teenPattiRoom.Id)
- // 执行解散房间的逻辑,比如通知玩家、释放资源等
- dissolveRoom(teenPattiRoom)
- return
- }
- // 加减机器人
- adjustRobotCount(teenPattiRoom)
- // 清理上一回合的玩家状态
- for _, player := range teenPattiRoom.Players {
- // 如果该玩家是庄家,记录下座位号
- if player.IsDealer {
- currentDealerSitPos = player.SitPos
- }
- player.IsPacked = false
- player.IsSeen = false
- player.IsShow = false
- player.IsDealer = false // 清空上一回合的庄家状态
- player.CanShow = false
- player.HandCards = []*msg.ReqCard{}
- }
- // 增加回合计数
- teenPattiRoom.Round++
- // 更新回合信息
- // teenPattiRoom.GameRound.Rounds = append(teenPattiRoom.GameRound.Rounds, &msg.ReqRound{
- // Round: int32(teenPattiRoom.Round),
- // })
- // 初始化回合数据
- // 旧的需要入库吗?
- teenPattiRoom.GameRound.Rounds = []*msg.ReqRound{}
- teenPattiRoom.GameRound.TotalBet = 0 // 重置总下注
- // 重置下注金额区间
- confInfo := loadTeemConf(teenPattiRoom.ConfId)
- teenPattiRoom.GameRound.ResBet = confInfo
- // 更新座位状态,假设 SelfSitPos 和 RoundSitPos 已正确设置
- teenPattiRoom.RoundSitPos = 0 // 开始新回合,座位重置
- // 设置新的庄家
- setNextDealerSitPos(teenPattiRoom, currentDealerSitPos)
- // 开始下一回合
- log.Debug("Starting round %d for room %s", teenPattiRoom.Round, teenPattiRoom.Id)
- // 向每个玩家发送当前回合的玩家信息
- sendCurrentRoundInfo(teenPattiRoom)
- // room.SaveRoomToRedis(teenPattiRoom)
- // 2秒后开始发牌
- game.Module.Skeleton.AfterFunc(time.Second*2, func() {
- log.Debug("---------------------------------------------------------------------------------------")
- log.Debug("startDealCard(teenPattiRoom) %v in room %v")
- printPlayersInfo(teenPattiRoom)
- go startDealCard(teenPattiRoom) // 继续发牌
- })
- }
- // 调整房间中的机器人数量
- func adjustRobotCount(teenPattiRoom *room.Room) {
- // 初始化随机数生成器
- random := rand.New(rand.NewSource(time.Now().UnixNano()))
- // 随机加减人数,确保人数在2到5之间
- currentPlayerCount := len(teenPattiRoom.Players)
- newPlayerCount := currentPlayerCount
- // 生成随机数来决定是否加人或减人
- if random.Intn(2) == 0 && newPlayerCount < 5 { // 50%几率加一个玩家,且最多不超过5人
- newPlayerCount++
- } else if random.Intn(3) == 0 && newPlayerCount > 2 { // 如果有更多于2个玩家,且随机选择去除玩家
- newPlayerCount--
- }
- // 打印 currentPlayerCount 和 newPlayerCount
- log.Debug("currentPlayerCount: %v", currentPlayerCount)
- log.Debug("newPlayerCount: %v", newPlayerCount)
- // 如果人数发生变化,则调整玩家数量
- if newPlayerCount != currentPlayerCount {
- if newPlayerCount > currentPlayerCount {
- // 获取空闲的座位
- availableSitPos := getAvailableSitPos(teenPattiRoom)
- // 如果没有空座位,不能再加入机器人
- if len(availableSitPos) == 0 {
- log.Debug("No available seats for new robot in room %v", teenPattiRoom.Id)
- return
- }
- // 加入新机器人
- addNewRobot(teenPattiRoom, availableSitPos)
- log.Debug("addNewRobot: %v")
- } else {
- // 随机去除一个机器人
- removeRandomRobot(teenPattiRoom)
- log.Debug("removeRandomRobot: %v")
- }
- }
- }
|