public CrossLadderProcess(Dictionary <Guid, CrossladderMatchEntity> fightDic, CrossladderInfoEntity ladderInfo, int ladderProctiveScore) { _nbThreadPool = new NBThreadPool(10); this._fightDic = fightDic; this._ladderProctiveScore = ladderProctiveScore; _ladderInfo = ladderInfo; }
/// <summary> /// Runs the arena match. /// </summary> void RunMatch() { if (_fightDic == null) { return; } foreach (var item in _fightDic.Values) { var matchHome = new MatchManagerInfo(item.HomeId, item.HomeSiteId, false, item.HomeIsBot); var matchAway = new MatchManagerInfo(item.AwayId, item.AwaySiteId, false, item.AwayIsBot); var matchData = new BaseMatchData((int)EnumMatchType.CrossLadder, 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 = CacheFactory.CrossLadderCache.GetCurrentSeasonIndex(); _ladderInfo.Status = 2; _ladderInfo.UpdateTime = DateTime.Now; _ladderInfo.FightList = null; _fightDic = null; CrossladderInfoMgr.Insert(_ladderInfo); _ladderInfo = null; }
/// <summary> /// 将加入本轮天梯赛的经理推进比赛池. /// </summary> /// <returns></returns> public CrossladderInfoEntity GetCompetitorToMatch() { //将状态置为分组 var fightList = new List <CrossladderManagerEntity>(); var arenaLadder = new CrossladderInfoEntity(); lock (_competitorLock) { ManagerFightDic = new Dictionary <Guid, CrossLadderHeartEntity>(); foreach (var dic in CompetitorDic) { //将经理推进比赛池 ManagerFightDic.Add(dic.Key, null); fightList.Add(dic.Value); } _status = EnumLadderStatus.Grouping; arenaLadder.Idx = ShareUtil.GenerateComb(); arenaLadder.FightList = fightList; arenaLadder.StartTime = _startTime; arenaLadder.GroupingTime = DateTime.Now; //开始新一轮报名 CreateLadder(); } return(arenaLadder); }
/// <summary> /// Groupings the specified arena ladder. /// </summary> /// <param name="ladderInfo">The arena ladder.</param> /// <param name="fightDic">The fight dic.</param> private void Grouping(CrossladderInfoEntity ladderInfo, Dictionary <Guid, CrossladderMatchEntity> 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> /// Builds the bot. /// </summary> private void BuildBot(CrossladderInfoEntity 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 = CrossladderManagerMgr.GetBot(botCount, minScore, maxScore); if (botList != null) { foreach (var list in botList) { list.Name = _botName; list.ShowName = _botName; list.IsBot = true; managerFightList.Add(list); } } } } catch (Exception ex) { SystemlogMgr.Error("CrossLadderThread-BuildBot", ex.Message, ex.StackTrace); } }
/// <summary> /// Runs the arena. /// </summary> void RunLadder() { _needClearFightDic = false; CrossladderInfoEntity ladderInfo = GetCompetitorToMatch(); //更新最近一次平均等待时间 var avgWaitTime = CalAvgWaitSecond(ladderInfo.GroupingTime, ladderInfo.FightList); RecentlyAvgWaitSecond = avgWaitTime; //开始获取机器人 BuildBot(ladderInfo); var playerNumber = ladderInfo.FightList.Count; if (playerNumber % 4 != 0)//检查玩家数量是否是4的倍数 { //将天梯赛服务状态置为结束 _status = EnumLadderStatus.End; //将上一轮比赛的经理池清空,暂时没有异常回退方案 ManagerFightDic = new Dictionary <Guid, CrossLadderHeartEntity>(); SystemlogMgr.Info("CrossLadderThread", "The player is " + playerNumber.ToString() + " not multiple of 4"); return; } //开始分组 var fightDic = new Dictionary <Guid, CrossladderMatchEntity>(); Grouping(ladderInfo, fightDic); LadderRunEnd(); //将天梯赛数据扔到Process中 ladderInfo.CountdownTime = DateTime.Now; ladderInfo.PlayerNumber = playerNumber; ladderInfo.AvgWaitTime = avgWaitTime; _nbThreadPool.Add(() => RunMatch(fightDic, ladderInfo)); }
/// <summary> /// 将太高分的玩家筛选出去 /// </summary> private void FilterHighScore(CrossladderInfoEntity ladderInfo) { //换规则先不用这个了 //var managerFightList = ladderInfo.FightList; //var competitorCount = managerFightList.Count; //try //{ // managerFightList.Sort(new CompareArenaManager()); // List<CrossladderManagerEntity> tmpFightList = new List<CrossladderManagerEntity>(); // for (int i = competitorCount - 1; i >= 1; ) //最后一个不管 // { // if (managerFightList[i].Score - managerFightList[i - 1].Score >= _arenaHighScore)//两两相比 // { // CrossLadderCore.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("CrossLadderThread-BuildBot", ex.Message, ex.StackTrace); //} }
/// <summary> /// 带事务的Update /// </summary> /// <param name="entity"></param> /// <param name="trans">The trans.</param> /// <returns></returns> /// <remarks>2016-08-30 15:59:04</remarks> public bool Update(CrossladderInfoEntity entity, DbTransaction trans) { var database = new SqlDatabase(this.ConnectionString); DbCommand commandWrapper = database.GetStoredProcCommand("dbo.P_CrossladderInfo_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> /// 将IDataReader的当前记录读取到CrossladderInfoEntity 对象 /// </summary> /// <param name="reader"></param> /// <returns></returns> public CrossladderInfoEntity LoadSingleRow(IDataReader reader) { var obj = new CrossladderInfoEntity(); 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>CrossladderInfoEntity</returns> /// <remarks>2016-08-30 15:59:04</remarks> public CrossladderInfoEntity GetById(System.Guid idx) { var database = new SqlDatabase(this.ConnectionString); DbCommand commandWrapper = database.GetStoredProcCommand("P_CrossladderInfo_GetById"); database.AddInParameter(commandWrapper, "@Idx", DbType.Guid, idx); CrossladderInfoEntity obj = null; using (IDataReader reader = database.ExecuteReader(commandWrapper)) { if (reader.Read()) { obj = LoadSingleRow(reader); } } return(obj); }
public static bool Update(CrossladderInfoEntity crossladderInfoEntity, DbTransaction trans = null, string zoneId = "") { var provider = new CrossladderInfoProvider(zoneId); return(provider.Update(crossladderInfoEntity, trans)); }
void RunMatch(Dictionary <Guid, CrossladderMatchEntity> fightDic, CrossladderInfoEntity ladderInfo) { var process = new CrossLadderProcess(fightDic, ladderInfo, _ladderProctiveScore); process.StartProcess(); }
/// <summary> /// Update /// </summary> /// <param name="entity"></param> /// <returns></returns> /// <remarks>2016-08-30 15:59:04</remarks> public bool Update(CrossladderInfoEntity entity) { return(Update(entity, null)); }
/// <summary> /// Insert /// </summary> /// <param name="entity"></param> /// <param name="trans">The trans.</param> /// <returns></returns> /// <remarks>2016-08-30 15:59:04</remarks> public bool Insert(CrossladderInfoEntity entity) { return(Insert(entity, null)); }