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); }