Entwickler-Ecke

Open Source Projekte - Sokoban


Mathematiker - Do 22.09.16 22:06
Titel: Sokoban
Hallo,
eine Umsetzung von Sokoban gab es hier in der EE schon einmal, d.h., es ist nicht Neues.
In den Weihnachtskalendern war es jedes Jahr vorhanden, und wer weiß, vielleicht will der eine oder andere ja trainieren ... :wink:

Im Anhang befindet sich eine einfache Variante von Sokoban mit 200 Spielstufen.
sokoban
Ziel ist es, die Kisten mit der Spielfigur auf die Felder zu verschieben, die mit einem Kreuz markiert sind.
Dabei kann eine Kiste nur bewegt werden, wenn das unmittelbar dahinter liegende Feld frei ist. Zwei oder mehr Kisten können nicht gleichzeitig verschoben werden. Die Spielfigur wird mit den Pfeiltasten bewegt.

Während die ersten Spielstufen noch sehr einfach zu lösen sind, steigt der Schwierigkeitsgrad von Stufe zu Stufe an. Als kleiner Hinweis sei erwähnt, dass Kisten, die in Ecken verschoben werden, nicht mehr bewegt werden können und es teilweise darauf ankommt, die Felder mit den Kreuzen in der richtigen Reihenfolge zu belegen. Ist die jeweilige Aufgabe nicht mehr lösbar, wird durch Zurücksetzen die Ausgangssituation wiederhergestellt.

Viel Spaß
Mathematiker

Edit 1/2: Fehler in Demo korrigiert

Nachtrag: Das ZIP-File sokoban_mit_aufzeichnung enthält eine Variante, bei der während des Spielens die Züge aufgezeichnet werden. (siehe auch weiter unten)

Edit 1: Spielstufen ergänzt, neue Demonstrationen und "Zug zurücknehmen"-Schalter


Delphi-Laie - Fr 23.09.16 00:11

Kistenschieben und Kipplabyrinth sind in jedem Deiner Weihnachts- oder vielleicht besser Adventskalender meine Lieblingsspiele.


Delphi-Laie - Sa 24.09.16 12:03

Schön, daß die Quelltexte dabeiliegen, danke dafür! Das hat meine Neugier geweckt.

Mit geringfügigem Änderungsaufwand, der sich nach meiner ersten Beobachtung nicht auf das Compilat auswirkt, läßt sich das Projekt auch noch mit Delphi 2 compilieren. Das verringert die Größe der Exe-Datei auf "339 KB (347.136 Bytes)" (Ergänzung: Also eine Größenreduktion um fast 40%!). Ich weiß schon, warum mir bei den Klagen über die erheblichen Compilatsgrößen (von der hier noch keine Rede sein kann) immer als erstes die Wahl einer möglichst geringen / niedrigen Delphi-Version einfällt. Ergänzung: Das Problem rührt schon seit den Turbo-Pascal-Zeiten her, auch dessen Compilate wurden immer fetter und redundanter.

Eine Frage habe ich aber noch, Mathematiker: Mit welchem Zaubertrick erreichst Du, daß man beim Einladen im Quelltext des Projektes landet und eben nicht sofort im Quelltext der Unit?


Mathematiker - Sa 24.09.16 13:37

Hallo,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Eine Frage habe ich aber noch, Mathematiker: Mit welchem Zaubertrick erreichst Du, daß man beim Einladen im Quelltext des Projektes landet und eben nicht sofort im Quelltext der Unit?

Keine Ahnung. Das passiert bei mir manchmal, warum weiß ich nicht. Irgendwie ist das komisch.

Beste Grüße
Mathematiker


Delphi-Laie - Sa 24.09.16 15:20

Das ließ meinem Forscherdrang natürlich keine Ruhe....

Die Lösung scheint einfach zu sein: Das Formular muß nur wieder den Namen Form1 bekommen (inkl. entsprechender Anpassungen auch in der Projektdatei: "Application.CreateForm(TForm1, Form1)"), und schon öffnet das Projekt wunschgemäß (?) bei diesem Formular und seiner entsprechenden Unit (die nicht notwendigerweise auch zu "Unit1" zurückbenannt werden muß).

Ob das ein Delphi-Fehler ist? Oder ein sog. "Feature"? (Letzteres ist bekanntermaßen Winzigweichs Standardausrede).


Delphi-Laie - Sa 24.09.16 16:36

Und gleich noch etwas: Bis zur Spielstufe 118 kann man sich die Lösung demonstrieren lassen (entsprechende Bedienelemente sind aktiv). Bei der 118. Spielstufe bleibt diese Demonstration allerdings auf halbem Wege stehen ("hängen").


Mathematiker - Sa 24.09.16 17:02

Hallo,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Bei der 118. Spielstufe bleibt diese Demonstration allerdings auf halbem Wege stehen ("hängen").

Dank für den Hinweis.
Beim Kontrollieren habe ich festgestellt, dass der Lösungsstring in der Listbox abgeschnitten wurde.
Daher musste ich zu meiner Originalvariante zurückkehren und die zwei Datenlisten in die Ressource packen. Jetzt geht es, hoffe ich.

Beste Grüße
Mathematiker


Delphi-Laie - Sa 24.09.16 17:08

Und schon "flutscht" die Demonstration sogar bis zur 175. Spielstufe!


Mathematiker - Sa 24.09.16 17:44

Hallo,
im Moment werden nur die ersten 175 Stufen der 203 demonstriert.
Ich gebe zu, dass ich einfach zu faul :cry: war, auch noch die letzten Spielstufen so oft zu spielen, bis eine einigermaßen vorzeigbare Demonstration möglich war.

