//单循环 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); }