package main import ( "fmt" "mongo.games.com/game/common" ) var sceneLimitMgr = SceneLimitManager{ SameRoomData: make(map[string][][]int32), } type SceneLimitManager struct { SameRoomData map[string][][]int32 //用户的同房数据,保存了用户一局游戏中,房间人员的SNID } func (m *SceneLimitManager) Key(gameid, snid int32) string { return fmt.Sprintf("%v-%v", snid, gameid) } // LimitSamePlace 连续同局检测 func (m *SceneLimitManager) LimitSamePlace(player *Player, s *Scene) bool { if player.IsRob { return false } key := m.Key(int32(s.gameId), player.SnId) var logArr = m.SameRoomData[key] var samePlaceLimit = int(s.dbGameFree.GetSamePlaceLimit()) if len(logArr) > samePlaceLimit { logArr = logArr[len(logArr)-samePlaceLimit:] m.SameRoomData[key] = logArr } //新用户的防伙牌数据中,有没有场景中用户的检查 for _, value := range s.players { if value.IsRob { continue } limitCount := 0 for _, log := range logArr { if common.InSliceInt32(log, value.SnId) { limitCount++ } } if limitCount >= samePlaceLimit { return true } } //场景中用户的防伙牌数据中,有没有新用户的检查 for _, value := range s.players { if value.IsRob { continue } key := m.Key(int32(s.gameId), value.SnId) var logArr = m.SameRoomData[key] limitCount := 0 for _, log := range logArr { if common.InSliceInt32(log, player.SnId) { limitCount++ } } if limitCount >= samePlaceLimit { return true } } return false } // LimitSamePlaceBySnid 连续同局检测 // limit 最大同局数 func (m *SceneLimitManager) LimitSamePlaceBySnid(member []*Player, player *Player, gameId, limit int32) bool { if player.IsRob { return false } key := m.Key(gameId, player.SnId) var logArr = m.SameRoomData[key] var samePlaceLimit = int(limit) if len(logArr) > samePlaceLimit { logArr = logArr[len(logArr)-samePlaceLimit:] m.SameRoomData[key] = logArr } //新用户的防伙牌数据中,有没有场景中用户的检查 for _, value := range member { if value.IsRob { continue } limitCount := 0 for _, log := range logArr { if common.InSliceInt32(log, value.SnId) { limitCount++ } } if limitCount >= samePlaceLimit { return true } } //场景中用户的防伙牌数据中,有没有新用户的检查 for _, value := range member { if value.IsRob { continue } key := m.Key(gameId, value.SnId) var logArr = m.SameRoomData[key] limitCount := 0 for _, log := range logArr { if common.InSliceInt32(log, player.SnId) { limitCount++ } } if limitCount >= samePlaceLimit { return true } } return false } // ReceiveData 同局记录 func (m *SceneLimitManager) ReceiveData(gameid int32, data []int32) { for _, value := range data { key := m.Key(gameid, value) m.SameRoomData[key] = append(m.SameRoomData[key], data) } } // LimitAvgPlayer 人数的平均分配问题 func (m *SceneLimitManager) LimitAvgPlayer(s *Scene, totlePlayer int) bool { scenePlayerCount := s.GetTruePlayerCnt() switch { case totlePlayer > 1 && totlePlayer < 15: //4、如果游戏场的同时在线人数2-14人时,系统每2个人分一个桌,如果有剩余的没有分桌,随机找一个桌子进行分配; // 如果有机器人,系统加入机器人,并且保证同桌机器人数量1-3个 if scenePlayerCount > 2 { return true } case totlePlayer >= 15 && totlePlayer < 22: //5、如果游戏场的同时在线人数15-21人,系统每3个人分一个桌,如果有剩余的没有分桌,随机找一个桌子进行分配; // 如果有机器人,系统加入机器人,并且保证同桌机器人数量1-3个; if scenePlayerCount > 3 { return true } case totlePlayer >= 22 && totlePlayer < 29: //6、如果游戏场的同时在线人数22-28人,系统每4个人分一个桌,如果有剩余的没有分桌,随机找一个桌子进行分配; // 如果有机器人,系统加入机器人,并且保证同桌机器人数量1-3个; if scenePlayerCount > 4 { return true } case totlePlayer >= 29 && totlePlayer < 35: //7、如果游戏场的同时在线人数29-35人,系统每5个人分一个桌,如果有剩余的没有分桌,随机找一个桌子进行分配; if scenePlayerCount > 5 { return true } case totlePlayer >= 35 && totlePlayer < 42: //8、如果游戏场的同时在线人数36-42人,系统每6个人分一个桌,如果有剩余的没有分桌,随机找一个桌子进行分配; if scenePlayerCount > 6 { return true } case totlePlayer >= 43: //9、如果游戏场的同时在线人数43人以上时,系统每7个人分一个桌,如果有剩余的没有分桌,随机找一个桌子进行分配; if scenePlayerCount > 7 { return true } } return false }