迷路の生成(改修版)
Maze Ganerator
棒倒し法での迷路生成です。
やっていることは前に書いたやつと同じなのですが、
「せっかくJavaで書いてるんだから...」ということでクラスとメソッドを分けて書き直してみました。
まだ上手い設計があるとは思いますが、mainメソッドに全部の処理詰め込んでた前回よりは多少Javaっぽくなったのではないかと思います。
出力例を出しておこうと思ったのですがうまいこと表示されず崩れてしまうので削りました...(ざんねん)。
import java.util.*;
import java.io.IOException;
// geschrieben von Beliar698ma
public class JavaMaze {
public static void main(String[] args) {
int num = 0;
System.out.println("迷路の一辺のサイズを入力してください(5以上の奇数):");
try (Scanner sc = new Scanner(System.in)) {
if(sc.hasNextInt()) {
num = sc.nextInt();
} else {
System.out.println("有効な値を入力してください");
return;
}
}
if (num < 5 || num % 2 == 0) {
System.out.println("「5以上」の「奇数」を入力してください。");
return;
}
Maze maze = new Maze(num);
maze.initMaze();
maze.generateMaze();
maze.renderMaze();
}
}
class Maze {
private char[][] mazeBody;
private int sideLength;
private static final int[][] DIRECTION = {
{0, 1},
{1, 0},
{0, -1},
{-1, 0}
};
public Maze(final int sideLength) {
this.sideLength = sideLength;
mazeBody = new char[sideLength][sideLength];
}
public void initMaze() {
for (int i = 0; i < sideLength; i++) {
for (int j = 0; j < sideLength; j++) {
if (i == 0 || i == sideLength - 1 || j == 0 || j == sideLength - 1) {
this.mazeBody[i][j] = '■';
} else if (i % 2 == 0 && j % 2 == 0) {
this.mazeBody[i][j] = '■';
} else {
this.mazeBody[i][j] = ' ';
}
}
}
}
public void generateMaze() {
Random random = new Random();
for (int i = 1; i < sideLength - 1; i++) {
for (int j = 1; j < sideLength - 1; j++) {
if (i % 2 == 0 && j % 2 == 0) {
boolean isTopRow = (i == 2);
int directionCount = isTopRow ? 4 : 3;
while(true) {
int idx = random.nextInt(directionCount);
int ny = i + DIRECTION[idx][0];
int nx = j + DIRECTION[idx][1];
if (mazeBody[ny][nx] == ' ') {
mazeBody[ny][nx] = '■';
break;
} else {
continue;
}
}
}
}
}
}
public void renderMaze() {
for (int i = 0; i < sideLength; i++) {
for (int j = 0; j < sideLength; j++) {
System.out.print(mazeBody[i][j]);
if (j == sideLength - 1) System.out.print("\n");
else System.out.print(" ");
}
}
}
}