Eine kurze Erklärung eines Labyrinthspiels, das in Java für Cousins der Grundschule erstellt wurde

zunaechst

Neulich besuchten uns meine Cousins der 4. und 1. Klasse. Da es schwierig ist, mit dem Körper zu spielen, dachte ich, wenn ich es im Spiel schaffen würde, wäre es ruhig, also habe ich ein Labyrinthspiel erstellt, das mit CUI funktioniert. Infolgedessen war ihre Mutter süchtiger als ihre Cousins, und am Ende konnten sie die Dottanbattan-Aufregung nicht aufhalten.

Umgebung

Linux Mint 18 'Sarah' MATE 64-bit Java 1.8.0_131 Google Chrome 61.0.3163.79 (offizieller Build) (64-Bit)

Algorithmus zur Erzeugung von Labyrinthen

Es scheint verschiedene Algorithmen zum Erstellen eines Labyrinths zu geben, aber dieses Mal werden wir einen Algorithmus verwenden, der als ** Grabmethode (Straßenerweiterungsmethode) ** bezeichnet wird. Verschiedene Algorithmen sind auf dieser Site leicht verständlich geschrieben. Wir empfehlen daher, auf sie zu verweisen.

Annahme

Angenommen, das Labyrinth befindet sich auf einer zweidimensionalen Ebene und ist eine Ansammlung von "Masse" wie ein Gitterpapier. Zu diesem Zeitpunkt soll die Masse entweder die Rolle einer "Mauer" oder einer "Straße" spielen. Nehmen Sie auch an, dass die Außenseite des Labyrinths vollständig mit Straßen gefüllt ist. Und vom Start bis zum Ziel gibt es nur einen Weg.

Bohrmethode (Straßenverlängerungsmethode)

Dieser Algorithmus ähnelt der Art und Weise, wie Menschen Labyrinthe von Hand erzeugen. Daher ist der Grad der Zufälligkeit der Straße hoch. Außerdem nimmt die Anzahl der geraden Linien tendenziell ab. Wenn Sie also ein großes Labyrinth erstellen, sieht es unordentlich aus. Der Inhalt des Algorithmus wird unten gezeigt.

  1. Machen Sie das gesamte Labyrinth zu einer Wand.
  2. Verwenden Sie ein zufällig ausgewähltes Quadrat als Straße, mit Ausnahme der Quadrate, die die Außenseite des Labyrinths berühren.
  3. Verlängern Sie die Straße von dort nach dem Zufallsprinzip (es sei denn, das eine Quadrat oben, unten, links und rechts in der Richtung, in die Sie fahren, ist die Straße).
  4. Wiederholen Sie Schritt 3 so oft wie möglich.
  5. Wählen Sie zufällig ein Feld aus den Feldern aus, die sich bereits auf der Straße befinden, außer außerhalb des Labyrinths.
  6. Wiederholen Sie die Schritte 3 bis 5 so oft wie möglich.

Ich werde nur Schritt 3 ein wenig erklären.

■: Wand □: Straße ○: Das Quadrat, das sich vorwärts bewegen soll -: Es ist egal, ob es eine Mauer oder eine Straße ist

Angenommen, Sie versuchen, von einer Straße nach links zu gehen. Wenn zu diesem Zeitpunkt die Quadrate auf der linken Straßenseite wie folgt sind, können Sie die Straße nach links verlängern.

Wenn jedoch auch nur eines der Quadrate, das in der vorherigen Abbildung eine Wand war (z. B. das Quadrat über ○), zu einer Straße wird, können Sie die Straße nicht nach links verlängern. Der Grund ist, dass die "Straße, die erweitert wird" und die "Straße, die an ○ angrenzt" miteinander verbunden sind. Wenn Sie zulassen, dass sich die beiden Straßen verbinden, erhalten Sie eine Ringstraße, und vom Start bis zum Ziel gibt es mehr als eine Straße.

Nach Abschluss von Schritt 6 müssen Sie nur noch die Felder auswählen, die der Start und das Ziel sein sollen, und zwar aus den Feldern, die die Außenseite des Labyrinths berühren.

Implementierung

