/// <summary> /// 将太高分的玩家筛选出去 /// </summary> private void FilterHighScore(LadderInfoEntity ladderInfo) { //换规则先不用这个了 //var managerFightList = ladderInfo.FightList; //var competitorCount = managerFightList.Count; //try //{ // managerFightList.Sort(new CompareArenaManager()); // List<LadderManagerEntity> tmpFightList = new List<LadderManagerEntity>(); // for (int i = competitorCount - 1; i >= 1; ) //最后一个不管 // { // if (managerFightList[i].Score - managerFightList[i - 1].Score >= _arenaHighScore)//两两相比 // { // LadderCore.Instance.PushFightToCompetitor(managerFightList[i].Clone()); // i--; // } // else // { // tmpFightList.Add(managerFightList[i].Clone()); // tmpFightList.Add(managerFightList[i-1].Clone()); // i = i - 2; // } // } // tmpFightList.Add(managerFightList[0].Clone()); // ladderInfo.FightList = tmpFightList; //} //catch (Exception ex) //{ // SystemlogMgr.Error("LadderThread-BuildBot", ex.Message, ex.StackTrace); //} }
/// <summary> /// Builds the bot. /// </summary> private void BuildBot(LadderInfoEntity ladderInfo) { var managerFightList = ladderInfo.FightList; var competitorCount = managerFightList.Count; try { var botCount = 4 - competitorCount % 4; if (botCount > 0 && botCount < 4) { managerFightList.Sort(new CompareArenaManager()); var minScore = managerFightList[0].Score; var maxScore = managerFightList[competitorCount - 1].Score; var botList = LadderManagerMgr.GetBot(botCount, minScore, maxScore); if (botList != null) { foreach (var list in botList) { list.Name = _botName; list.IsBot = true; managerFightList.Add(list); } } } } catch (Exception ex) { SystemlogMgr.Error("LadderThread-BuildBot", ex.Message, ex.StackTrace); } }
/// <summary> /// Runs the arena. /// </summary> void RunLadder() { _needClearFightDic = false; LadderInfoEntity ladderInfo = LadderCore.Instance.GetCompetitorToMatch(); //更新最近一次平均等待时间 var avgWaitTime = CalAvgWaitSecond(ladderInfo.GroupingTime, ladderInfo.FightList); LadderCore.Instance.RecentlyAvgWaitSecond = avgWaitTime; //开始获取机器人 BuildBot(ladderInfo); var playerNumber = ladderInfo.FightList.Count; if (playerNumber % 4 != 0)//检查玩家数量是否是4的倍数 { //将天梯赛服务状态置为结束 LadderCore.Instance.Status = EnumLadderStatus.End; //将上一轮比赛的经理池清空,暂时没有异常回退方案 LadderCore.Instance.ManagerFightDic = new Dictionary <Guid, Guid>(); SystemlogMgr.Info("LadderThread", "The player is " + playerNumber.ToString() + " not multiple of 4"); return; } //开始分组 var fightDic = new ConcurrentDictionary <Guid, LadderMatchEntity>(); Grouping(ladderInfo, fightDic); LadderRunEnd(); //将天梯赛数据扔到Process中 ladderInfo.CountdownTime = DateTime.Now; ladderInfo.PlayerNumber = playerNumber; ladderInfo.AvgWaitTime = avgWaitTime; _nbThreadPool.Add(() => RunMatch(fightDic, ladderInfo)); }
/// <summary> /// Groupings the specified arena ladder. /// </summary> /// <param name="ladderInfo">The arena ladder.</param> /// <param name="fightDic">The fight dic.</param> private void Grouping(LadderInfoEntity ladderInfo, ConcurrentDictionary <Guid, LadderMatchEntity> fightDic) { var managerFightList = ladderInfo.FightList; managerFightList.Sort(new CompareArenaManager()); //按4的倍数将玩家分组 //改成每8个乱序,由于玩家数量是4的倍数 //如果是奇数组,则先把第一组特殊处理,后面每两组乱序 var groups = managerFightList.Count / 4; int i = 0; if (groups % 2 == 1) //奇数 { int[] groupTemplate = GetGroupTemplate(); BuildFightInfo(managerFightList, ladderInfo.Idx, i, 0, groupTemplate, fightDic);//第0组 i = 1; } if (groups > 1) { int[] groupTemplate = GetGroupTemplate(); for (; i < groups; i = i + 2) { BuildFightInfo(managerFightList, ladderInfo.Idx, i, 0, groupTemplate, fightDic); BuildFightInfo(managerFightList, ladderInfo.Idx, i, 1, groupTemplate, fightDic); } } }
/// <summary> /// 带事务的Update /// </summary> /// <param name="entity"></param> /// <param name="trans">The trans.</param> /// <returns></returns> /// <remarks>2016/1/11 15:05:16</remarks> public bool Update(LadderInfoEntity entity, DbTransaction trans = null) { var database = new SqlDatabase(this.ConnectionString); DbCommand commandWrapper = database.GetStoredProcCommand("dbo.P_LadderInfo_Update"); database.AddInParameter(commandWrapper, "@Idx", DbType.Guid, entity.Idx); database.AddInParameter(commandWrapper, "@AvgWaitTime", DbType.Int32, entity.AvgWaitTime); database.AddInParameter(commandWrapper, "@PlayerNumber", DbType.Int32, entity.PlayerNumber); database.AddInParameter(commandWrapper, "@Groups", DbType.Int32, entity.Groups); database.AddInParameter(commandWrapper, "@Season", DbType.Int32, entity.Season); database.AddInParameter(commandWrapper, "@StartTime", DbType.DateTime, entity.StartTime); database.AddInParameter(commandWrapper, "@GroupingTime", DbType.DateTime, entity.GroupingTime); database.AddInParameter(commandWrapper, "@CountdownTime", DbType.DateTime, entity.CountdownTime); database.AddInParameter(commandWrapper, "@Status", DbType.Int32, entity.Status); database.AddInParameter(commandWrapper, "@RowTime", DbType.DateTime, entity.RowTime); database.AddInParameter(commandWrapper, "@UpdateTime", DbType.DateTime, entity.UpdateTime); int results = 0; if (trans != null) { results = database.ExecuteNonQuery(commandWrapper, trans); } else { results = database.ExecuteNonQuery(commandWrapper); } entity.Idx = (System.Guid)database.GetParameterValue(commandWrapper, "@Idx"); return(Convert.ToBoolean(results)); }
/// <summary> /// 将加入本轮天梯赛的经理推进比赛池. /// </summary> /// <returns></returns> public LadderInfoEntity GetCompetitorToMatch() { //将状态置为分组 var fightList = new List <LadderManagerEntity>(); var arenaLadder = new LadderInfoEntity(); lock (_competitorLock) { ManagerFightDic = new Dictionary <Guid, Guid>(); foreach (var dic in CompetitorDic) { //将经理推进比赛池 ManagerFightDic.Add(dic.Key, Guid.Empty); fightList.Add(dic.Value); } Status = EnumLadderStatus.Grouping; arenaLadder.Idx = ShareUtil.GenerateComb(); arenaLadder.FightList = fightList; arenaLadder.StartTime = StartTime; arenaLadder.GroupingTime = DateTime.Now; //开始新一轮报名 CreateLadder(); } return(arenaLadder); }
//int winExp = 0; //int drawExp = 0; //int loseExp = 0; //int winCoin = 0; //int drawCoin = 0; //int loseCoin = 0; public LadderProcess(ConcurrentDictionary <Guid, LadderMatchEntity> fightDic, LadderInfoEntity ladderInfo, int ladderProctiveScore, bool isGuide = false) { _nbThreadPool = new NBThreadPool(10); this._fightDic = fightDic; this._ladderProctiveScore = ladderProctiveScore; _ladderInfo = ladderInfo; this.isGuide = isGuide; }
/// <summary> /// 将IDataReader的当前记录读取到LadderInfoEntity 对象 /// </summary> /// <param name="reader"></param> /// <returns></returns> public LadderInfoEntity LoadSingleRow(IDataReader reader) { var obj = new LadderInfoEntity(); obj.Idx = (System.Guid)reader["Idx"]; obj.AvgWaitTime = (System.Int32)reader["AvgWaitTime"]; obj.PlayerNumber = (System.Int32)reader["PlayerNumber"]; obj.Groups = (System.Int32)reader["Groups"]; obj.Season = (System.Int32)reader["Season"]; obj.StartTime = (System.DateTime)reader["StartTime"]; obj.GroupingTime = (System.DateTime)reader["GroupingTime"]; obj.CountdownTime = (System.DateTime)reader["CountdownTime"]; obj.Status = (System.Int32)reader["Status"]; obj.RowTime = (System.DateTime)reader["RowTime"]; obj.UpdateTime = (System.DateTime)reader["UpdateTime"]; return(obj); }
/// <summary> /// GetById /// </summary> /// <param name="idx">idx</param> /// <returns>LadderInfoEntity</returns> /// <remarks>2016/1/11 15:05:16</remarks> public LadderInfoEntity GetById(System.Guid idx) { var database = new SqlDatabase(this.ConnectionString); DbCommand commandWrapper = database.GetStoredProcCommand("P_LadderInfo_GetById"); database.AddInParameter(commandWrapper, "@Idx", DbType.Guid, idx); LadderInfoEntity obj = null; using (IDataReader reader = database.ExecuteReader(commandWrapper)) { if (reader.Read()) { obj = LoadSingleRow(reader); } } return(obj); }
/// <summary> /// Runs the arena match. /// </summary> void RunMatch() { if (_fightDic == null) { return; } foreach (var item in _fightDic.Values) { var matchHome = new MatchManagerInfo(item.HomeId, false, item.HomeIsBot); var matchAway = new MatchManagerInfo(item.AwayId, false, item.AwayIsBot); if (isGuide)//引导。 必胜 { matchHome.BuffScale = 200; matchAway.BuffScale = 50; } var matchData = new BaseMatchData((int)EnumMatchType.Ladder, item.Idx, matchHome, matchAway); matchData.ErrorCode = (int)MessageCode.MatchWait; MemcachedFactory.MatchClient.Set(matchData.MatchId, matchData); //使用多线程 _nbThreadPool.Add(() => Fight(matchData, item)); } _nbThreadPool.WaitAll(); _ladderInfo.Groups = _fightDic.Count; _ladderInfo.RowTime = DateTime.Now; _ladderInfo.Season = 1; _ladderInfo.Status = 2; _ladderInfo.UpdateTime = DateTime.Now; _ladderInfo.FightList = null; _fightDic = null; LadderInfoMgr.Insert(_ladderInfo); _ladderInfo = null; }
public static bool Update(LadderInfoEntity ladderInfoEntity, DbTransaction trans = null, string zoneId = "") { var provider = new LadderInfoProvider(zoneId); return(provider.Update(ladderInfoEntity, trans)); }
void RunMatch(ConcurrentDictionary <Guid, LadderMatchEntity> fightDic, LadderInfoEntity ladderInfo) { var process = new LadderProcess(fightDic, ladderInfo, _ladderProctiveScore); process.StartProcess(); }
/// <summary> /// 引导比赛 /// </summary> /// <param name="managerId"></param> /// <returns></returns> private MessageCodeResponse GuideMatch(Guid managerId) { var manager = ManagerCore.Instance.GetManager(managerId); if (manager == null) { return(ResponseHelper.Create <MessageCodeResponse>(MessageCode.NbParameterError)); } var arenaManager = InnerGetLadderManager(managerId); if (arenaManager == null) { return(ResponseHelper.Create <MessageCodeResponse>(MessageCode.NbParameterError)); } if (ManagerGuideFightDic == null) { ManagerGuideFightDic = new Dictionary <Guid, Guid>(); } var laddermanager = GetLadderManager(managerId); if (laddermanager.MatchTime > 0) { return(ResponseHelper.Create <MessageCodeResponse>(MessageCode.NbParameterError)); } LadderManagerEntity bot = new LadderManagerEntity(); var botList = LadderManagerMgr.GetBot(1, 0, 1201); if (botList != null) { bot = botList[0]; bot.Name = "送分小王子"; bot.IsBot = true; bot.Score = laddermanager.Score; } laddermanager.IsBot = false; laddermanager.Name = manager.Name; laddermanager.UpdateTime = DateTime.Now; laddermanager.HasTask = true; var ladderInfo = new LadderInfoEntity(); ladderInfo.Idx = ShareUtil.GenerateComb(); ladderInfo.FightList = new List <LadderManagerEntity>() { laddermanager, bot }; ladderInfo.StartTime = DateTime.Now; ladderInfo.GroupingTime = DateTime.Now; ladderInfo.CountdownTime = DateTime.Now; ladderInfo.CountdownTime = DateTime.Now.AddSeconds(1); ladderInfo.PlayerNumber = 2; ladderInfo.AvgWaitTime = 2; var matchId = ShareUtil.GenerateComb(); var ladderMatch = new LadderMatchEntity(laddermanager, bot, matchId, ladderInfo.Idx, 1); ConcurrentDictionary <Guid, LadderMatchEntity> fightDic = new ConcurrentDictionary <Guid, LadderMatchEntity>(); fightDic.TryAdd(ladderMatch.Idx, ladderMatch); MemcachedFactory.LadderMatchClient.Set(ladderMatch.Idx, ladderMatch); var process = new LadderProcess(fightDic, ladderInfo, LadderThread.Instance._ladderProctiveScore, true); process.StartProcess(); if (!ManagerGuideFightDic.ContainsKey(managerId)) { ManagerGuideFightDic.Add(managerId, matchId); } return(ResponseHelper.Create <MessageCodeResponse>(MessageCode.Success)); }