Vielleicht möchte ja der eine oder andere aus der EE helfen.
Markiert ihr in der Version sokoban_mit_aufzeichnung (1.Post) vor dem Spielen einer Stufe das Feld "Aufzeichnen", so wird im Programmverzeichnis beim erfolgreichen Lösen der Spielstufe eine Datei verlauf.xxx abgelegt. Diese enthält die Lösung.
Solltet ihr tatsächlich so viel Zeit haben, eine der Stufen 176 bis 203 zu spielen, so wäre es nett, wenn ihr die Dateien verlauf.xxx an mich per PN senden würdet.
Den erfolgreichsten Spieler werde ich natürlich würdigen. :zustimm:

Beste Grüße
Mathematiker


Delphi-Laie - Sa 24.09.16 18:56

Jetzt sag bloß noch, daß die Lösungen aufgrund Deines Spielfleißes und Lösungsspürsinnes entstand?! Es liest sich so. Programmieren tust Du dann noch "nebenbei" - oder bist Du ein Mensch ohne Schlafbedürfnis? ;-) Oder hat Sachsen deutlich mehr Stunden pro Tag? :?:

Und die Spielfelder - woher stammen die? Etwa auch noch ausgedacht? Das wäre umwerfend.

Bisher vermutete ich, daß Du sowohl die Aufgaben als auch deren Lösung von "irgendwelchen" Vorlagen - woher auch immer - fleißig übernahmst.


Delphi-Laie - Sa 24.09.16 21:44

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht möchte ja der eine oder andere aus der EE helfen.


Gern. Testspieler und Testesser sind doch so ungemein angenehme Aufgaben.

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Solltet ihr tatsächlich so viel Zeit haben, eine der Stufen 176 bis 203 zu spielen


Nun, Nr. 177 ist nach meinem Empfinden unlösbar, denn dort befindet sich (oben links der Mitte) eine Kiste in einer Ecke. Da die Kisten nicht gezogen, sondern nur verschoben werden können, kann sie aus dieser Ecke m.E. nimmer befreit / heraugeholt, demnach auch nie auf eine Placierstelle verschoben werden.


Mathematiker - So 25.09.16 08:09

Hallo,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Nun, Nr. 177 ist nach meinem Empfinden unlösbar, denn dort befindet sich (oben links der Mitte) eine Kiste in einer Ecke.

Oops, da ist wohl ein Fehler drin. :autsch:
Werde ich wohl ändern müssen.

Beste Grüße
Mathematiker


Delphi-Laie - Di 27.09.16 22:25

Wie schon per PN geschrieben, durch "Rückwärtsspielen", indem man die Kisten von ihren Zielplätzen wegzieht, sind beliebige und ausnahmslos lösbare Ausgangskonstellationen kreier-/generierbar.

Noch zwei Dinge fände ich ganz lässig:

1. Eine "Undo"-Taste wenistens für den letzten Zug. Versehentliches und vor allem "unheilbares" Verschieben ist, sofern man kurz vor dem Ziele ist, zum Haareraufen.
2. Wenn die Kisten auf einem Stell-/Zielplatz sich befinden, daß dann das darunterliegende Muster dezent durchschimmert, damit man eben diese wichtige Information trotzdem hat.

Nur als vorsichtige Anregungen....


Sinspin - Mi 28.09.16 10:29

Herauszufinden ob ein Level spielbar ist, oder nicht, lässt sich doch auch durch probieren herausfinden. Also ich mein jetzt programmiertes probieren. Wir haben sowas im Studium mal in Prolog gemacht. Aber mit Delphi geht das auch. So kann man auch den optimalen Lösungsweg finden... und dann als Lösung mitliefern.

Um Ressourcen mit ins Programm einbetten zu können habe ich mir ne Klasse geschrieben mit der ich beliebige Daten komprimiert in ein const array schreiben kann das in einer eigenen Unit gespeichert wird. Ich binde die Unit dann mit ein und entpacke einfach die Daten aus der Konstante wenn ich sie brauche.


Delphi-Laie - Mi 28.09.16 13:34

user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Herauszufinden ob ein Level spielbar ist, oder nicht, lässt sich doch auch durch probieren herausfinden. Also ich mein jetzt programmiertes probieren.


Oder, ohne Computer, allgemeiner durch systematisches Probieren (Backtracking), nicht wahr? Ist allerdings ohne Computer eine fehleranfällige Qual.


Mathematiker - Fr 30.09.16 19:55

Hallo,
Dank der großen Hilfe von user profile iconDelphi-Laie enthält jetzt die Variante "mit Aufzeichnung" fünf neue Spielstufen, für die eine Demonstration möglich ist.
user profile iconDelphi-Laie hat 5 Stufen gelöst, die ich jetzt als Nr. 176 bis 180 eingeordnet habe.

Die fehlerhafte Spielstufe ist korrigiert und jetzt die Nr.203.
Außerdem habe ich einen Schalter eingebaut, mit dem man den letzten Zug zurücknehmen kann.

Beste Grüße
Mathematiker


Delphi-Laie - Sa 01.10.16 16:39

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Außerdem habe ich einen Schalter eingebaut, mit dem man den letzten Zug zurücknehmen kann.


"Lässig", den habe ich mir schon lang gewünscht.

Es geht nicht darum, sich die Lösung per "Backtracking" zu erschummeln, auch wenn sich eine solche Funktion dafür ein wenig mißbrauchen läßt. Dafür ist ein Zug zurück auch etwas zu spartanisch. Vielmehr geht es darum, daß eine kleine Unaufmerksamkeit, ein kleines Versehen nicht gleich mit der "Maximalstrafe" vergolten wird.