Esempio n. 1
0
        private bool MakeBallsForPlaces(List <CPersonalItem> Members)
        {
            // Так как баллы начисляются НЕ БОЛЕЕ, чем 75% участников,
            // т.е. ВЕСЬ паровоз, выходящий за эту границу в расчет не принимается
            int MembersToCalcCount = (Members.Count * 3) / 4;

            // Последнее место участника в той части, где рассчитываем баллы
            int LastPlace          = Members[MembersToCalcCount - 1].m_Place;
            int AfterLastBalls     = 0;     // Число баллов, даваемых за место, следующее после LastPlace
            int SpecialTrainEndInd = 0;     // Номер строки, на которой заканчивается паровоз, _
                                            // выходящий за пределы 30-ого места
            int TrainBallsSumm         = 0; // Сумма "баллов за места" участников паровоза
            int CurPlace               = 0; // Текущее место
            List <CPersonalItem> Train = new List <CPersonalItem>();

            if (MembersToCalcCount < GlobalDefines.LAST_RESULT_PLACE_TO_CALC_BALLS)
            {
                // Проверяем факт того, что паровоз выходит за границу MembersToCalcCount
                if (Members[MembersToCalcCount - 1].m_Place == Members[MembersToCalcCount].m_Place)
                {
                    // Исключаем весь паровоз из расчёта
                    MembersToCalcCount--;
                    while (Members[MembersToCalcCount - 1].m_Place == Members[MembersToCalcCount].m_Place &&
                           MembersToCalcCount > 0)
                    {
                        MembersToCalcCount--;
                    }
                    if (MembersToCalcCount == 0)
                    {   // Все заняли первое место, поэтому расчитать баллы нельзя
                        return(false);
                    }
                }
            }
            else
            {   // После 30-ого места баллы все равно не начисляются
                MembersToCalcCount = GlobalDefines.LAST_RESULT_PLACE_TO_CALC_BALLS;
            }

            if (MembersToCalcCount == GlobalDefines.LAST_RESULT_PLACE_TO_CALC_BALLS)
            {                           // В этом случае возможен паровоз, выходящий за границу 30-ого места
                AfterLastBalls     = 0; // После 30-ого места баллы не начисляются
                CurPlace           = GlobalDefines.LAST_RESULT_PLACE_TO_CALC_BALLS;
                SpecialTrainEndInd = MembersToCalcCount - 1;
                // Поиск конца паровоза
                while (Members[SpecialTrainEndInd].m_Place == Members[SpecialTrainEndInd + 1].m_Place)
                {
                    SpecialTrainEndInd++;
                }
                if (SpecialTrainEndInd >= MembersToCalcCount)
                {   // Есть выходящий за 30-ое место паровоз
                    TrainBallsSumm = 0;
                    MembersToCalcCount--;

                    // Ищем начало паровоза и вычисляем сумму баллов участников паровоза
                    while (Members[MembersToCalcCount].m_Place == Members[MembersToCalcCount - 1].m_Place)
                    {
                        TrainBallsSumm += GlobalDefines.BALLS_FOR_PLACES[CurPlace];
                        Train.Add(Members[MembersToCalcCount]); // Добавляем участника в паровоз
                        MembersToCalcCount--;
                        CurPlace--;
                    }
                    // Расставляем баллы участникам паровоза.
                    foreach (CPersonalItem TrainItem in Train)
                    {
                        TrainItem.m_Balls = GlobalDefines.MakeBalls(TrainBallsSumm, Train.Count);
                    }
                    Train.Clear();
                    MembersToCalcCount--; // Чтобы MembersToCalcCount содержал номер строки с участником перед паровозом
                }
            }
            else
            {
                AfterLastBalls = GlobalDefines.BALLS_FOR_PLACES[LastPlace + 1];
            }

            // Просмотр всех остальных участников
            CurPlace       = 1;
            TrainBallsSumm = 0;
            for (int MemberInd = 0; MemberInd < MembersToCalcCount; MemberInd++)
            {
                Train.Add(Members[MemberInd]); // Добавляем участника в паровоз

                if (Members[MemberInd].m_Place != Members[MemberInd + 1].m_Place)
                {   // Паровоз закончился
                    // Добавляем баллы последнего участника паровоза
                    TrainBallsSumm += GlobalDefines.BALLS_FOR_PLACES[CurPlace];
                    // Вычитаем число баллов участника "после последнего"
                    TrainBallsSumm -= AfterLastBalls * Train.Count;

                    // Расставляем баллы участникам паровоза.
                    foreach (CPersonalItem TrainItem in Train)
                    {
                        TrainItem.m_Balls = GlobalDefines.MakeBalls(TrainBallsSumm, Train.Count);
                    }
                    Train.Clear();

                    TrainBallsSumm = 0;
                }
                else
                {   // Паровоз продолжается
                    // Добавляем баллы текущего участника паровоза
                    TrainBallsSumm += GlobalDefines.BALLS_FOR_PLACES[CurPlace];
                }

                CurPlace++; // Каждая новая строка - это новое место
            }

            return(true);
        }