Spielprogrammierung mit Java
HomeAufgabenDruckenJava-Online

Aufgabe 6: Reversi Spiel (Othelo)


Programmieren Sie ein Reversi-Spiel.

Spielregeln:

Auf einem 8×8-Brett legen zwei Spieler abwechselnd weisse und schwarze Spielsteine. Zu Beginn des Spiels sind je zwei weisse und schwarze Steine in der Mitte des Spielbretts gelegt. Die Spielsteine können nur in leere Zellen gelegt werden, bei welchen mindestens eine der benachbarten Zellen oben, unten, links oder rechts bereits belegt ist.

nicht erlaubt

erlaubt

Stein umkehren

Wird ein Stein gelegt, so werden alle gegnerischen Steine, die sich in Reihen oder Diagonalen zwischen dem neuen und bereits gelegten Steinen der eigenen Farbe befinden, umgedreht. Das Ziel des Spiels ist es, am Ende möglichst viel eigene Steine auf dem Brett zu haben. Das Spiel ist fertig, wenn alle Zellen belegt sind.

Als Vorlage können Sie folgendes Beispiel verwenden:

Reversi_0.java im Online-Editor bearbeiten

Programmcode für lokale Bearbeitung downloaden (Reversi_0.zip)

 

Es empfiehlt sich das Spiel in folgenden Schritten zu entwickeln:

Schritt 1: Mit Mausklick Spielsteine in eine beliebige leere Zelle setzen

Dazu müssen Sie einen GGMouseListener implementieren und diesen mit
addMouseListener(this, GGMouse.lPress) zum GameGrid hinzufügen.
Testen Sie, ob die mit dem linken Mausklick gewählte Location leer ist, falls ja setzen Sie einen weissen Stein (show(0)).

 

Schritt 2: Überprüfen, ob mindestens eine der benachbarten Zellen links, rechts, oben oder unten mit einem Spielstein belegt ist

In der Dokumentation finden Sie in der Klasse Location die Methode
getNeighbourLocations(double distance).
Diese liefert alle benachbarten Locations in einem gegebenen Abstand. Wählt man distance = 0.5, so erhält man die direkt benachbarten Zellen. Mit einer for-Schleife kann man alle diese Zellen durchgehen und prüfen, ob sie besetzt sind:

 
Schritt 3: Abwechslungsweise weisse und schwarze Steine setzten
Deklarieren Sie ein Instanzvariable int imageID = 0 und ersetzen Sie stone.show(0) durch stone.show(imageID).
Damit nach jedem Mausklick die Steinfarbe ändert, müssen Sie in der Methode mouseEvent() z.Bsp. mit einer if-else-Struktur die imageID wechseln.

   

Schritt 4: Die eingeschlossenen Steine umkehren
Angenommen in der nebenstehender Skizze wird in der Zelle (5, 4) ein schwarzer Stein gesetzt. Ausgehend von dieser Position muss man alle 8 Richtungen durchgehen und die benachbarten Steine untersuchen. Wenn in der benachbarten Zelle ein fremder Stein liegt, geht man weiter, bis man eigenen Stein oder eine leere Zelle findet. Locations der eingeschlossenen Steine werden in einer ArrayList gespeichert.

In einer for-Schleife alle Richtungen durchgehen:
for (int c = 0; c <= 315; c += 45)
{
   ArrayList<Actor> actors = new ArrayList<Actor>();
   Location loc = location.getNeighbourLocation(c);
   Actor a = getOneActorAt(loc);
}
Einen Actor zur ArrayList hinzufügen:
actors.add(a);
Alle Steine in ArrayList umkehren:
for (Actor actor : actors)
   actor.show(imageID);

 

Help

Schritt 5: Überprüfen, ob Game over und Anzeigen der Ergebnisse

Die belegten Zellen kann man z.Bsp. mit der Methode getOccupiedLocations() erfassen. Diese gibt eine ArrayList zurück:
ArrayList<Location> all = getOccupiedLocations();

all.size() liefert die Anzahl Elemente in dieser ArrayList