Количество соседей тральщика

Я пытаюсь скопировать тральщика, и я столкнулся с проблемой подсчета соседей, которые являются минами. Кажется, что это очень легко реализовать, но по некоторым причинам я не получаю желаемых результатов везде. У меня есть 1d массив целых, представляющих каждую плитку. Я хотел бы получить способ получить каждого соседа плитки отдельно, учитывая, что она может иметь переменный размер сетки. Вот как выглядит мой код:

int num = 0;

if (i + 1 < 16 && graph[i + 1] == -1)
num++;
if (i - 1 >= 0 && graph[i - 1] == -1)
num++;
if (i + 3 < 16 && graph[i + 3] == -1)
num++;
if (i - 3 >= 0 && graph[i - 3] == -1)
num++;
if (i + 4 < 16 && graph[i + 4] == -1)
num++;
if (i - 4 >= 0 && graph[i - 4] == -1)
num++;
if (i + 5 < 16 && graph[i + 5] == -1)
num++;
if (i - 5 >= 0 && graph[i - 5] == -1)
num++;

return num;

и я не получаю желаемых результатов для самых левых и самых правых плиток. Также иногда возникает проблема с самой нижней и самой верхней плитками. Мой код использует сетку (по-видимому, я назвал это графиком :)) фиксированного размера 4×4 (int [16]).

Заранее спасибо.

1

Решение

Ваши условия неверны. Если игрок находится на правом краю сетки, то i-3 будет левой стороной сетки.

Чтобы справиться с этим, вы можете добавить дополнительные проверки, чтобы увидеть, если вы находитесь на краю. например

if (i - 3 >= 0 && (i+1) % 4 > 0 && graph[i - 3] == -1)
num++;

Вам понадобятся аналогичные проверки для большинства других операторов if (все, кроме +/- 4).

1

Другие решения

Я думаю, что ошибка исходит из того, как вы думаете, ваши данные хранятся против того, как они хранятся на самом деле. Если я правильно понимаю, ваш фрагмент кода в настоящее время смотрит на нескольких соседей на та же линия (или, возможно, столбец) как ваш iй позиции.

Этот ответ содержит хорошие объяснения о том, как линеаризуем 2D сетка в 1D массив: Преобразование двумерного индекса массива в одномерный индекс

В качестве альтернативы, используя 2D-массив (или еще лучше, std::vector<std::vector<int> > вероятно, сделает вещи намного чище и менее подвержен ошибкам. В этом случае затраты на производительность будут незначительными.

0

По вопросам рекламы [email protected]