Ich versuche, zufällig ein gerichtetes Diagramm zu erstellen, um ein Puzzlespiel zu erstellen, das den Eisrutschpuzzles von Pokemon ähnelt.
Dies ist im Wesentlichen das, was ich zufällig generieren möchte: http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory .
Ich muss in der Lage sein, die Größe des Diagramms in einer x- und y-Dimension zu begrenzen. In dem im Link angegebenen Beispiel wäre es auf ein 8x4-Raster beschränkt.
Das Problem, auf das ich stoße, besteht nicht darin, den Graphen zufällig zu generieren, sondern zufällig einen Graphen zu generieren, den ich in einem 2D-Raum richtig abbilden kann, da ich etwas (wie einen Stein) auf der gegenüberliegenden Seite eines Knotens benötige, um ihn zu erstellen Optisch sinnvoll, wenn Sie aufhören zu rutschen. Das Problem dabei ist, dass der Stein manchmal auf dem Weg zwischen zwei anderen Knoten oder möglicherweise auf einem anderen Knoten selbst landet, wodurch der gesamte Graph gebrochen wird.
Nachdem wir das Problem mit einigen mir bekannten Personen besprochen hatten, kamen wir zu einigen Schlussfolgerungen, die zu einer Lösung führen könnten.
- Einbeziehen der Hindernisse in das Raster als Teil des Diagramms bei der Erstellung.
- Beginnen Sie mit einem vollständig ausgefüllten Raster und zeichnen Sie einfach einen zufälligen Pfad und löschen Sie Blöcke, damit dieser Pfad funktioniert.
Das Problem besteht dann darin, herauszufinden, welche gelöscht werden müssen, um die Einführung eines zusätzlichen, kürzeren Pfads zu vermeiden. Wir dachten auch, dass ein dynamischer Programmieralgorithmus von Vorteil sein könnte, obwohl keiner von uns zu geschickt darin ist, dynamische Programmieralgorithmen aus dem Nichts zu erstellen. Alle Ideen oder Referenzen darüber, wie dieses Problem offiziell genannt wird (wenn es sich um ein offizielles Grafikproblem handelt), wären am hilfreichsten.
Hier sind einige Beispiele dafür, was ich bisher erreicht habe, indem ich nur zufällig Blöcke platziert und das Navigationsdiagramm aus dem ausgewählten Start / Ziel generiert habe. Die Idee (wie im vorherigen Link beschrieben) ist, dass Sie am grünen S beginnen und zum grünen F gelangen möchten. Sie bewegen sich dazu nach oben / unten / links / rechts und bewegen sich weiter in die gewählte Richtung, bis Sie a treffen Mauer. In diesen Bildern ist Grau eine Wand, Weiß ist der Boden und die violette Linie ist die Mindestlänge von Anfang bis Ende, und die schwarzen Linien und grauen Punkte repräsentieren mögliche Pfade.
Hier sind einige schlechte Beispiele für zufällig generierte Diagramme:
Hier sind einige gute Beispiele für zufällig generierte (oder von Hand optimierte) Diagramme:
Ich habe auch bemerkt, dass die schwierigeren, wenn ich dies tatsächlich als Puzzle spiele, diejenigen sind, die viele hochgradige Knoten entlang des minimalen Pfades haben.
quelle
Antworten:
erweiterte Eigenschaften:
Beispiel:
Beispiel für das Kombinieren von Kacheln:
Vielleicht gefällt dir das Spiel Tsuro , es verwendet Kacheln, um ein zufälliges Brett zu erzeugen.
quelle
Vielleicht könnte Ihnen Reverse Engineering helfen, wenn Sie dazu bereit sind.
Wenn es für jedes Problem nur eine einzige Lösung gibt, können Sie wahrscheinlich ein Diagramm basierend auf der eindeutigen Antwort erstellen. Dies erfordert keine dynamische Programmierung oder sogar das Überspringen von Brute Force und die Entscheidung für eine methodische Generierung.
Sie können es tun, indem Sie:
Sie müssen jedoch einen Weg finden, der der Komplexität und Problemgröße des Problems entspricht und diese Frage für Sie generiert. Gehen Sie nicht einfach auf Brute-Force. Versuchen Sie stattdessen einen zufälligen Algorithmus. Dies könnte Ihnen helfen.
quelle
Wie wäre es mit einem anderen Ansatz? Beginnen Sie mit einem leeren Labyrinth und fügen Sie Blöcke wie folgt hinzu:
Abschluss: Finden Sie den kürzesten Weg mit dem von Ihnen bereitgestellten Algorithmus. Notieren Sie sich alle verwendeten Zellen und füllen Sie den Rest nach dem Zufallsprinzip auf, um sicherzustellen, dass der kürzeste Weg nicht kürzer wird.
In Schritt 2 gibt es eine Einschränkung, wenn Sie den letzten Block nicht so platzieren können, dass er die verwendeten Pfade nicht kreuzt. Ich sehe jedoch zwei Lösungen dafür: Verschieben Sie den Endblock früher oder machen Sie einige Schritte rückgängig und versuchen Sie es erneut.
Und noch ein Gedanke für die zufällige Länge der Gleitschritte: Vielleicht möchten Sie sie so auswählen, dass ein früher platzierter Block wiederverwendet wird, solange sich die Pfade nicht überlappen.
quelle