Fortgeschrittene objektorientierte Programmierung
LVA 185.211, VL 2.0, 2010 S
1. Übungsaufgabe
Entwickeln Sie in einer stark typisierten objektorientierten Sprache Ihrer Wahl (z.B. C++, Java oder C#) ein Schlangenspiel (ähnlich dem bekannten Spiel Snake, aber mit mehreren Schlangen, mehreren Spielern und auf mehrere Computer verteilt) entsprechend folgender Beschreibung:
Ein Spiel wird von einem Spieler auf einem Rechner gestartet, wobei ein Fenster mit MxN annähernd quadratischen Feldern (M und N beim Aufruf festlegbar) am Bildschirm erscheint.
Auf einem zufällig gewählten Feld befindet sich der Kopf der Schlange des Spielers mit zufällig gewählter Farbe (rot, grün oder blau).
Zu Beginn besteht jede Schlange nur aus einem Kopf, der ein Feld belegt.
Der Kopf bewegt sich nur dann in ein benachbartes Feld, wenn der Spieler eine Taste drückt, welche die Bewegungsrichtung bestimmt.
Jedes weitere Feld der Schlange folgt dem vorangegangenen Feld derselben Schlange.
Tastendrücke werden ignoriert, wenn sie den Schlangenkopf in Richtung des zweiten Feldes der Schlange bewegen würden; für weitere Felder der Schlange gilt das nicht.
In unregelmäßigen Abständen entstehen auf freien Feldern weitere zufällig gefärbte Schlangenköpfe, die sich selbständig bewegen und vom Computer nach einem Zufallsmuster gesteuert werden.
Diese dienen als Futter, können aber auch feindlich sein.
Auf Feldern, die direkt an ein Feld mit einem Schlangenkopf angrenzen, darf aber kein neuer Schlangenkopf entstehen.
Wenn ein Schlangenkopf sich auf ein Feld bewegt, auf dem sich bereits ein Feld einer Schlange befindet, passiert Folgendes:
- Rote Schlangen (= Schlangenköpfe) fressen blaue Felder.
- Rote Schlangen, die über grüne Felder kriechen, werden grün.
- Blaue Schlangen fressen grüne Felder.
- Blaue Schlangen, die über rote Felder kriechen, werden rot.
- Grüne Schlangen fressen rote Felder.
- Grüne Schlangen, die über blaue Felder kriechen, werden blau.
- Gleichfarbige Felder sind giftig.
Das bedeutet im Einzelnen:
- Wenn Schlange A ein Feld, das zur Schlange B gehört, frisst, dann wächst Schlange A um ein Feld, und das gefressene Feld verschwindet.
Falls dabei Schlange B in zwei Teile geteilt wird, bewegt sich nur mehr der vordere Teil von Schlange B (der Teil mit dem Kopf) weiter, der hintere Teil bleibt liegen, bis er gefressen wird.
Falls der Schlangenkopf selbst gefressen wird, ist Schlange B tot, und der hintere Teil bleibt liegen.
Teilweise umgefärbte Schlangen können auch eigene Felder fressen (siehe unten).
- Der Kopf einer Schlange darf nie ein Feld betreten, das dieselbe Farbe hat.
Der Versuch, die Schlange auf ein gleichfarbiges Feld zu bewegen, bewirkt eine Verkürzung der Schlange um das hinterste Feld, und der vordere Teil der Schlange bleibt unverändert.
Wir sagen, die Schlange vergiftet sich.
Falls die Schlange nur aus dem Kopf besteht, stirbt sie bei einer Vergiftung und verschwindet.
- Wenn Schlange A über ein Feld kriecht, das zur Schlange B gehört, und sich dabei umfärbt, dann bekommt der Teil von Schlange A, der über Schlange B liegt oder Schlange B bereits passiert hat, dieselbe Farbe wie das Feld von B.
Schlange A wird also schrittweise, Stück für Stück umgefärbt.
Der Umfärbeprozess geht auch dann weiter, wenn Schlange B das Feld, das diesen Prozess ausgelöst hat, bereits verlassen hat.
Abgesehen von der Umfärbung bleiben die Schlangen A und B unverändert.
Falls der bereits umgefärbte Kopf von Schlange A sich in einem weiteren Schritt wieder in ein Feld bewegt, das zur Schlange B gehört, dann kommt es zu einer Vergiftung.
- Während des Umfärbens gibt es ein Feld, das zu zwei (oder mehr) Schlangen gehört.
Falls dieses Feld von einer weiteren Schlange gefressen wird, sind davon alle Schlangen, zu denen das Feld gehört, betroffen und alle restlichen Schlangenteile bleiben liegen (bis sie gefressen werden).
Weitere Spieler können sich jederzeit (remote) mit dem Spiel verbinden und bekommen ein gleiches Fenster wie der erste Spieler.
Dabei entstehen auf zufällig gewählten freien Feldern (aber nicht in unmittelbarer Nachbarschaft zu bereits existierenden Schlangenköpfen) neue zufällig gefärbte Schlangenköpfe, die von den neuen Spielern gesteuert werden.
Die Eigenschaften des Fensterrandes ändern sich während des Spiels periodisch:
- Im Stop-Modus sind Bewegungen über den Fensterrand hinaus nicht möglich, und entsprechende Tastendrücke werden ignoriert.
- Im Gift-Modus hat der Versuch einer Bewegung über den Fensterrand hinaus denselben Effekt wie eine Vergiftung:
Die Schlange wird verkürzt.
- Im Wrap-Modus bewegen sich Schlangen, die das Fenster an einem Rand verlassen, am gegenüberliegenden Rand wieder in das Fenster hinein.
Der aktuelle Modus muss irgendwie angezeigt werden, und vor kurz bevorstehenden Änderungen soll es eine akustische oder optische Warnung geben.
Alle vom Modus abhängigen Einschränkungen beziehen sich nur auf den Kopf der Schlange.
Wenn der Kopf einer Schlange im Wrap-Modus auf die gegenüberliegende Seite gesprungen ist, dann kann der Rest der Schlange in jedem Modus folgen.
Das Spiel endet, wenn kein neuer Schlangenkopf mehr erzeugt werden kann, wenn also alle verbliebenen freien Felder an Felder mit Schlangenköpfen angrenzen.
Gewinner ist der Spieler, der am Ende die längste Schlange hat.
Das kann auch der Computer sein.
Vor allem zur Fehlersuche ist es sinnvoll, wenn Spieler auf nur einem Rechner mehrere Fenster zum selben Spiel haben können und mehrere Schlangen über unterschiedliche Tasten bedienbar sind.
Änderungen der Aufgabenstellung mit dem Ziel, die Spielbarkeit oder grafische Darstellung zu verbessern, werden gerne akzeptiert.