Schreiben Sie eine Klasse Gomoku, die die Spiele Gomoku / Tic-Tac-Toe / 4 gewinnt / . . . modelliert:
Mehrere Spieler versuchen, auf einem rechteckigen Spielfeld von z x s Quadraten Spielsteine so abzulegen, dass n eigene Steine eine Reihe bilden – horizontal, vertikal oder diagonal. Wer dies zuerst schafft, hat gewonnen.
Ein Objekt beschreibt eine Partie eines solchen Spiels. Bei Konstruktion eines solchen Objekts sind
(in dieser Reihenfolge) anzugeben:
die Zahl z der Zeilen des Spielfelds
die Zahl s der Spalten des Spielfelds
die Zahl n der Länge einer Reihe, mit der man gewinnt
die Zahl p der Spieler
(Für die Argumente 3, 3, 3, 2 erhält man also eine Tic-Tac-Toe-Partie.)
Hinweise: Die Klasse enthält also als Instanzvariable ein zweidimensionales Feld von z x s intWerten. Als „Spielsteine“ werden die Werte 1,. . . ,p für den jeweiligen Spieler in die Einträge des Feldes geschrieben. 0 bedeutet, dass der Eintrag frei ist. n und p werden ebenfalls in Instanzvariablen gehalten. Eine weitere Instanzariable naechster enthält, welcher Spieler am Zug ist bzw. welcher Wert als nächster „Spielstein“ zu setzen ist.
Es können für das Objekt folgende Methoden aufgerufen werden:
naechster() liefert den nächsten Spieler (als positive ganze Zahl).
setze(int i, int j) setzt den Spielstein des Spielers, der gerade am Zug ist, auf das Quadrat i,j des Spielfeldes (je ab 0 indiziert). Wenn die Position bereits besetzt ist, wird eine Exception geworfen. Sonst wird kontrolliert und als Wahrheitswert zurückgegeben, ob der Spieler mit diesem Zug das Spiel gewonnen hat (s.u.). Der nächste Spieler ist danach am Zug.
istReihe(int i, int j) prüft, ob sich über die Position i,j hinweg eine Reihe der Länge n von gleichen „Steinen“ in horizontaler, vertikaler oder diagonaler Richtung erstreckt.
Hinweis: Vereinfachen Sie sich die Arbeit mit einer Hilfsmethode
int zaehle(int i, int j, int incI, int incJ)
die zählt, wieviele Feldeinträge gleichen Wertes ab der Position i,j in einer Reihe liegen – die
Reihe beginnt also an dieser Position. Die Parameter incI und incJ geben an, in welche Richtung
gesucht werden soll: Bei jedem Schritt wird der Wert für i um incI, der für j um incJ verändert.
Mögliche Werte sind 1, 0 und -1. Für die Suchrichtung diagonal nach „Nordosten“ ist incI also
als -1 und und incJ als 1 zu wählen.
toString() liefert das Spielfeld in zeilenweiser Darstellung als Zeichenkette, ersetzt dabei aber
Werte 0 durch '_'.
Beispiel aus einer Tic-Tac-Toe-Partie:
Aufgabe 5 [Programmierung]
Schreiben Sie eine Klasse Gomoku, die die Spiele Gomoku / Tic-Tac-Toe / 4 gewinnt / . . . modelliert: Mehrere Spieler versuchen, auf einem rechteckigen Spielfeld von z x s Quadraten Spielsteine so abzulegen, dass n eigene Steine eine Reihe bilden – horizontal, vertikal oder diagonal. Wer dies zuerst schafft, hat gewonnen.
Ein Objekt beschreibt eine Partie eines solchen Spiels. Bei Konstruktion eines solchen Objekts sind (in dieser Reihenfolge) anzugeben:
die Zahl z der Zeilen des Spielfelds
die Zahl s der Spalten des Spielfelds
die Zahl n der Länge einer Reihe, mit der man gewinnt
die Zahl p der Spieler
(Für die Argumente 3, 3, 3, 2 erhält man also eine Tic-Tac-Toe-Partie.)
Hinweise: Die Klasse enthält also als Instanzvariable ein zweidimensionales Feld von z x s intWerten. Als „Spielsteine“ werden die Werte 1,. . . ,p für den jeweiligen Spieler in die Einträge des Feldes geschrieben. 0 bedeutet, dass der Eintrag frei ist. n und p werden ebenfalls in Instanzvariablen gehalten. Eine weitere Instanzariable naechster enthält, welcher Spieler am Zug ist bzw. welcher Wert als nächster „Spielstein“ zu setzen ist.
Es können für das Objekt folgende Methoden aufgerufen werden:
naechster() liefert den nächsten Spieler (als positive ganze Zahl).
setze(int i, int j) setzt den Spielstein des Spielers, der gerade am Zug ist, auf das Quadrat i,j des Spielfeldes (je ab 0 indiziert). Wenn die Position bereits besetzt ist, wird eine Exception geworfen. Sonst wird kontrolliert und als Wahrheitswert zurückgegeben, ob der Spieler mit diesem Zug das Spiel gewonnen hat (s.u.). Der nächste Spieler ist danach am Zug.
istReihe(int i, int j) prüft, ob sich über die Position i,j hinweg eine Reihe der Länge n von gleichen „Steinen“ in horizontaler, vertikaler oder diagonaler Richtung erstreckt. Hinweis: Vereinfachen Sie sich die Arbeit mit einer Hilfsmethode
int zaehle(int i, int j, int incI, int incJ)
die zählt, wieviele Feldeinträge gleichen Wertes ab der Position i,j in einer Reihe liegen – die Reihe beginnt also an dieser Position. Die Parameter incI und incJ geben an, in welche Richtung gesucht werden soll: Bei jedem Schritt wird der Wert für i um incI, der für j um incJ verändert. Mögliche Werte sind 1, 0 und -1. Für die Suchrichtung diagonal nach „Nordosten“ ist incI also als -1 und und incJ als 1 zu wählen.toString() liefert das Spielfeld in zeilenweiser Darstellung als Zeichenkette, ersetzt dabei aber Werte 0 durch '_'. Beispiel aus einer Tic-Tac-Toe-Partie: