プリム迷路生成アルゴリズムを実装しようとしています:
- 壁でいっぱいのグリッドから始めます。
- セルを選択し、迷路の一部としてマークします。セルの壁を壁リストに追加します。
- リストに壁がある場合:
- リストからランダムな壁を選択します。反対側のセルが
まだ迷路に入っていない場合:- 壁を通路にして、反対側のセルを迷路の一部としてマークします。
- セルの隣接する壁を壁リストに追加します。
- 反対側のセルが既に迷路内にある場合は、リストから壁を削除します。
- リストからランダムな壁を選択します。反対側のセルが
いくつかの実装の詳細を削除すると、私の実装は次のようになります。
Cell[][] maze
セルを含むマトリックスです。各セルには、左/右/上/ボタンの壁があります。とマークされたフロンティアの壁boolean frontier
は実装の一部ではありません。迷路の枠を維持したいからです。
public Cell[][] prim(){
List<Wall> walls = new ArrayList<Wall>();
//Pick a cell, mark it as part of the maze
int initialCellI = rnd(sizeX)-1;
int initialCellJ = rnd(sizeY)-1;
Cell randomCell = maze[initialCellI][initialCellJ];
randomCell.setPartOftheMaze(true);
//Add the walls of the cell to the wall list.
if ((randomCell.getLeft() != null) && (!randomCell.getLeft().isFrontier()))
walls.add(randomCell.getLeft());
if ((randomCell.getRight() != null) && (!randomCell.getRight().isFrontier()))
walls.add(randomCell.getRight());
if ((randomCell.getButtom() != null) && (!randomCell.getButtom().isFrontier()))
walls.add(randomCell.getButtom());
if ((randomCell.getUp() != null) && (!randomCell.getUp().isFrontier()))
walls.add(randomCell.getUp());
//While there are walls in the list:
while (!walls.isEmpty()){
//Pick a random wall from the list.
Wall randomWall = randomElement(walls);
//pick the cell opposite to this wall.
Cell opositeSideCell = getNeightbourCell(randomWall, maze);
if (opositeSideCell.isPartOftheMaze()){
//If the cell on the opposite side already was in the maze, remove the wall from the list.
walls.remove(randomWall);
}
else{
// Make the wall a passage and mark the cell on the opposite side as part of the maze.
this.removeWall(randomWall, maze);
opositeSideCell.setPartOftheMaze(true);
//Add the walls of the cell to the wall list.
if ((opositeSideCell.getLeft() != null) && (!opositeSideCell.getLeft().isFrontier()))
walls.add(opositeSideCell.getLeft());
if ((opositeSideCell.getRight() != null) && (!opositeSideCell.getRight().isFrontier()))
walls.add(opositeSideCell.getRight());
if ((opositeSideCell.getButtom() != null) && (!opositeSideCell.getButtom().isFrontier()))
walls.add(opositeSideCell.getButtom());
if ((opositeSideCell.getUp() != null) && (!opositeSideCell.getUp().isFrontier()))
walls.add(opositeSideCell.getUp());
}
}
return maze;
}
私の問題は、迷路が完成しておらず、すべてのセルが横断されていないことです。場合によっては、少数のセルのみが通過し、ほとんどすべてのセルが完了します。私は何かが欠けていると信じています。バーは何がわからないのですか。
助けてください。
部分横断迷路については、下の図を参照してください。