Alle werden mit Java implementiert. Hier ist der gerade beschriebene Teil des Algorithmus zur Labyrinthgenerierung (hier für diejenigen, die den vollständigen Code sehen möchten). Außerdem wird der Teil, der jedem in der vorherigen Erläuterung gezeigten Schritt entspricht, im Kommentar angezeigt.

Maze.java


//Methode zum Erstellen eines neuen Labyrinths
static void createMaze() {
	// [Schritt 1]Initialisieren
	for (int i = 0; i < mazeSize; i++) {
		for (int j = 0; j < mazeSize; j++) {
			wall[i][j] = true;
		}
	}

	// [Schritt 2]Wählen Sie zufällig die Startposition (1 bis mazeSize)- 2)
	Random rnd = new Random();
	row = rnd.nextInt(mazeSize - 2) + 1;
	col = rnd.nextInt(mazeSize - 2) + 1;
	wall[row][col] = false;
	rowStack.push(row);
	colStack.push(col);

	boolean continueFlag = true;

	// [Schritt 6]Unten Wand[][]Wiederholen, bis das Ganze gefüllt ist
	while (continueFlag) {

		// [Schritt 3,4]Verlängern Sie die Straße bis zum Limit nach oben, unten, links oder rechts
		extendPath();

		// [Schritt 5]Wählen Sie die nächste Startposition aus der vorhandenen Straße (0 bis mazeSize).- 1)
		continueFlag = false;

		while (!rowStack.empty() && !colStack.empty()) {
			row = rowStack.pop();
			col = colStack.pop();

			if (canExtendPath()) {
				continueFlag = true;
				break;
			}
		}
	}
}

Die Erklärung der Hauptvariablen lautet wie folgt.

--int mazeSize: Die Länge einer Seite des erzeugten Labyrinths (Quadrat). --Boolean [] [] wall: Der Zustand des gesamten Labyrinths. Wahr steht für die Wand und Falsch für die Straße. --int row: Die Reihe von "dem Quadrat, das Sie versuchen, den Weg zu machen". --int col: Eine Spalte von "Massen, die versuchen, Platz zu machen". --Stack rowStack: Ein Stapel mit Reihen von "Massen, die bereits unterwegs sind". --Stack colStack: Ein Stapel mit Spalten von "Massen, die bereits unterwegs sind".

Die wichtigsten Methoden werden unten erläutert.

--extendPath (): Führen Sie die Schritte 3 und 4 in der vorherigen Erklärung aus. --canExtendPath (): Bestimmt, ob die "Masse, die Sie versuchen, einen Weg zu finden" wirklich einen Weg finden kann.

Durch Stapeln von "Masse, die bereits zu einer Straße verarbeitet wurde" auf dem Stapel können Sie alle Straßen überprüfen, auf die Schritt 3 angewendet werden kann.

Ausführungsergebnis

Das Ausführungsergebnis sieht folgendermaßen aus (mazeSize = 30).

2017-07-28 01-06-28.png

Das "**" unten links steht für den Spieler und das "GO" oben rechts für das Ziel. Sie können den Player mit der Taste wsad nach oben, unten, links und rechts bewegen. Wenn Sie das Ziel erreichen, wird die klare Zeit zusammen mit dem Lob angezeigt. Wenn Sie es tatsächlich versuchen, ist es ziemlich schwierig, weil es auf komplizierte Weise verzweigt.

Implementierung in JavaScript und HTML

Ich habe es auch in JavaScript und HTML implementiert, damit es im Browser abgespielt werden kann. Es ist im Grunde das gleiche wie die Java-Implementierung. Für die Zeichenmethode des Labyrinths habe ich diese Site als Referenz verwendet.

Ausführungsergebnis der Browserversion

Das Ausführungsergebnis sieht folgendermaßen aus (mazeSize = 50).

2017-09-08 20-27-13.png

