示例#1
0
        //单循环
        protected Boolean _Create(Int32 nPlayerCnt, Boolean bUseBegol)
        {
            //2. 生成此轮中用的队员序列
            //CArray<int, int> aryRound;
            ArrayList aryRound        = new ArrayList();
            int       nPlayerCntInAry = 0;

            {
                for (Int32 nCycPlayer = 0; nCycPlayer < nPlayerCnt; nCycPlayer++)
                {
                    aryRound.Add(nCycPlayer + 1);       //从1开始
                }

                //如果队员是单数,添加轮空用的0号队
                if (nPlayerCnt % 2 == 1)
                {
                    if (bUseBegol)
                    {
                        aryRound.Add(0);        //贝格尔算法时,轮空加在最后
                    }
                    else
                    {
                        aryRound.Add(0);        //普通单循环,轮空加在最后
                    }
                }

                nPlayerCntInAry = aryRound.Count;
                //ASSERT(nPlayerCntInAry % 2 == 0);
            }

            //3. 循环生成本组比赛对阵
            m_oGroup.SetPlayerCnt((Byte)nPlayerCnt); //为一个组手动 加上有多少只参赛队 的信息

            Int32 nRoundCnt = nPlayerCntInAry - 1;   // 奇数时已经算上了轮空

            for (Int32 nRound = 0; nRound < nRoundCnt; nRound++)
            {
                stRrRound matchRound = new stRrRound();

                for (int nMatch = 0; nMatch < nPlayerCntInAry / 2; nMatch++)
                {
                    stRrMatch matchObj = new stRrMatch();
                    matchObj.m_byPlayerL = Convert.ToByte(aryRound[nMatch]);                       //从前往后
                    matchObj.m_byPlayerR = Convert.ToByte(aryRound[nPlayerCntInAry - nMatch - 1]); //从后往前

                    //贝格尔算法下,奇数轮的第一场比赛,左右对调
                    if (bUseBegol && nRound % 2 == 1 && nMatch == 0)
                    {
                        Byte byTemp = matchObj.m_byPlayerL;
                        matchObj.m_byPlayerL = matchObj.m_byPlayerR;
                        matchObj.m_byPlayerR = byTemp;
                    }

                    matchRound.AddMatchObj(matchObj);
                }

                //把最后一位的数据挪到第二位,在贝格尔算法下,跳多位,相当于转多次
                if (!bUseBegol)
                {
                    Int32 nMoveTarget = Convert.ToInt32(aryRound[nPlayerCntInAry - 1]); //普通算法,就把最后一位挪到第二位
                    aryRound.RemoveAt(nPlayerCntInAry - 1);
                    aryRound.Insert(1, nMoveTarget);
                }
                else
                {
                    int nJump = _GetBegolJumpCnt(nPlayerCntInAry); //每次轮转的位数
                    for (int nCyc = 0; nCyc < nJump; nCyc++)
                    {
                        int nMoveTarget = Convert.ToInt32(aryRound[nPlayerCntInAry - 2]); //贝格尔,倒数第二位挪到第一位,挪多次
                        aryRound.RemoveAt(nPlayerCntInAry - 2);
                        aryRound.Insert(0, nMoveTarget);
                    }
                }

                m_oGroup.AddRoundObj(matchRound);
            }//For Round

            m_bIsUseBegol = bUseBegol;
            return(true);
        }