home
erste Version am 11.11.2013
letzte Änderung am 13.01.2014

Dedes Sokoban V2


Dedes Sokoban V2 ist ein Python-Programm zum Spielen von Sokoban-Puzzles unter Linux.



Das Spiel

Die Spielfigur (bzw. Kugel) wird klassischerweise mit den Cursor-Tasten gesteuert und kann Kisten nur einzeln über Boden oder Zielfelder schieben, um sie so alle auf die Zielfelder zu bewegen. Wände sind unpassierbare Hindernisse für die Spielfigur und für Kisten.
Viele Puzzles enthalten auch passierbare Felder, auf die zwar Kisten geschoben werden können, danach aber festsitzen - also nie mehr ein Zielfeld erreichen können. Solche Felder sind also Tot-Stellungen. Für sie kann eine farbliche Kennzeichnung eingeschaltet werden.
Weiterhin können mehrere Kisten so platziert werden, dass sie sich gegenseitig blockieren und ebenso festsitzen. Einige dieser Stellungen kann das Programm erkennen und (optional) anzeigen.

Ein Spiel ist beendet, wenn entweder auf allen Zielfeldern Kisten stehen oder wenn alle Kisten auf Zielfeldern stehen.
Wurde ein Spiel gelöst, wird die Lösung gespeichert und kann später vorgeführt werden.
War für ein Spiel bereits zuvor eine Lösung gespeichert, wird diese durch eine neue Lösung nur dann überschrieben, wenn die neue Lösung kürzer als die vorherige ist.

Hauptfenster




Voraussetzungen

Es wird ein Python-Interpreter in der Version 2.7.x benötigt.
Für das GUI wird wxWidgets (bzw. wxPython) in der Version 2.8 benötigt.
Für Spiele im slc-Format wird lxml genutzt.
Als Datenbank kommt sqlite3 zum Einsatz.

Entwickelt wurde es mit:
- python-2.7.2-7.17.1.x86_64
- python-wxWidgets-2.8.12.1-10.4.1.x86_64
- python-lxml-2.3.4-2.1.2.x86_64
- sqlite3-3.7.8-1.1.2.x86_64


Das Programm legt zwei Dateien im Home-Verzeichnis an.
.soko2rc
In dieser Datei werden der Name der aktuellen Spiele-Datei, die Fenstergröße und Position, sowie Farben und weitere Einstellungen gespeichert.

soko2db.sqlite
In dieser Datei werden die Lösungen von Puzzles abgelegt.


Die Python-Scripte: SokobanV2.zip
Die Datei SokoMain.py ist das zu startende Hauptprogramm.

Meine Datenbank-Datei mit einigen Lösungen: soko2db.sqlite



Bewegungen mit der Maus

Dedes Sokoban kann auch mit der Maus gesteuert werden. Wird mit der linken Maustaste auf ein freies Feld geklickt, wandert die Spielfigur dort hin. Der Weg von der aktuellen Position der Spielfigur zum geklickten Feld muss dazu, ohne Kisten bewegen zu müssen, frei sein.

Kisten können mit der Maus dadurch bewegt werden, dass eine Kiste mit der linken Maustaste geklickt, dann der Mauszeiger auf ein freies Feld bewegt und dort die Maustaste losgelassen wird. Auch hier muss zunächst mal der Weg von der Spielfigur zur geklickten Kiste erreicht werden können, ohne Kisten bewegen zu müssen. Und danach muss die zu bewegende Kiste auf das Zielfeld geschoben werden können, ohne andere Kisten bewegen zu müssen.

Wird bei der Spieler- oder Kisten-Bewegung kein entsprechend freier Weg gefunden, erscheint für eine Sekunde lang eine entsprechende Markierung für den nicht erfüllbaren Bewegungs- bzw. Schiebe-Wunsch.






Die Statuszeile

Die Statuszeile teilt sich in drei Bereiche.



Die Menüpunkte

- File/Open

Öffnet eine Sokoban-Spiele-Datei. Die Datei-Auswahl erfolgt über folgenden Dialog.

openFile

