Esempio n. 1
0
 public CrossLadderProcess(Dictionary <Guid, CrossladderMatchEntity> fightDic, CrossladderInfoEntity ladderInfo, int ladderProctiveScore)
 {
     _nbThreadPool             = new NBThreadPool(10);
     this._fightDic            = fightDic;
     this._ladderProctiveScore = ladderProctiveScore;
     _ladderInfo = ladderInfo;
 }
Esempio n. 2
0
        /// <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;
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
                }
            }
        }
Esempio n. 5
0
        /// <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);
            }
        }
Esempio n. 6
0
        /// <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));
        }
Esempio n. 7
0
 /// <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);
     //}
 }
Esempio n. 8
0
        /// <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));
        }
Esempio n. 9
0
        /// <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);
        }
Esempio n. 10
0
        /// <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);
        }
Esempio n. 11
0
        public static bool Update(CrossladderInfoEntity crossladderInfoEntity, DbTransaction trans = null, string zoneId = "")
        {
            var provider = new CrossladderInfoProvider(zoneId);

            return(provider.Update(crossladderInfoEntity, trans));
        }
Esempio n. 12
0
        void RunMatch(Dictionary <Guid, CrossladderMatchEntity> fightDic, CrossladderInfoEntity ladderInfo)
        {
            var process = new CrossLadderProcess(fightDic, ladderInfo, _ladderProctiveScore);

            process.StartProcess();
        }
Esempio n. 13
0
 /// <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));
 }
Esempio n. 14
0
 /// <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));
 }