[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪

Dies ist der erste Beitrag! !!

Ich habe so ein Labyrinth.

実行結果.png

Der Grund, warum ich mich dazu entschlossen habe

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.

Was ist die Grabmethode?

** ■ 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.

Inhalt

Hauptklasse

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();
	}
}

Labyrinthklasse

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;
	}

}

Was mir aufgefallen ist, als es fertig war

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.

Was könnten Sie tun, wenn Sie Lust dazu haben?

Meine Umgebung

OS :Windows10 IDE:Eclipse 2020-03

Recommended Posts

[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, die Methode zu erklären
[Kleine Geschichte] Ich habe versucht, die Java-ArrayList etwas komfortabler zu gestalten
Ich habe einen RESAS-API-Client in Java erstellt
[Java] Ich habe versucht, ein Janken-Spiel zu erstellen, das Anfänger auf der Konsole ausführen können
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Ich habe versucht, eine Java-Methode von ABCL zu verwenden
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Eine Geschichte, als ich versuchte, ein Video zu erstellen, indem ich Processing und Resolume verknüpfte
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
[JDBC] Ich habe versucht, den SQLite3-Datenbankzugriff von Java in eine Methode für jede SQL-Anweisung umzuwandeln.
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Ich habe ein Programm erstellt, das aus dem mit Java überladenen Prozess nach der Zielklasse sucht
Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich wollte nur eine reaktive Eigenschaft in Java erstellen
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Ich habe versucht, Java Optional und Guard-Klausel koexistieren zu lassen
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
Ich habe versucht, die Umgebung nach und nach mit Docker aufzubauen
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Machen Sie mit Ruby2D ein Labyrinth
So erstellen Sie einen Java-Container
Ich habe versucht, mit Java zu interagieren
Ich habe das Java-Framework "Quarkus" ausprobiert.
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe jetzt versucht, Java 8 zusammenzufassen
So erstellen Sie ein Java-Array
Ich habe versucht, ein Tool zum Vergleichen von Amazon-Produktpreisen auf der ganzen Welt mit Java, der Amazon Product Advertising API und der Currency API (29.01.2017) zu erstellen.
Ich habe Tribuo von Oracle ausprobiert. Tribuo - Eine Java-Vorhersagebibliothek (v4.0)
Ich habe versucht, den Weihnachtsbaum in einem Lebensspiel zu beleuchten
[Unity] Ich habe mit NWPathMonitor ein natives Plug-In UniNWPathMonitor erstellt
Herstellen einer Verbindung zu einer Datenbank mit Java (Teil 1) Möglicherweise die grundlegende Methode
Ich habe versucht, die Fehlermeldung beim Ausführen von Eclipse (Java) zu übersetzen.
Ich habe versucht zu verstehen, wie die Rails-Methode "redirect_to" definiert ist
Erstellt eine Methode zum Anfordern von Premium Friday (Java 8-Version)
Ich habe versucht, eine Android-Anwendung mit MVC zu erstellen (Java)
Ich habe versucht zu verstehen, wie die Rails-Methode "link_to" definiert ist
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Ich habe versucht, das Java-kompatible FaaS-Formular "Fn Project" auszuführen.
Ich habe versucht, den Kalender mit Java auf der Eclipse-Konsole anzuzeigen.
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
[VBA] Ich habe ein Tool erstellt, um den primitiven Typ der von Hibernate Tools generierten Entity-Klasse in den entsprechenden Referenztyp zu konvertieren.
So erstellen Sie eine Java-Kalenderzusammenfassung
Ich habe versucht, mir zu erlauben, die Verzögerung für den Android UDP-Client einzustellen
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe das neue Yuan-Problem in Java ausprobiert
[Java] Verwendung der toString () -Methode