Ich versuche, einen Löser in C # .NET für ein Spiel namens Flowerz zu schreiben. Als Referenz können Sie es auf MSN hier abspielen: http://zone.msn.com/gameplayer/gameplayer.aspx?game=flowerz . Ich schreibe es zum Spaß, nicht für irgendeine Art von Aufgabe oder irgendetwas, was mit Arbeit zu tun hat. Aus diesem Grund ist die einzige Einschränkung mein Computer (ein Intel i7-Kern mit 8 GB RAM). Für mich muss es nirgendwo anders laufen.
Kurz gesagt, die Regeln lauten wie folgt:
- Es gibt eine Schlange mit bunten Blumen. Ihre Länge ist beliebig
- Die Warteschlange kann nicht beeinflusst werden
- Die Warteschlange wird zu Beginn des Levels generiert
- Blumen haben entweder eine oder zwei Farben.
- Wenn es zwei Farben gibt, gibt es eine äußere Farbe und eine innere Farbe. Bei zwei Farben wird die Außenfarbe zum Abgleichen verwendet.
- Wenn es eine Übereinstimmung gibt, verschwindet die äußere Farbe und die Blume ist jetzt eine einfarbige Blume mit der gleichen Farbe wie die innere Blume
- Das Ziel des Spiels ist es, Übereinstimmungen mit drei (oder mehr) derselben Farbe zu erstellen
- Wenn eine einzelne Blume Teil eines Spiels ist, wird sie vom Spielfeld entfernt, wodurch ein leerer Raum entsteht
- Sie können eine einfarbige Blume mit der Außenfarbe einer zweifarbigen Blume vergleichen. In diesem Fall verschwindet die einfarbige Blume, die äußere Farbe der zweifarbigen Blume verschwindet und die innere Farbe bleibt erhalten
- Sie gewinnen die Runde, wenn die Warteschlange leer ist und mindestens ein Platz frei ist
- Kaskadierende Übereinstimmungen sind möglich. Eine Kaskade ist, wenn drei (oder mehr) äußere Blüten verschwinden und wenn ihre inneren Farben eine weitere Kette von drei (oder mehr Blüten) bilden.
- Das Spielfeld ist immer 7x7
- Einige Felder auf dem Feld sind von Steinen bedeckt
- Sie können keine Blumen auf Felsen legen
- Die Warteschlange kann auch einen Spaten enthalten, mit dem Sie jede platzierte Blume an einen freien Platz verschieben können
- Sie müssen den Spaten verwenden, aber Sie müssen die Blume nicht wirklich bewegen: Es ist völlig legal, sie direkt von der Stelle zu platzieren, an der sie gekommen ist
- Die Warteschlange kann auch einen farbigen Schmetterling enthalten. Wenn Sie diesen Schmetterling auf einer Blume verwenden, erhält die Blume die Farbe des Schmetterlings
- Das Anwenden eines Schmetterlings auf eine Blume mit zwei Farben führt dazu, dass die Blume nur eine einzige Farbe erhält, nämlich die des Schmetterlings
- Sie können den Schmetterling auf einem leeren Platz oder einer Blume verschwenden, die bereits diese Farbe hat
- Das Löschen des Feldes gewinnt das Spiel nicht
Das Ziel des Lösers ist einfach: Finden Sie einen Weg, die Warteschlange mit möglichst vielen verbleibenden Feldern auf dem Spielfeld zu leeren. Grundsätzlich spielt die KI das Spiel für mich. Die Ausgabe des Solvers ist eine Liste mit gefundenen Bewegungen. Ich bin nicht an Partituren interessiert, sondern daran, so lange wie möglich zu überleben. Daher interessiere ich mich für die Bewegungen, die so viele Freiräume wie möglich lassen.
Es ist unnötig zu erwähnen, dass der Suchraum mit zunehmender Warteschlange schnell wächst, sodass eine rohe Gewalt nicht in Frage kommt. Die Warteschlange beginnt bei 15 und wächst mit 5 alle zwei oder drei Ebenen, wenn ich mich recht erinnere. Und natürlich unterscheidet sich das Platzieren der ersten Blume auf (0,0) und der zweiten auf (0,1) vom Platzieren der ersten auf (1,0) und der zweiten Blume auf (0,0), insbesondere wenn Das Feld ist bereits mit Blumen aus einer früheren Runde besiedelt. Eine so einfache Entscheidung könnte den Unterschied ausmachen, ob sie getroffen wird oder nicht.
Die Fragen, die ich habe, sind die folgenden:
- Was für ein Problem ist das? (Denken Sie an einen reisenden Verkäufer, einen Rucksack oder ein anderes kombinatorisches Problem). Wenn ich das weiß, könnte mein Google-Fu ein bisschen besser werden.
- Welche Art von Algorithmus könnte mir schnell gute Ergebnisse bringen?
Zu letzterem: Zuerst habe ich versucht, meinen eigenen heuristischen Algorithmus zu schreiben (im Grunde: Wie würde ich ihn lösen, wenn ich die Warteschlange wüsste?), Aber das führt zu vielen Randfällen und Scoring-Übereinstimmungen, die ich möglicherweise übersehen habe.
Ich habe überlegt, einen genetischen Algorithmus zu verwenden (weil ich zumindest weiß, wie man das benutzt ...), aber ich habe einige Probleme, mich für eine binäre Darstellung des Boards zu entscheiden. Dann gibt es das Crossover-Problem, das jedoch mit einem bestellten Crossover-Operator oder einer ähnlichen Art von Operation gelöst werden kann.
Ich vermute, dass der Solver immer die Board-Konfiguration und die Warteschlange kennen muss, die er zu leeren versucht.
Ich kenne einige andere heuristische Algorithmen wie neuronale Netze und Fuzzy-Logik-Systeme, aber mir fehlt die Erfahrung, um zu wissen, welcher am besten geeignet ist oder ob es andere gibt, die für die jeweilige Aufgabe besser geeignet sind.