#c#
Вопрос:
Я пытаюсь просмотреть всех соседей каждой записи в двумерном массиве, используя цикл foreach и два цикла for. Проблема, с которой я сталкиваюсь, заключается в том, что я получал исключение ArrayIndexOutOfBounds при просмотре граничных ячеек. Единственный способ, который я нашел, чтобы решить эту проблему, был действительно неэффективным, если бы не условие. Я не хочу зацикливать свой массив по краям. Есть ли более эффективный способ обойти эту проблему?
foreach (Cell cell in playField._playField)
{
for (int dx = -1; dx <= 1; dx )
{
for (int dy = -1; dy <= 1; dy )
{
if (cell.PositionX dx < 0 || cell.PositionX dx >= XSize || cell.PositionY dy < 0 || cell.PositionY dy >= YSize)
break;
else
cell.Neighbors = _playField[cell.PositionX dx, cell.PositionY dy].IsMine ? cell.Neighbors 1 : cell.Neighbors;
}
}
}
Комментарии:
1. Вы говорите «эффективно», но действительно ли проблема в том, что код медленный? Или проблема в том, что это некрасиво?
Ответ №1:
Я называю это проблемой «Игрового поля» в игровом дизайне. Я вижу два решения:
а) Ваша «неэффективная» конструкция условий. (меня больше всего беспокоит, что они обычно портятся. Эти проверки не должны оказывать существенного влияния на производительность).
б) Добавьте «границу» ячеек вокруг игрового поля. Эта граница не отображается. Он существует исключительно для того, чтобы вы могли избежать такого рода условий — вы можете остановить весь игровой код, если нажмете на «пограничную» ячейку во время проверки соседей.
Шахматная доска в памяти была бы размером 10×10 с этим решением, и только внутренняя 8×8 выводила бы ее на экран.