Hello, Guest the thread was viewed4.7k times and contains 95 replies

last post from 2049 at the

PUPU Solver mit Python

  • Zum Generieren von Levels könnte man andersherum vorgehen: Mauern erzeugen, dann Blockgruppen erzeugen und die dann nach "inversen Regeln" verschieben und "nach oben fallen" lassen. Muss man aber etwas Überlegung investieren, wie das genau geht (z.B. dürfen die erst erzeugten Blockgruppen sich nicht berühren falls sie gleichen Typs sind, etc.), dafür ist das Erstellen eines lösbaren Levels von der Rechenzeit her dann super-fix.

  • Kann es sein, dass der Solver folgendes Puzzle nicht lösen kann?



    Es ist das Level 25 von Lynx siehe PUPU-Level - Sammelthread

    Seine d64 im Anhang.


    Hier die txt des Levels:



    Und so sieht der Solver nach 2h aus (arbeitet immer noch):


  • Plötzlich hing mein Linux. Der Solver war bei über 4.5 Mio (3. Zahl).

    Nach Reboot nun wieder über 5.63 Mio.

    Aber Lösung kommt keine.

    Kein Wunder. Eines der 3 Herzen ist immer zu unterst im rechten tiefen Kanal.

    Auch ein Kreiz ist immer links ganz unten.

    Dort wird's nie eine Lösung geben!

  • Dort wird's nie eine Lösung geben!

    64erGruftis Pupu Solver hab ich mir bisher nicht genauer angesehen, aber die Kernkompetenz des Solvers ist wohl "brute force", da kann es tricky werden, wenn Steine erst auf bestimmte Positionen geschoben und/oder Brücken gebaut werden müssen, damit andere Steine zusammenfinden. Zu erkennen, ob "Reihe" oder "Winkel" die zielführende Lösung ist, wäre auch ein Faktor.

    Alle anderen Level hat der Solver geschafft? Cool, dann hab ich wenigstens mit einem Level gegen die Maschine, bzw. gegen 64erGruftis Code gewonnen. :D

    Daher ist "LAST ONE" der verdiente letzte Level.

  • Da gibt es beim Solver wohl noch Optimierungspotential. ;) Der Level ist lösbar.

  • ... kann es sein, daß das Laden einer Solution (.sol) noch einen Fehler hat?

    Shell-Script
    1. pupu_solver % python3 pupu_solver.py -s level015.sol
    2. pygame 2.6.1 (SDL 2.28.4, Python 3.13.0)
    3. Hello from the pygame community. https://www.pygame.org/contribute.html
    4. usage: pupu_solver.py [-h] [-z FACTOR] [-s FILE] [-d] [-f] puzzle
    5. pupu_solver.py: error: the following arguments are required: puzzle


    Das File level015.sol existiert, auch das Lösen (-f) ist möglich.


    Danke fürs Nachschauen... :-)

  • ... kann es sein, daß das Laden einer Solution (.sol) noch einen Fehler hat?

    Shell-Script
    1. pupu_solver % python3 pupu_solver.py -s level015.sol
    2. pygame 2.6.1 (SDL 2.28.4, Python 3.13.0)
    3. Hello from the pygame community. https://www.pygame.org/contribute.html
    4. usage: pupu_solver.py [-h] [-z FACTOR] [-s FILE] [-d] [-f] puzzle
    5. pupu_solver.py: error: the following arguments are required: puzzle


    Das File level015.sol existiert, auch das Lösen (-f) ist möglich.


    Danke fürs Nachschauen... :-)

    Hänge doch bitte noch die Datei an, nur damit man selber damit auch herumspielen kann :-)

  • Hänge doch bitte noch die Datei an, nur damit man selber damit auch herumspielen kann :-)

    ... ich kann gar kein Solutionfile öffnen, auch nicht das originale puzzle.sol .... evtl Bedien-/ Installationsfehler meinerseits?


    ... an der verwendeten OSX-Shell liegt's wohl auch nicht, hab von zsh auf bash gewechselt: gleiches Ergebnis.

  • pupu_solver.py: error: the following arguments are required: puzzle

    Die Fehlermeldung sagt es schon. Du brauchst auch noch das Puzzle dazu. In der SOL stehen lediglich die Züge drin. Aber welche Steine überhaupt initial im Puzzle wo stehen, ist dort nicht gespeichert. Die SOL ist immer in Verbindung mit dem Puzzle zu sehen. Also:

    Code
    1. python pupu_solver.py -s level015.sol level015.seq

    Edit:

    Theoretisch kann man eine SOL mit einem völlig anderen Puzzle starten. Kommt natürlich nur Quatsch raus und könnte sogar zum Absturz führen.

  • Die Fehlermeldung sagt es schon. Du brauchst auch noch das Puzzle dazu. In der SOL stehen lediglich die Züge drin. Aber welche Steine überhaupt initial im Puzzle wo stehen, ist dort nicht gespeichert. Die SOL ist immer in Verbindung mit dem Puzzle zu sehen. Also:

    Code
    1. python pupu_solver.py -s level015.sol level015.seq

    ... das erklärt es natürlich, danke! Und wenn das jetzt noch im GitHub-README stünde... ;-)

  • Und wenn das jetzt noch im GitHub-README stünde... ;-)

    Tut es eigentlich. Der Parameter "puzzle" ist nicht als optionaler Parameter deklariert, sondern positional. Das bedeutet, dass er an dieser Position stehen muss, wobei die meisten Systeme optionale Parameter auch an anderen Stellen akzeptieren. Desweiteren sagt er es einem ja, wenn man ihn vergisst.

    Aber ich werde es nochmal explizit rein schreiben. Beim nächsten Update wird es dann mit drin stehen. Ich habe noch eine kleine Optimierung geplant. Zumindest denke ich, dass das nochmal ein kleines Bißchen Zeit ausmachen dürfte.

  • ... noch eine Frage: gibt es einen Grund, warum der Solver unverschiebbare (da kein leeres Feld vorhanden) Glasbausteine doch offenbar versucht zu verschieben?
    Zumindest sieht das während der Lösungsversuche so aus:




    Die Fläche im konkreten Beispiel ist eigentlich komplett mit Glasbausteinen ausgefüllt:




    Wo schiebt er die denn hin? Vielleicht lässt sich hier unnötiges Verschieben reduzieren und damit insgesamt laufzeittechnisch optimieren?

  • Schick mir mal das Puzzle. Sollte eigentlich nicht passieren. Wobei man natürlich auch sagen könnte, sollte in einem Puzzle gar nicht vorkommen, weil unsinnig.

  • Schick mir mal das Puzzle. Sollte eigentlich nicht passieren. Wobei man natürlich auch sagen könnte, sollte in einem Puzzle gar nicht vorkommen, weil unsinnig.

    .. benutze sowas gern als "künstlerisches Element"... :-)

    Passiert immer, wenn die Glasbausteine ohne Bewegungsmöglichkeit eingegrenzt sind. Eine Begrenzung ist der Spielfeldrand - also keine richtige Mauer.
    Unten offen passiert es offenbar nicht, rechts schon.
    Anbei ein Dummy-Level-File, bei welchem man das beobachten kann.

    (aber kein Stress, war mir nur beim abschliessenden Testdurchlauf meiner fertigen Level aufgefallen).