Другие здесь уже предложили, как бороться с проблемами индексации за пределами границ.Так что это немного другой подход к решению вашей проблемы.
Очень легко увидеть это как одну проблему, а затем попытаться решить все это в одном месте, но это не всегда лучшее решение.
Ваш цикл for пытается сделать довольно много.Каждая итерация может иметь много проверок.Кроме того, вы делаете проверки, которые вы сделали ранее.
- У меня есть сосед слева.
- У меня есть сосед справа.
- Получил ли я лучшую оценку, чем оба соседа.
- Получил ли я лучшую оценку, чем один сосед.
- Я проиграл обоим соседям.
Мой совет - разбить это на две отдельные задачи.
1, чтобы подсчитать, сколько соседей каждый человек получил выше, чем оценка.
string[] names = new string[]{"John", "Paul", "Ringo", "George"};
int[] grades = new[] {3, 4, 3,2};
int[] winnersandloser = new int[4];
for (int i = 1; i < grades.Length; i++) //note starting at position 1 so I dont need to handle index out of bounds inside the for loop
{
if (grades[i] > grades[i - 1])
{
winnersandloser[i]++;
}
else
{
winnersandloser[i - 1]++;
}
}
В приведенном выше коде у вас должен быть массив со следующими значениями: {0,2,1,0}
0 = вы проиграли обоим соседям 1 = вы победили одного соседа2 = молодец, вы победили обоих соседей
Затем с помощью этого массива winnersandlosers вы можете рассчитать, сколько монет дать каждому человеку.Я оставлю это для вас.
Обновление
Если вам требуется другое поведение для первого и последнего в списке людей, вам нужно добавить логику в свой код для распределения монет,
Массив дает каждое значение и значение индекса, начиная с 0. Таким образом, 0 указывает на первое значение в вашем массиве.Джордж является 4-й записью в массиве, но так как индекс массива начинается с 0, значение индекса равно 3, вы также получаете это от arrayname.Length - 1
Так что теперь, когда вы перебираете массив для выделения монет, мы можемдобавить проверку для первой и последней позиции в массиве.
//allocating coins
for (int i = 0; i < winnersandloser.Length; i++)
{
if (i == 0 || i == winnersandloser.Length - 1)
{
//allocating rules for first and last
}
else
{
//allocating rules for everyone else
}
}