2次元迷路を生成するプログラムを作成しようとしています。迷路の本体は 2 次元の int 配列です。境界セルの値は 2 です。ブロックされたセル (壁) の値は 1 で、空のセル (パス) の値は 0 です。最初は、すべてのセルの値を 1 に設定しています。一番上の行のランダムな列で、一番下の行に到達するまで、現在のセルを 0 に設定して迷路を移動します。
これはすべて正常に機能しましたが、1 行のパスではなく、0 の広い領域で終わることがよくありました。そのため、if ステートメントに追加して、周囲のセルが既にゼロである場合にセルがゼロにならないようにしました。残念ながら、私のロジックにはいくつかの欠陥があり、実行時に何も出力せずにプログラムが永久に実行されます。その欠陥を特定するのを手伝ってください。
私はプログラミングの初心者であり、これを学習演習として行っているため、他のアルゴリズムの提案にもオープンです。ありがとう
私のコード:
package RoboProj;
import java.util.Random;
public class Maze {
public int[][] grid;
final int width, height;
public Maze() {
width = 20;
height = 20;
grid = new int[width][height];
makeMaze();
}
public void makeMaze() {
//* empty = 0, wall = 1, border = 2, travelled =3;
//mark borders
for (int curr = 0; curr < height; curr++) {
grid[0][curr] = 2; //top
grid[curr][0]=2; //left
grid[height -1][curr] = 2; //bottom
grid[curr][width-1] = 2; //right
}
//initially mark all cells as walls
for (int row = 1; row < height-1; row++){
for (int col = 1; col < width-1; col++){
grid[row][col]=1;
}
}
int row = 0;
Random r = new Random();
int col = r.nextInt(width);
grid[row][col] = 0;
while (row != height-1){
int next = r.nextInt(4);
if (next == 0 && row-1 > 0 && grid[row-1][col-1] == 1 && grid[row-1][col+1] == 1){
grid[row-1][col]=0;
row = row-1;
// System.out.print(next);
}
if (next == 1 && grid[row+1][col-1] == 1 && grid[row+1][col+1] == 1){
grid[row+1][col]=0;
row = row+1;
// System.out.print(next);
}
if (next == 2&& col-1 > 0 && grid[row+1][col-1] == 1 && grid[row-1][col-1] == 1){
grid[row][col-1]=0;
col = col-1;
// System.out.print(next);
}
if (next == 3 && col+1 < width-1 && grid[row-1][col+1] == 1 && grid[row+1][col+1] == 1){
grid[row][col+1]=0;
col = col+1;
// System.out.print(next);
}
}
}
}
@ Anupam Saini: 私は、「経路」が 1 セル以上の幅ではない、このようなものを探しています。
1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1