Ваша программа имеет неопределенное поведение, если вы обращаетесь к массиву a
за пределами. Это может произойти, когда случайное направление невозможно, потому что вы достигли границ массива 10x10. Чтобы избежать этого, измените порядок условий для первой проверки индекса, например,
if (playeri != 0 && a[playeri - 1][playerj] == '.') {
. В некоторых случаях вы, вероятно, окажетесь в позиции, у которой нет смежных позиций с точкой, поэтому нет способа Продолжить. Поскольку visited
не увеличивается в этом случае, ваш l oop не прекратит работу.
Дополнительная проверка, что хотя бы одно направление не заблокировано, исправит бесконечное l oop, но не является оптимальным решением.
Ваша реализация, которая генерирует случайное направление, а затем проверяет если это направление возможно, может потребоваться несколько попыток, когда блокируется больше полей. Хотя маловероятно, что вы даже можете получить случайные числа, которые обозначают заблокированные пути в течение длительного времени.
Чтобы выполнить требование прекратить программу, когда все направления заблокированы, и улучшить поведение, когда заблокировано много направлений, Я предлагаю изменить алгоритм.
Предлагаемый алгоритм:
- проверить все 4 направления, если можно идти, поместить все возможные направления в массив не более 4 элементов и подсчитать возможные направления как
n
. (Пример: если возможны вверх, вниз и влево, массив будет содержать up
, down
, left
, (invalid)
. Количество будет n = 3
.) - , если
n == 0
(все заблокировано) прекратить l oop - получить случайное число от
0
до n - 1
(Пример: 0
.. 2
) - выбрать направление от массив (Пример: случайное число
1
выберет down
) - переместится в выбранном направлении (это было проверено до того, как это возможно)