Schritte für automatische Solitaire Lösung

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Schritte für automatische Solitaire Lösung

    Hallo,

    ich habe schon ewig nicht mehr programmiert, habe mir aber in den Kopf gesetzt, mir einen Solitaire Löser zu programmieren (Solitaire ist das Brettspiel in welchem man mit einem Stein über einen anderen hüpfen muss um diesen zu entfernen... und das immer so weiter bis nur noch ein Stein übrig ist).

    Dabei sollte es kein festes Brett geben, sondern alles durch vorherige Eingabe geregelt werden.
    Mein Problem: Ich weiß überhaupt nicht wie ich das richtig anstelle und hoffe jemand kann mir einen Denkanstoß geben.

    Das einlesen der Daten ist kein Problem.
    Aber wie mache ich dann weiter? Lasse ich das Programm "wahllos" nach einem Stein suchen der bewegt werden kann?
    Ist es besser hier nach einem bestimmten Muster vorzugehen? Steine von oben links nach unten rechts durchgehen und prüfen ob dieser gezogen werden kann?

    Wie bastel ich das ganze rekursiv (wenn ich den informatikunterricht noch richtig in Erinnerung habe, ist das der richtige Begriff :D)? Also das ich die Züge speichere und wenn kein Zug mehr geht, den letzten Rückgängig mache und dann prüfe ob jetzt andere Züge möglich sind? Hierfür muss man ja 2 verschiedene Dinge speichern, die bisherigen Züge um den letzten Rückgängig zu machen, aber die gleichzeitig auch gespeichert lassen, damit diese nicht wiederholt werden?

    Oder das ganze einfach per "Brute Force" aufziehen? Einfach solange Steine versetzen bis entweder nur noch einer übrig ist oder kein Zug mehr möglich ist und komplett von vorn beginnen?

    Würde mich über Denkansätze sehr freuen, weil ich echt raus bin aus der Sache :/

    mfg

    Quillok schrieb:

    (Solitaire ist das Brettspiel in welchem man mit einem Stein über einen anderen hüpfen muss um diesen zu entfernen... und das immer so weiter bis nur noch ein Stein übrig ist).
    Das heißt Einsiedlerspiel.
    Solitaire ist ein Kartenspiel. spiegel.de/sta/solitaire-das-k…ne-spielen-a-1175946.html
    Wenn bei Frau Google das Einsiedlerspiel auch Solitaire genannt wird, ist das eher irreführend.
    ====
    Programmiere den Spielablauf, merke Dir jeden Zug. Erkenne die Zug-Möglichkeiten.
    Wenn es nicht mehr weiter geht, gehst Du einen Zug zurück und probiere die nächste Möglichkeit.
    Hast Du alle Möglichkeiten erfolglos durch, gehe einen weiteren Zug zurück.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Verfahren heisst Backtracking, und ist vorzügliches Arbeitsgebiet rekursiver Methoden.

    Ich bin allerdings höchst verwundert, dasses kein festes Brett gibt, und gleichzeitig das Einlesen der Daten kein Problem ist.
    Weil wenn du das geschafft hast, dann bist du so gut, dass die Lösung per Backtracking zu programmieren dir ein Klacks sein sollte.

    Ich hingegen hab schon ein Problem, mir "kein festes Brett" überhaupt vorzustellen, und folglich könnte ich auch kein Datenmodell konzipieren, und folglich erst recht keine Daten einlesen.
    Weil zum Daten einlesen braucht man ein Datenmodell, in das man die gelesenen Daten sinnvoll vorhalten kann.

    Also 2 Fragen an den TE:
    • Weisst du, was ein Datenmodell ist?
    • Weisst du, was Rekursion ist?
    Handelt es sich hierbei nicht um das Spiel? Bei diesem Spiel muss man über einen Stein hüpfen um den darunterliegenden Stein entfernen zu dürfen.
    de.wikipedia.org/wiki/Dame_(Spiel)


    EDIT: Gefunden, wird tatsächlich auch Solitär genannt.
    de.wikipedia.org/wiki/Solitär_(Brettspiel)


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    ErfinderDesRades schrieb:

    Das Verfahren heisst Backtracking, und ist vorzügliches Arbeitsgebiet rekursiver Methoden.

    Ich bin allerdings höchst verwundert, dasses kein festes Brett gibt, und gleichzeitig das Einlesen der Daten kein Problem ist.
    Weil wenn du das geschafft hast, dann bist du so gut, dass die Lösung per Backtracking zu programmieren dir ein Klacks sein sollte.

    Ich hingegen hab schon ein Problem, mir "kein festes Brett" überhaupt vorzustellen, und folglich könnte ich auch kein Datenmodell konzipieren, und folglich erst recht keine Daten einlesen.
    Weil zum Daten einlesen braucht man ein Datenmodell, in das man die gelesenen Daten sinnvoll vorhalten kann.

    Also 2 Fragen an den TE:
    • Weisst du, was ein Datenmodell ist?
    • Weisst du, was Rekursion ist?


    kein festes Brett bedeutet, dass es einerseits verschiedene Bretter mit Felder gibt, welche bespielt werden können und welche nicht. Es muss also nicht immer nur das "normale" Kreuz sein, sondern es gibt auch Felder die komplett quadratisch sind etc. Weiterhin können die Ausgangsstellungen der Steine verschieden sein, genau daher möchte ich ja eine automatische Lösungsöglichkeit haben, um zu jeder Zeit lösen zu können bzw. um zu prüfen ob es möglich ist noch zu lösen.

    Das das einlesen kein Problem ist, bedeutet für mich einfach, dass ich es mir "einfach" machen würde und entweder im Programm per Checkboxen angeben würde welche Felder bespielbar sind und welche Steine beinhalten oder diese über eine Datei einlesen würde. Das kann ich schon :D

    RodFromGermany schrieb:


    ====
    Programmiere den Spielablauf, merke Dir jeden Zug. Erkenne die Zug-Möglichkeiten.
    Wenn es nicht mehr weiter geht, gehst Du einen Zug zurück und probiere die nächste Möglichkeit.
    Hast Du alle Möglichkeiten erfolglos durch, gehe einen weiteren Zug zurück.


    Genau hier setzt meine nicht vorhandene Erfahrung an :D
    Korrigiert mich bitte wenn ich falsch liege oder irgendwas ausser Acht lasse:

    Es reicht ein einziges Feld aus, in welchem ich immer die bisherigen Züge speichere und mir per Variable merke, welches der Start der letzten neuen Zugreihenfolge ist, damit ich dann bei einem Scheitern mit dem vorherigen Zug starten kann?!

    - ich würde das Feld von oben links nach unten rechts bearbeiten
    - finde ich einen Stein der einen Zug machen kann, ziehe ich diesen
    [Problem] Es ist wahrscheinlich das der Stein nicht weiterziehen kann, aber den Weg für andere Steine nun frei ist
    Gehe ich das Feld nun wieder von oben links nach unten rechts durch und prüfe ob ich einen Stein ziehen kann? Oder gehe ich vom alten Standpunkt des Steins aus und prüfe ob ein anderer Stein auf diesen springen kann und ziehe diesen dann?
    Ist es dann eventuell sinniger direkt nach freien Feldern zu suchen und ausgehend von diesen zu prüfen ob ein Stein raufspringen kann?

    Man, das nervt mich so, das sind bestimmt relativ einfahe Sachen aber mich überfordern die irgendwie, dabei denke ich mir, dass das bestimmt einfach zu programmieren ist... bitte sagt mir das das nicht so einfach ist, auch für die Profis hier von euch :S

    Quillok schrieb:

    Es reicht ein einziges Feld aus, in welchem ich immer die bisherigen Züge speichere
    Es genügt, alle Spielzustände und alle verworfenen Spielzustände zu speichern.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wie gesagt, dazu braucht man ein Datenmodell: das Modell eines Spielzustandes.
    Sonst kann man logisch einen Spielzustand nicht speichern.

    Aber das interessiert den TE ja offsichtlich nicht, er beantwortet ja nichtmal meine diesbezügliche Frage.
    (und die annere Frage auch net)

    Immerhin kannich trösten: Diese Aufgabe ist auch für Profis nicht einfach.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()