Der blaue Block unten links repräsentiert den Spieler und der rote Block oben rechts repräsentiert das Ziel. Sie können den Player mit den Pfeiltasten nach oben, unten, links und rechts bewegen. Wenn Sie das Ziel erreicht haben, wird im Dialog die klare Zeit zusammen mit dem Lob angezeigt. Sie können die Größe des Labyrinths über das Eingabefeld oben frei ändern. Ich denke nicht daran, mit einem Smartphone zu arbeiten. ~~ Übrigens können Sie von [hier] aus spielen (http://www.coins.tsukuba.ac.jp/~s1411396/index.html). ~~

Zukünftige Aufgaben

―― ~~ Ich möchte eine GUI erstellen, damit ich sie problemlos unter Windows abspielen und in einer exe-Datei zusammenstellen kann. ~~ Die Ära scheint das Web zu sein, also habe ich es möglich gemacht, mit einem Browser zu spielen. ―― ~~ Das Erscheinungsbild ist unordentlich, daher möchte ich die Anzahl der geraden Straßen erhöhen. ~~ Ich denke, es ist interessanter als ein Labyrinth, wenn es durcheinander ist, also lass es so wie es ist. ―― ~~ Derzeit müssen Sie die Eingabetaste drücken, nachdem Sie die wsad-Taste gedrückt haben. Daher möchte ich sie nur mit der wsad-Taste verschieben. ~~ Die Browserversion kann mit den Pfeiltasten abgespielt werden. ――Ich möchte Highscores anzeigen.

Referenz-URL usw.

Automatisch generiertes Labyrinth http://www5d.biglobe.ne.jp/stssk/maze/make.html GitHub https://github.com/hey-cube/maze [JavaScript] Erstellen Sie mit HTML + JavaScript ein mysteriöses Dungeon-Labyrinth. Http://www.yoheim.net/blog.php?q=20151202 ~~ HeyCube Labyrinth http://www.coins.tsukuba.ac.jp/~s1411396/index.html~~

Schließlich

Als ich mich von meinen Cousins getrennt hatte, wurde ich gefragt: "Kann ich das Spiel noch spielen?" Also habe ich versprochen, es zum Herunterladen und Spielen im Web zur Verfügung zu stellen. Also werde ich dieses Labyrinth irgendwann zum Herunterladen und Spielen zur Verfügung stellen.

Ich bin froh, wenn es Leute gibt, die sich für das interessieren, was ich gemacht habe.

(Hinzugefügt am 08.09.2017) Ich habe die Methode zum Herunterladen und Spielen nicht verwendet, aber ich habe eine Browserversion erstellt, damit meine Cousins zu Hause spielen können.

(Hinzugefügt am 24.03.2018) Zu dieser Zeit verstand ich JavaScript nicht, aber rückblickend ist es schrecklich ... Unabhängig vom Algorithmus beziehen Sie sich bitte nicht auf den JavaScript-Code.

Recommended Posts

Eine kurze Erklärung eines Labyrinthspiels, das in Java für Cousins der Grundschule erstellt wurde
Erstellen wir eine TODO-Anwendung mit Java 1 Kurze Erläuterung von MVC
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
Ich habe ein einfaches Berechnungsproblemspiel in Java gemacht
[Für Anfänger] Erläuterung von Klassen, Instanzen und Statik in Java
Hat die Serverseite des Online-Kartenspiels gemacht ⑤
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Eine kurze Erklärung der fünf Arten von Java Static
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Eine kurze Erklärung von commitAllowingStateLoss
Behandeln Sie die Geschäftslogik für eine Reihe von Entitäten in einer Java-Klasse
Verwandeln Sie ein Array von Strings in eine Liste von Ganzzahlen in Java
Anfänger spielen Janken-Spiele in Java
Ich habe eine Anmerkung in Java gemacht.
Eine kurze Beschreibung der JAVA-Abhängigkeiten
Altersschätzspiel mit Java gemacht
Ich habe ein Diff-Tool für Java-Dateien erstellt
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
Zusammenfassung der einfachen Funktionen von Bootstrap für Anfänger
Von enum vor dem Schmied festgefahren
Messen Sie die Größe eines Ordners mit Java
Eine Sammlung einfacher Fragen für Java-Anfänger
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Träumen Sie davon, einfach eine Web-API für die Datenbank eines vorhandenen Java-Systems zu erstellen
Ich habe Togmarks gemacht, bei denen das zweite Jahr der Junior High School in einer Woche für ihre Ideen stimmen kann