Создание лабиринта на Java?

Мой вопрос: как я смогу создать случайно созданный лабиринт в Java? Я знаю основную схему создания DFS для создания лабиринта, но мне трудно его реализовать. В моей программе лабиринт хранится в 2D-массиве, и добавление 1 к массиву приводит к исключению массива вне пределов. Как я могу избежать этого? Я не хочу делать очень сложный лабиринт, просто простой лабиринт. Хотя я начал создавать код, я не уверен, как заставить его работать.

Псевдокод для метода DFS:

create a CellStack (LIFO) to hold a list of cell locations 
set TotalCells = number of cells in grid 
choose a cell at random and call it CurrentCell 
set VisitedCells = 1 

while VisitedCells < TotalCells 
find all neighbors of CurrentCell with all walls intact 
 if one or more found 
 choose one at random 
 knock down the wall between it and CurrentCell 
 push CurrentCell location on the CellStack 
 make the new cell CurrentCell 
 add 1 to VisitedCells
 else 
 pop the most recent cell entry off the CellStack 
 make it CurrentCell
 endIf
 endWhile

Я не понимаю, как вы можете узнать, нет ли у ваших соседей неповрежденных стен и как их уничтожить. Может ли кто-нибудь дать мне некоторое представление об этой программе. Очень признателен.

1 ответ

https://www.google.com/search?ix=seb&sourceid=chrome&ie=UTF-8&q=maze+generation+algorithm

Там есть много литературы, которая поможет вам это сделать. Переиздание этого здесь не собирается делать это справедливо.

По двум вопросам, которые вы задали. Ваш алгоритм звучит как его хрупкий, поскольку он полагается на фиксированный размер массива. Если он не разработан таким образом, вам придется захватить отладчик и выяснить, почему он выходит за пределы массива (array.length). Что касается второго вопроса, вы будете использовать простую индексацию для просмотра соседних ячеек.

  • Ячейка в левый лабиринт [ряд] [col-1]
  • Ячейка в правый лабиринт [ряд] [col + 1]
  • Ячейка над лабиринтом [ряд-1] [col]
  • Ячейка ниже лабиринта [row + 1] [col]

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

Чтобы узнать, есть ли здесь стена:

Cell cell = maze[row][col];
if( cell.isWall() ) ...

licensed under cc by-sa 3.0 with attribution.