Der anzuzeigende Datei-Typ (.skm, .slc, .txt oder all) kann an der rot umrandeten Stelle gewählt werden.

Nach Auswahl einer Datei, die mehr als ein Spiel enthält, öffnet sich ein weiteres Fenster, in dem das zu ladende Spiel auszuwählen ist.
Bei Spielen, für die bereits eine Lösung existiert, wird in der Spalte "Solved by" der Lösende und in "Moves" die Anzahl der benötigten Züge angezeigt.
Spiel-Auswahl

Bei sehr großen Spielfeldern (so oberhalb von 30x30) kann das Laden etwas länger dauern, weil vor der Anzeige des Feldes die Tot-Stellungen berechnet werden - und zwar unabhängig von der Einstellung unter "Mark dead boxes/floors".

- File/Single game from clipboard

Öffnet ein Sokoban-Spiel, das sich im Clipboard befindet.
Das minimale Spiel sieht etwa so aus:
Clipboard
Spiel
 ####
#@$ .#
 ####
Minimal


Es bedeuten:
Symbol/Datei
Symbol/Spiel
Bedeutung
"#"
Mauer
Mauer
" "
freier Weg
freier Weg
" "
Tot-Stellung
freier Weg aber Tot-Stellung
"$"
Box
Box
"$"
tote Box
tote Box
"*"
Box auf Zielfeld
Box auf Zielfeld
"."
Zielfeld
Zielfeld
"+" Spielfigur auf
              Zielfeld Spielfigur auf Zielfeld
"@"
Spielfigur
Spielfigur

Enthält das Spielfeld Fehler, wird eine entsprechende Meldung ausgegeben und das Spiel nicht angezeigt.
Fehler sind:
- ein nicht geschlossenes Spielfeld
- keine Spielfigur im Spielfeld
- keine Box im Spielfeld
- kein Zielfeld im Spielfeld

Eine zuvor möglicherweise via "File / Open" geöffnete Spiele-Datei wird durch diese Funktion geschlossen.
Die Auswahl von "Next game" oder "Previous game" führt somit zu einer Fehlermeldung.

- File/Merge solutions

Erlaubt zunächst mal das Anlegen von Hosts, auf denen ebenfalls Dedes Sokoban V2 installiert ist. Pro Host ist außerdem ein Pfad zu einer Sokoban-Datenbank-Datei anzugeben.
Damit diese Datenbank-Datei von dort aufs lokale System kopiert werden kann, muß es via ssh bzw. scp ohne Passwort-Abfrage erreichbar sein.
Bei Bedarf hängt man den eigenen .ssh/id_rsa.pub an .ssh/authorized_keys an und kann so lokal vorliegende soko2db.sqlite-Dateien importieren.
Dialog-Fenster
Nachdem der Host samt Pfad angelegt ist, erscheint er in der unteren Liste. Mit dem Schalter "check online" kann geprüft werden, ob der Host z.Zt. erreichbar ist.
Per Kontextmenü (links-Klick mit der Maus) kann über die Funktion "merge solutions from this host:path" dessen Datenbank-Datei ins lokale /tmp-Verzeichnis kopiert werden, um dann von dort die kürzeren oder lokal noch nicht vorhandenen Lösungen für Puzzles in die aktuelle Datenbank zu importieren.

- Editor

Öffnet ein neues Fenster, in dem Puzzles erstellt werden können.
Diese Funktion ist noch nicht vollständig implementiert.

- File/Quit

Beendet das Spiel.




- Game/Show solution

Lädt eine Lösung (sofern vorhanden) aus der Datenbank. Die Lösung kann mit der Taste "s" (oder dem MouseWheel) schrittweise durchlaufen werden.

- Game/Enter solution

Erlaubt die Eingabe eines Lösungs-Strings für das aktuelle Puzzle. Legale Zeichen sind "UDLRudlr". Die Lösung kann mit der Taste "s" (oder dem MouseWheel) schrittweise durchlaufen werden. Erst wenn die Lösung komplett durchlaufen wurde, wird sie ggf. in der Datenbank gespeichert.

- Game/Solution to clipboard

