Wie ich auszog, ein Spiel zu programmieren (1)

Ich bin kein großer Programmierer, aber das Programmieren macht Spaß und ich brauchte einen Anlass zum Üben. Also wollte ich ein Spiel programmieren, etwa Schach oder Mensch ärgere dich nicht. Aber welches Mensch ärgere dich nicht? Es gibt so viele:

(von Startaq, CC-BY-SA)

(von Micha L. Rieser, CC-BY-SA)

(von Micha L. Rieser, CC-BY-SA)

(von Micha L. Rieser, CC-BY-SA)

Das war natürlich eine Fangfrage. Auch wenn diese Spiele verschieden ausschauen, man kann doch immer das gleiche Mensch ärgere dich nicht damit spielen. Und dieses immer gleiche Spiel ist es, das man programmieren will. Wie es aussieht, darum kümmern wir uns später. Programmiert wird erst einmal das unsichtbare, abstrakte Spiel, das den sichtbaren Formen zugrunde liegt.

(Für das Spielvergnügen ist die Oberfläche allerdings trotzdem wichtig, genau wie es bei Denksportaufgaben einen großen Unterschied macht, ob man sie in eine Krimihandlung packt oder anders verpuzzelt.)

Ich habe dann allerdings doch lieber ein anderes Spiel programmiert. Schach, mehr oder weniger. Das heißt, ich wollte mich da noch nicht festlegen – ich wollte ein Art framework, ein Programm, dass es mir erlauben würde, alle möglichen Spiele zu spielen, die man mit einem Schachbrett und Figuren dazu spielen kann. Schach, Dame, Go, Chinesisches Schach, oder auch erweiterte Versionen mit unterschiedlichem Gelände, wo die einzelnen Spielfelder unterschiedliche Funktionen haben. (Archon, anybody?)

Das abstrakte Grundgerüst:

  1. Es gibt ein Spielfeld, das aus einzelnen Feldern besteht. (Der Einfachkeit halber sind die Felder orthogonal, also schachbrettartig angelegt. Also erst mal keine hexagonalen Felder.)
  2. Das Spielbrett besteht in der Breite und Höhe aus beliebig vielen Feldern. Man kann also ein 8×8-Spiel machen für Schach, ein 10×10 für internationales Dame-Spiel, ein 6×100 für ein Pferderennspiel.
  3. Die Felder können verschiedene Typen haben. Zum Beispiel: schwarz oder weiß, aber auch Dschungel, Gebirge, Fluss.
  4. Es gibt Spielfiguren, die sich auf den Feldern bewegen können.
  5. Außerdem soll jede Spielfigur verschiedene Zustände annehmen können – gesund, ohnmächtig, verwundert, tot, wie das etwa bei Cry Havoc verwendet wurde.

(Erst später kam heraus, dass ich einige Sache übersehen hatte. Das ist aber immer so. Es sollte erstens auch noch Würfel geben, und vor allem hatte ich mir keine Gedanken darüber gemacht, ob mehr als eine Spielfigur auf einem Feld stehen darf oder nicht. Implizit gab es auch die Regel, dass eine Spielfigur nur auf höchstens einem Spielfeld stehen kann – also nicht etwa auf zwei nebeneinander liegenden, bei besonders großen Figuren.)

Zuerst erstellte ich mir für dieses Spiel ein Klassendiagramm:

(Die Klassen Feldtyp und Zustand sind dabei erst mal nebensächlich. Im Prinzip gebe ich in ihnen an einer Stelle zentral an, welche möglichen Werte es für diese beiden Eigenschaften im jeweiligen Spiel gibt.)

Damit hatte ich also das Spielmaterial modelliert. Jede Spielfigur kennt ihre Position auf dem Spielbrett, das Spielbrett verwaltet die Figuren und die Felder. Damit sich an dem Spiel überhaupt etwas verändern kann, braucht es noch Methoden, um die Eigenschaften der Modell-Elemente verändern zu können. (Das Modell soll ja insgesamt verschiedene Zustände annehmen können, mal mit vielen Figuren auf dem Brett, mal mit wenig, in Ausgangsposition oder im Endspiel.)

Gewünscht hatte ich mir am Anfang:

  • Eine Spielfigur muss man auf eine bestimmte Position auf dem Spielbrett verschieben oder auch ganz davon entfernen können
  • Man muss den Typ eines Feldes ändern können (schwarz, weiß, Dschungel, Fluss).
  • Man muss den Zustand einer Figur ändern können (gesund, ohnmächtig, verwundet).
  • Man muss die Position einer Figur ändern können (also auf welchen Koordinaten).

Das reicht eigentlich fürs Spielmaterial. Mein erster Entwurf für Model war fertig:

Damit man kann schon Spielfiguren erzeugen, platzieren und bewegen. Viel mehr Spielmaterial braucht man nicht.

Aber natürlich sieht man von alledem noch nichts. Das ist ja immer noch das abstrakte Spiel. Und Regeln fehlen ja auch noch. Gemach.

Da solche Aufgaben wie meine, also die mit dem Spiel, beim Programmieren sehr oft vorkommen, gibt es natürlich schon bewährte Ansätze, wie man diese Aufgaben löst. Dazu gehören sogenannte Entwurfsmuster (design patterns). Die haben coole Namen wie „Adapter“, „Fabrik“, „Fliegengewicht“, „Chain of Responsibility“, „Besucher“ oder Fliegengewicht“. Kunststück, viele bekannten stammen aus einem Buch, deren Autoren als „Gang of Four“ bezeichnet werden. „GoF“ ist quasi Fachsprache beim Programmieren.

Und ein solches Entwurfsmuster, das explizit im Lehrplan für die 11. Klasse steht, heißt Model-View-Controller. Damit geht es dann im nächsten Teil weiter.

Tagged: Tags

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.