2009-07-01 6 views
10

Ich schreibe ein Mahjong-Spiel in C# (das chinesische traditionelle Spiel, nicht die Solitaire-Art). Während ich den Code für die KI des Bot-Spielers schreibe, frage ich mich, ob eine funktionale Sprache wie F # eine geeignetere Sprache wäre als die, die ich momentan verwende, nämlich C# mit einer Menge Linq. Ich weiß nicht viel über F #, weshalb ich hier frage.Ist F # eine gute Sprache für die Kartenspiel-KI?

Um zu zeigen, was ich versuche, zu lösen ist hier eine kurze Zusammenfassung von Mahjong:

Mahjong ein bisschen wie Gin Rommé spielt. Du hast 13 Plättchen in deiner Hand, und in jedem Spielzug ziehst du ein Plättchen und wirfst ein anderes Plättchen aus, um deine Hand zu einer gewinnenden Mahjong-Hand zu verbessern, die aus 4 Sätzen und einem Paar besteht. Sets können 3 (Pungs), 4 (Kongs) oder 3 aufeinanderfolgende Kacheln (Chows) sein. Du kannst auch den Abwurf eines anderen Spielers stehlen, wenn er einen deiner Sets vervollständigen kann.

Der Code, den ich schreiben musste, um festzustellen, ob der Bot 3 aufeinanderfolgende Kacheln (chow) deklarieren kann, ist ziemlich mühsam. Ich muss alle einzigartigen Kacheln in der Hand finden und dann prüfen, ob es eine Folge von 3 Kärtchen gibt, die diese in der Hand enthalten. Es ist noch komplizierter, zu erkennen, ob der Bot gehen kann, denn es ist eine Kombination aus dem Erkennen, ob 4 Sätze und ein Paar in seiner Hand sind. Und das ist nur eine Standard-Mahjong-Hand. Es gibt auch zahlreiche "spezielle" Hände, die diese Regeln brechen, aber immer noch eine Mahjong-Hand sind. Zum Beispiel, "13 einzigartige Wunder" besteht aus 13 spezifischen Fliesen, "Jade Empire" besteht nur aus Fliesen grün gefärbt, etc.

In einer perfekten Welt würde ich gerne in der Lage sein, nur die "Regeln" zu sagen von Mahjong, und die Sprache in der Lage sein, einen Satz von 13 Kacheln mit diesen Regeln abzustimmen, um herauszufinden, welche Regeln er erfüllt, zum Beispiel, ob es eine Mahjong-Hand ist oder ob es eine 4 von einer Art enthält. Ist das etwas, das F # 's Muster-Matching-Funktion helfen kann zu lösen?

Antwort

7

Wenn Sie mit funktionalen Sprachen vertraut sind, sind sie eine großartige Möglichkeit, um Spiel-AIs zu schreiben - und wenn Sie es nicht sind, hilft Ihnen die Herausforderung, einen zu lernen, und Ihnen einen besseren Programmierer als Sie wurden. (Ich könnte das gleiche für deklarative Prolog-ähnliche Sprachen und dynamische Skripting/OO/Multi-Paradigmen wie Ruby oder Python sagen!).

Ihre Aufgabe, wie Sie es beschreiben, sollte in jeder dieser Gruppen von Sprachen einfach sein - also wählen Sie eine und gehen Sie dafür! Wir helfen Ihnen gerne bei allen Fragen, die sich aus diesen Versuchen ergeben sollten (ich bin persönlich nicht vertraut mit F # oder Scala, würde aber gerne mit Haskell, jeder ML-Familiensprache, Scheme oder Erlang helfen) ähnlich für die anderen Gruppen ;-).

Im Ernst: Die vollständige Beherrschung von mindestens einer Sprache in jeder breiten Kategorie (prozedurale, funktionale, deklarative/Klausel Vereinigung, relational, dynamisch/Multi-Paradigma, usw.) machen Sie zu einem ernst besser Programmierer - Mahjong auseinander (und es ist ein klassisch beliebtes Spiel in der Romagna in Italien, in der Nähe meiner Heimatstadt Bologna ;-), jede Aufgabe, die in dieser Hinsicht zu Ihrem Dienstplan hinzufügen kann, ist gut lohnt sich !!!

1

Es gibt nichts, was Sie nicht selbst machen können, das in einer anderen Sprache erscheint.

Ich habe versucht, KI vorher mit Java zu machen, basierend auf dem, was ich in Prolog gemacht habe. Ich dachte, es wäre eine Schlampe zu programmieren. Allerdings hatte ich nur ein paar Methoden, die eine Menge Grunz-Arbeit leisteten und es aus den Hauptmethoden herausholten, und es funktionierte wunderbar.

Sie müssen das Rad vielleicht neu erfinden, aber es sollte nicht viel geben, was Sie nicht in C# machen können, das Sie in F # können.

Hinweis: Ich habe noch nie von F # gehört, aber es kann nicht so schlimm sein. Ich kann/darf nicht aus meinem eigenen Arsch wehen.

Verwandte Themen