Kopiert den Lösungs-String ins Clipboard.

- Game/Take snapshot

Speichert die aktuelle Stellung im Spiel temporär ab.

- Game/Revert to snapshot

Lädt eine per "Take snapshot" gespeicherte Stellung wieder ins Spielfeld.

- Game/Next Game

Lädt das nächste Spiel aus einer geöffneten Spiele-Datei.

- Game/Previous Game

Lädt das vorherige Spiel aus einer geöffneten Spiele-Datei.

- Game/Use mouse too

Schaltet die Nutzung der Maus zum Bewegen der Spielfigur oder von Kisten an bzw. aus.
Das Ausschalten der Maus macht eigentlich nur dann Sinn, wenn man das Spiel ausschließlich mit der Tastatur steuern möchte und sich daran stört, dass Mausklicks in das Spielfeld die Spielfigur zu dieser Position wandern lassen - obwohl man mit dem Maus-Klick eigentlich nur das Fenster in den Vordergrund holen wollte.

- Game/Mark dead boxes/floors

Schaltet die Markierung von Tot-Stellungen an bzw. aus.




- Setup/Adjust speed

Zeigt ein Fenster an, in dem die Wartezeit zwischen zwei Spielerbewegungen bei Maus-Steuerung eingestellt werden kann.
AdjustSpeed-Fenster

- Setup/Setup colors

Zeigt ein Fenster an, in dem die Farben der Objekte auf dem Spielfeld an die eigenen Bedürfnisse angepasst werden können.
SetupColors-Fenster


- Setup/Open navigation area

Öffnet ein neues Fenster, in dem die Tastenkürzel per Maus-Klick ausgeführt werden können.
Die Funktion der jeweiligen Schaltflächen wird angezeigt, wenn der Maus-Cursor über ihr steht.
Navigations-Fenster




- Help/Keys help

Zeigt ein kleines (lieblos gestaltetes) Fenster mit den nutzbaren Tasten und ihrer jeweiligen Funktion an.
KeysHelp-Fenster


- Help/Auto-solve v1

Sucht eine Lösung für das aktuelle Puzzle, indem sämtliche möglichen Züge probiert werden. Es ist also mit einem BruteForce-Ansatz implementiert, der lediglich solche Stellungen verwirft bzw. nicht weiter untersucht, bei denen mindestens eine Kiste kein Zielfeld mehr erreichen kann oder eine Stellung identisch zu einer Stellung ist, die bereits mit weniger Zügen erreicht wurde. Nach 1000 Zügen wird die Suche abgebrochen. Mit der ESC-Taste kann die Suche manuell abgebrochen werden.

Die Anzeige in der Statuszeile zeigt bei laufendem Autosolver beispielsweise folgendes an:
Statusleiste bei Autosolve

Das ist zu interpretieren als:
cur-len
die Zuglänge zum Erreichen der derzeit getesteten Stellungen.
tests (erster Wert)
die Anzahl der bereits getesteten Stellungen+Züge dieser Länge.
tests (zweiter Wert) die Anzahl aller möglichen Stellungen+Züge dieser Länge (abzüglich der bereits erkannten Tot-Stellungen oder Stellungs-Wiederholungen).
total
die Anzahl der bisher insgesamt getesteten Stellungen+Züge.
removed
die Anzahl der bisher als Tot-Stellung erkannten und daher verworfenen Stellungen.
dict
die Anzahl der Stellungen, die als weiter zu verfolgen erkannt wurden.

Für Puzzles mit mehr Kisten als Zielfeldern wird diese Routine nie eine Lösung finden, wenn der Lösungsweg erfordert, dass eine Kiste auf ein Feld geschoben werden muss, von dem diese Kiste nie wieder ein Zielfeld erreichen können wird.

- Help/About

Zeigt ein kleines Fenster mit Versions-Informationen an.
About-Fenster




Quellen für Sokoban-Spiele-Dateien

http://sokobano.de/wiki/index.php?title=Links#Levels_for_Downloading
http://www.sourcecode.se/sokoban/levels.php
http://borgar.net/programs/sokoban/