Sokoban Solver, Tipps [geschlossen]

8

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.

    
Dr Sokoban 21.11.2010, 10:52
quelle

3 Antworten

17

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.

Ссылка

    
Weetu 23.02.2012 21:32
quelle
6

Begriffe

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.

Theorie

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:

  • lösbar, ungelöst - bei der Lösung von
  • lösbar, gelöst - das Ziel
  • unlösbar, ungelöst - wenn unsere Implementierung keine Ergebnisse liefert und es keine weiteren Moves / Kombinationen von Moves mehr gibt

Jetzt - ein Sokoban-Spiel besteht aus Wendungen, die sind:

  • Züge - Der Charakter kann sich in einem Bereich bewegen, der durch Wände und / oder Kästchen definiert ist. Dieser Bereich ist jedoch kleiner oder gleich (wenn man die Wände nicht zählt und keine Kästchen) für den gesamten Spielbereich macht das Bewegen des Charakters um das Feld keinen Unterschied außer score, was für die tatsächliche Lösung irrelevant ist - lasst es uns jetzt ignorieren
  • schiebt - das Drücken der Kästchen ist viel wichtiger und kann möglicherweise zu unserem Ziel führen - das Feld zu lösen - indem wir die Kästchen auf ihre jeweiligen Ziele schieben

Eine Box kann sein:

  • In-Ziel - diese Box muss höchstwahrscheinlich nicht verschoben werden, und einige Regeln können verhindern, dass sich eine Box bei einer Zielposition bewegt (sehr ungewöhnlich)
  • drückbar - in 1 bis 4 Richtungen
  • nicht dehnbar, nicht am Ziel
    • durch 2 Wände blockiert - die aktuelle Position ist unlösbar egal was
    • andere - wir werden später zu dieser Kiste kommen - denn jetzt steht uns eine Kiste im Weg

Prozess

Dies ist der Schritt-für-Schritt-Prozess, den wir zum Lösen verwenden werden (Definitionen darunter):

  1. bevölkert possibleTurns n mit jedem direkt zugänglichen Push (drückbar oder im Ziel) an der aktuellen Position, mit dem Spieler an der aktuellen Position
  2. nimm das erste Element in possibleTurns n , entferne es und führe es aus
  3. sehen ob die aktuelle Position:
    1. ist endgültig - Ziel - gelöst, tue nichts
    2. ist final - Deadlock - dieser Turn führte zu einem Deadlock, bevölkere ihn nicht mehr, gehe zurück zu 2. Schritt, n bleibt gleich
    3. ist nicht final - inkrementieren Sie n und füllen Sie possibleTurns n mit möglichen Drehungen in dieser Position

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

Tipps

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.

    
Aurel Bílý 22.11.2010 20:09
quelle
1

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.

    
GolezTrol 21.11.2010 11:03
quelle

Tags und Links