Dies ist der erste Beitrag! !!
Ich habe ein Labyrinthspiel mit der Stick-Down-Methode mit HTML5 und JS erstellt und es auf einem Kulturfestival ausgestellt. Das durch die Stick-Down-Methode erzeugte Labyrinth hat jedoch eine sehr einfache Lösung, daher wollte ich es mit einer Grabmethode mit einer komplizierten Lösung versuchen.
** ■ Grob gesagt ist die Grabmethode ein solcher Algorithmus ** (Vielleicht ist es falsch: Schweißtropfen :)
Erstellen Sie eine Karte mit ungerader Größe mit einer Größe von 5 oder mehr sowohl vertikal als auch horizontal. Fülle alles mit einer Wand Wählen Sie nach dem Zufallsprinzip eine Stelle aus, an der die X- und Y-Koordinaten bis auf den Rand der Karte ungerade sind, und machen Sie ein Loch. ★ Überprüfen Sie, ob es außer der Kante noch Wände mit ungeraden X- und Y-Koordinaten gibt (diesmal ist die obere linke Ecke 0,0). ** Wenn es Folgendes gibt: ** Wählen Sie nach dem Zufallsprinzip eine Stelle aus, an der die X- und Y-Koordinaten ungerade sind und bereits andere Löcher als den Rand der Karte aufweisen. | Überprüfen Sie, ob auf allen Seiten noch eine Wand mit 2 Quadraten vorhanden ist | ** Wenn es Folgendes gibt: ** Grabe 2 Quadrate zufällig aus der Grabrichtung | Wenn nicht **: Zurück zu ** ★ ** Wenn nicht: ** Labyrinth abgeschlossen
…… Aber es ist schwierig, es gehorsam umzusetzen, deshalb werde ich verschiedene Dinge entwickeln.
MainClass.java
package automaze;
public class MainClass {
public static void main(String[] args) {
Maze maze=new Maze(21,21);//Dieses Mal werde ich ein 21x21 Labyrinth als Versuch machen.
maze.show();
}
}
Maze.java
package automaze;
public class Maze {
private int pointX; //Eine Markierung zum Platzieren und Löschen von Blöcken.
private int pointY;
private int width; //Breite und Höhe.
private int height;
private byte[][] map; //Array zum Speichern der Karte
public Maze(int w, int h) { //Konstrukteur
width = w;
height = h;
if (w % 2 != 0 && h % 2 != 0 && 5 <= w && 5 <= h) {
map = new byte[width][height];
make();
} else {
System.out.println("Erstellen Sie eine ungerade Zahl von 5 oder mehr vertikal und horizontal.");
}
}
int randomPos(int muki) { //x,Gibt ungerade Zufallskoordinaten für beide y-Koordinaten zurück
int result = 1 + 2 * (int) Math.floor((Math.random() * (muki - 1)) / 2);
return result;
}
private void make() { //Erstellen Sie eine Karte
pointX = randomPos(width);
pointY = randomPos(height);
for (int y = 0; y < height; y++) { //Fülle alles mit einer Wand.
for (int x = 0; x < width; x++) {
map[x][y] = 1;
}
}
map[pointX][pointY] = 0;
dig();
}
private void dig() {
if (isAbleContinueDig() && map[pointX][pointY] == 0) {
map[pointX][pointY] = 0;
int direction = (int) Math.floor(Math.random() * 4);
switch (direction) {
case 0:
if (pointY != 1) {
if (map[pointX][pointY - 2] == 1) {
map[pointX][pointY - 1] = 0;
pointY -= 2;
break;//u
}
}
case 1:
if (pointY != height - 2) {
if (map[pointX][pointY + 2] == 1) {
map[pointX][pointY + 1] = 0;
pointY += 2;
break;//d
}
}
case 2:
if (pointX != 1) {
if (map[pointX - 2][pointY] == 1) {
map[pointX - 1][pointY] = 0;
pointX -= 2;
break;//l
}
}
case 3:
if (pointX != width - 2) {
if (map[pointX + 2][pointY] == 1) {
map[pointX + 1][pointY] = 0;
pointX += 2;
break;//r
}
}
}
map[pointX][pointY] = 0;
dig();
} else if (isAbleDig()) {
pointX = randomPos(width);
pointY = randomPos(height);
dig();
}
}
private boolean isAbleDig() { //Sehen Sie nach, ob es noch einen Platz zum Graben gibt
boolean result;
int cnt = 0;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (x % 2 != 0 && y % 2 != 0) {
if (map[x][y] != 0) {
cnt++;
}
}
}
}
if (cnt == 0) {
result = false;
} else {
result = true;
}
return result;
}
private boolean isAbleContinueDig() {//Stellen Sie fest, ob noch Platz zum Graben in alle Richtungen vorhanden ist
if (pointY != 1) {
if (map[pointX][pointY - 2] == 1) {
return true;
}
}
if (pointY != height - 2) {
if (map[pointX][pointY + 2] == 1) {
return true;
}
}
if (pointX != 1) {
if (map[pointX - 2][pointY] == 1) {
return true;
}
}
if (pointX != width - 2) {
if (map[pointX + 2][pointY] == 1) {
return true;
}
}
return false;
}
public void show() {
for (int y = 0; y < map[0].length; y++) {
System.out.println("");
for (int x = 0; x <map.length; x++) {
if (map[x][y] == 1) {
System.out.print("##");
} else {
System.out.print(" ");
}
}
}
}
public byte[][] getMaze() {
return map;
}
}
Ich frage mich, ob ich es etwas kürzer machen kann. Vielleicht, weil ich die Grabungsfunktion rekursiv aufrufe, erhalte ich einen Stackoverflow-Fehler, wenn ich nur versuche, ein etwas größeres Labyrinth zu erstellen. Ich werde diesen Artikel bearbeiten, sobald er behoben ist. Ich denke vage, dass es ganz so scheint, wenn ich die while-Anweisung verwende.
OS :Windows10 IDE:Eclipse 2020-03
Recommended Posts