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.
Linux Mint 18 'Sarah' MATE 64-bit Java 1.8.0_131 Google Chrome 61.0.3163.79 (offizieller Build) (64-Bit)
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.
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.
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.
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.
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.
Das Ausführungsergebnis sieht folgendermaßen aus (mazeSize = 30).
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.
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.
Das Ausführungsergebnis sieht folgendermaßen aus (mazeSize = 50).
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). ~~
―― ~~ 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.
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~~
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