Ich muss einen Sokoban Solver machen (http://en.wikipedia.org/wiki/Sokoban). Hast du jemals einen gemacht? Ich suche nach Tipps, nicht nach Code. Wie "Sie können die IDA * alg" oder "Ich benutzte diese Heuristik und es war ziemlich gut" oder "Ich benutze diese Technologie nicht vermeiden Deadlocks".
Grundsätzlich möchte ich die Strategie vor dem Schreiben eines Codes auf Papier schreiben.
Ich habe meine Masterarbeit über Sokoban-Algorithmen geschrieben. Ich wollte einen guten Überblick über die Techniken geben, die in Sokoban Solvern verwendet werden. Es liefert keine definitiven Antworten, kann aber einen guten Ausgangspunkt für jemanden bieten, der daran interessiert ist, einen Sokoban-Solver zu schreiben.
Feld - der Level, der ganze Spielbereich des aktuellen Spiels.
position - eine Phase, die im Feld eingerichtet wird.
Endposition - eine Position, in der keine Abzweigung möglich ist - entweder das Ziel oder ein Deadlock .
Box - wie Kiste.
Nur ein bisschen Logik - es scheint offensichtlich, aber wir werden es im Implementierungsteil verwenden.
Also - über jedes Spiel von Sokoban können wir sagen, dass es eines davon ist:
Jetzt - ein Sokoban-Spiel besteht aus Wendungen, die sind:
Eine Box kann sein:
Dies ist der Schritt-für-Schritt-Prozess, den wir zum Lösen verwenden werden (Definitionen darunter):
Definitionen:
possibleTurns x - ein zweidimensionales Array oder ein Array von Arrays - das x definiert die "Tiefe" der Kurven
n - am Anfang ist Null, wird in der Ausführung des obigen Algorithmus erhöht
Schließlich - der obige Prozess wird Sie mit einer Kombination von Wendungen verlassen, die zu einer gelösten Position führen werden. Das letzte, was zu tun ist, ist einen Algorithmus wie A * zu verwenden, um den kürzesten Weg zwischen diesen Drehungen / Stößen zu bestimmen, um die Geschwindigkeit zu maximieren und um die Anzahl der Spielumdrehungen zu minimieren.
Sie können einen Brute-Force-Solver erstellen, der versucht, Ihren Mann in alle möglichen Richtungen zu bewegen. Mithilfe der Rekursion (oder eines Stapels) können Sie Ihre Schritte zurückverfolgen, wenn keine Lösung gefunden wird.
A * wird dir wahrscheinlich nichts nützen, weil du dich nicht durch ein Labyrinth finden musst, sondern auch die Boxen bewegen musst. Dies bedeutet, dass Sie möglicherweise einen Schritt in die Richtung zurücklegen müssen, aus der Sie gekommen sind, nachdem Sie eine Box bewegt haben. Also für jeden Schritt müssen Sie alle Richtungen auswerten, einschließlich der, aus der Sie gekommen sind. Das heißt, es sei denn, Sie haben im vorherigen Schritt keine Box verschoben.
[Bearbeiten] Sie könnten A * verwenden, um es etwas schlauer zu machen; um einen Weg von deiner aktuellen Position zu einer der Positionen zu finden, von der du eine Box bewegen kannst. Das würde wahrscheinlich Ihre Lösung effizienter machen, weil Sie nicht alle Positionen dazwischen verfolgen müssen, sondern nur die Positionen von der letzten Box, die Sie in die nächste Box geschoben haben, die Sie drücken.
Tags und Links artificial-intelligence