Вот несколько советов относительно вашего кода:
solve_maze
принимает четыре параметра, но вы передаете только один в начальном вызове (solve_maze(maze)
)
- Все ваши объекты - это либо строки, либо массивы строк, но вы постоянно выполняете с ними целочисленную математику
- Вы постоянно используете
self
для ссылки на текущий объект, но у вас даже нет текущего объекта, поскольку вы пишете в процедурном стиле, а не объектно-ориентированном. [Примечание: я знаю, что в Ruby у вас всегда есть текущий объект, который в данном случае является анонимным объектом верхнего уровня.]
Вот еще несколько советов относительно вашего рабочего процесса:
- Забудьте о цикле while. Зачем вам хотеть возможность решения нескольких лабиринтов, если вы не можете даже решить один в данный момент? Вы всегда можете добавить это позже.
- Забудьте о чтении лабиринта из файла, просто жестко закодируйте его в строку. Вы всегда можете добавить это позже.
- На самом деле, забудьте о синтаксическом анализе строки, просто жестко закодируйте лабиринт в структуре данных, с которой вам удобно иметь дело. Я бы предложил двумерный массив логических значений. Вы всегда можете ... ну, вы поняли.
- Начните с простого лабиринта. Мол, действительно просто. Мол, одна плитка, где вы уже запускаете в пункте назначения. Затем перейдите к лабиринту с двумя плитками, где пункт назначения находится рядом с началом.
Примеры:
solvable = [
[false, false, false, false, false, false, false, false, false, false],
[false, true, true, true, true, true, true, true, true, false],
[false, false, false, false, false, false, true, true, true, false],
[false, true, true, true, true, true, true, true, true, false],
[false, false, false, false, false, false, false, false, false, false]
]
unsolvable = [
[false, false, false, false, false, false, false, false, false, false],
[false, true, true, true, true, true, true, true, true, false],
[false, false, false, false, false, false, false, false, false, false],
[false, true, true, true, true, true, true, true, true, false],
[false, false, false, false, false, false, false, false, false, false]
]
start = [1, 1]
finish = [3, 1]
Таким образом, вы можете просто использовать if
, чтобы проверить, свободен ли путь или нет, поскольку пустые плитки true
и стены false
Вот хитрый трюк: в Ruby все, что не является ни false
, ни nil
, является правдой. Это означает, что вы можете поместить туда все, что вы хотите (кроме false
или nil
, конечно) вместо true
, и уловка if
будет работать. Например, вы можете закодировать информацию о расстоянии, которая нужна алгоритму, непосредственно в самом лабиринте. Просто вставьте туда действительно большое число вместо true
и 0
в финиш:
infin = 1.0/0.0
solvable = [
[false, false, false, false, false, false, false, false, false, false],
[false, infin, infin, infin, infin, infin, infin, infin, infin, false],
[false, false, false, false, false, false, infin, infin, infin, false],
[false, 0 , infin, infin, infin, infin, infin, infin, infin, false],
[false, false, false, false, false, false, false, false, false, false]
]
unsolvable = [
[false, false, false, false, false, false, false, false, false, false],
[false, infin, infin, infin, infin, infin, infin, infin, infin, false],
[false, false, false, false, false, false, false, false, false, false],
[false, 0 , infin, infin, infin, infin, infin, infin, infin, false],
[false, false, false, false, false, false, false, false, false, false]
]
start = [1, 1]
finish = [3, 1]
Однако начните с простого:
maze = [[0]]
start = [0, 0]
finish = [0, 0]
maze = [[0, infin]]
start = [0, 1]
finish = [0, 0]
maze = [
[false, false, false],
[false, infin, false],
[false, 0 , false],
[false, false, false]
]
start = [1, 1]
finish = [2, 1]
maze = [
[false, false, false],
[false, infin, false],
[false, infin, false],
[false, 0 , false],
[false, false, false]
]
start = [1, 1]
finish = [3, 1]