die neueste Idee für ein gemeinsames Programmier-Projekt ist die Umsetzung eines einfachen Brettspiels. Vorgeschlagen wurde bisher Dame oder Mühle. Hier sollten zunächst die Rollen "Design / GUI" (1), "Implementierung des Regelwerks / API für Spielablauf" (2) und "Programmierung des Computergegners (KI)" (3) besetzt werden. Außerdem muss am Ende natürlich alles zusammengebracht werden.
Grobe Abhängigkeiten
* Von der Rolle "Design / GUI" sollte eine Schnittstelle zum Setzen, Bewegen und Schlagen von Steinen erstellt werden. Der GUI-Anteil dieser Rolle stellt die Abbildung des Designs dar (Zeichnen des Bretts und der Steine). Hier sollte außerdem auf Maus- und Tastatur-Events gehorcht werden (denkbar wäre das Ziehen von Steinen auf die neue Position via Drag & Drop und/oder das Verschieben der Steine mittels Pfeiltasten auf der Tastatur). Die Events sollten als Spielzüge interpretiert und diese Spielzüge an die Logik übergeben werden. Nach einem erfolgreichen Spielzug sollte die GUI sich die veränderte Spielsituation aus der Logik abrufen (möglicherweise wurde ein gegnerischer Stein geschlagen) und die neue Situation grafisch darstellen.
* Die eigentliche Spiellogik hat Infos zur Belegung aller Felder und zu den bisher geschlagenen Steinen. Die grafische Umsetzung erfolgt durch entsprechende Aufrufe seitens der Design-API. IMHO sollte die Logik sich passiv verhalten und nur auf Anforderungen reagieren, d.h. sie selbst tätigt keine Aufrufe von anderen Komponenten. Die Logik meldet dem Aufrufer außerdem per Exception zurück, falls ein Spielzug nicht erlaubt ist. Die Folgen eines Spielzuges (neue Feldbelegung, Entfernen geschlagener Steine) berechnet die Logik selbständig und stellt die veränderte Spielsituation zum Abruf durch den Aufrufer bereit. Die Logik sollte außerdem ein eigenes Signal/Event aussenden können, um eine Änderung der Spielsituation zu signalisieren. Mit diesem Signal ist die GUI (und vielleicht später etwas anderes) verbunden, damit die Änderung abgebildet werden kann. Ein weiteres Signal sollte abbilden, dass jetzt Spieler XY (Computer oder Mensch) dran ist, um eine lose Kopplung zu gewährleisten.
* Die KI muss die Besetzung aller Felder mit den Steinen beider Spieler abrufen können. Sie muss außerdem ihre eigenen Steine setzen und bewegen können sowie die Steine des Gegners schlagen können. Wenn die KI einen Zug durchführen möchte, dann sollte dies mit dem entsprechenden Aufruf bei der Logik-API erfolgen. Sie sollte außerdem auf eine mögliche Exception vorbereitet sein (auch eine KI kann Fehler machen). Während der menschliche Gegner an der Reihe ist, könnte die KI schon die neue Spielsituation abrufen. Ich glaube aber, dass es für den Anfang reicht, wenn die Berechnungen erst nach dem neuen Spielzug des menschlichen Gegners gemacht werden und dementsprechend erst dann die neue Feldbelegung durch die KI abgerufen wird. Die KI "weiß", wann sie wieder an der Reihe ist, indem sie auf das oben genannte Signal der Logik lauscht.
___________________________________________________________________________________________________________________
Das wären so meine Einfälle, die sicherlich noch detailliert ausgearbeitet werden müssten. Wichtig ist auch (adressiert an die Interessenten): Seid ihr eher für Dame oder für Mühle? Ich persönlich tendiere zu Mühle, hätte aber auch kein Problem damit, wenn sich die Mehrheit für Dame entscheidet. Hierzu habe ich eine Umfrage erstellt, die 7 Tage laufen wird.
PS: Natürlich sind schon jetzt Kritik und Verbesserungsvorschläge (am besten hier im Thread) gern gesehen...
