-
Aufgabe TicTacToe:
Es sei nochmals darauf hingewiesen, dass eine Lösungsidee und
mehrere (sinnvolle!!!!) Testfälle zur Abgabe der
Programme dazugehören (siehe auch allgemeine
Übungshinweise). Fehlen Testfälle, oder sind sie unvollständig,
so wird das Beispiel nicht gewertet. Fehlt die Lösungsidee, gibt es
Punkteabzüge.
-
Zur Lösungsidee: Was soll dort alles drinstehen?
Siehe allgemeine Übungshinweise
für einige Tips dazu.
-
Zu d): Es werden 3 Zusatzpunkte vergeben, wenn jemand den Player anstatt
einem als Attribut gespeicherten Typen, verschiedene Playertypen implementiert.
Statt:
class Player extends Basic {
int type;
...
boolean doMove (Field field) {
boolean res;
switch (type) {
case USER:
res = doUserMove (field); // Interaction with human player
break;
case RANDOM:
res = doRandomMove (field); // Make any legal move
break;
case COMPUTER_SIMPLE:
res = doComputerSimpleMove (field);
break;
default:
// Error
}
return res;
}
private boolean doUserMove (field) {
...
}
...
}
Ungefähr so:
class Player extends Basic {
// No attribute "type"
...
abstract boolean doMove (Field field);
}
class UserPlayer extends Player {
boolean doMove (Field field) {
... // Interaction with
human player
}
}
class RandomPlayer extends Player {
boolean doMove (Field field) {
... // Make any legal
move
}
}
class ComputerSimplePlayer extends RandomPlayer {
boolean doMove (Field field) {
if (opponent can
win)
prevent
loss
else
super.doMove (); // Do the same as RandomPlayer
}
}
In der Schnittstelle des Players kann durch diese Umstellung auch alles
entfallen, was mit dem "playerType" zu tun hat. Der Player-Type ist in
diesem Fall als Typ (d.h. Klasse) des konkreten Player-Objekts implizit
bekannt.
D.h. statt:
Player player1 = new Player(Player.USER, Field.PLAYER_X);
ungefähr so:
Player player1 = new UserPlayer(Field.PLAYER_X);
-
Achten Sie darauf, dass die Schnittstellen der Klassen (d.h. die nach aussen
sichtbaren Methoden und Variablen) so aussehen, wie am Angabeblatt angegeben.
Es ist zwar erlaubt Variablen und Methoden zu verwenden, diese müssen
aber private sein (d.h. nur innerhalb der Klasse zugreifbar).
-
Aufgabe a)
Die Klasse Field stellt das Spielfeld des Spiels dar. Implementieren
Sie die angegebenen Methoden und beachten Sie dabei die zugehörigen
Kommentare.
Die Methode checkMovePossible überprüft, ob der
angegebene Zug gemäß den Spielregeln zulässig ist. Ist
der Zug nicht gültig (anderer Spieler ist am Zug, Feld schon besetzt,
...) so wird eine entsprechende Fehlermeldung (entsprechende Konstante
verwenden!) zurückgegeben. Überlegen Sie sich, welche Informationen
Sie dafür in der Klasse Field brauchen => man erhält so die notwendigen
Objektvariablen.
Die Methode move benötigt diesselben Überprüfungen,
es empfiehlt sich einfach checkMovePossible dafür zu verwenden.
-
Aufgabe b)
Tip: Sie können (Wenn Sie beabsichtigen auch die Aufgabe d) zu
machen) in der Klasse Field eine Methode
char getNextPlayer(); // returns the player (PLAYER_X or PLAYER_O)
who has to make the next move
implementieren, damit erübrigt es sich in der Klasse TicTacToe
den aktuellen (bzw. nächsten) Spieler separat mitzuführen. Wenn
Sie dann die Aufgabe d) implementieren, ersetzen Sie einfach den Rückgabetyp
durch die den Typ Player.
-
Es sind einige Klassen inkl. Methoden und Konstantennamen vorgegeben. Falls
jemand sein Programm auf Deutsch schreiben möchte, so ist es zulaessig
diese Namen auf Deutsch zu übersetzen um alles einheitlich in Deutsch
schreiben zu können. Es ist ansonsten aber nicht erlaubt, die Schnittstelle
von vorgegebenen Methoden, Klassen, ... zu ändern (Parameterliste,
Konstanten, ...).
-
Zu den Packages:
Die Dateien "Field", "Player", ... befinden sich im Package "swe1.tictactoe".
Damit müssen sich diese Dateien auch im Unterverzeichnis "swe1/tictactoe"
befinden. Die Datei Basic.java ist jedoch in keinem Package angesiedelt,
weshalb sich diese Datei in keinem Unterverzeichnis befinden darf (Sofern
man die Klassen von Basic.java nicht schon im CLASSPATH mit angegeben hat).
Importieren der Klasse Basic durch "import Basic;" nach der Angabe
des Packages.
Achtung: Für dieses Beispiel ist es notwendig die neue Version
der Datei Basic.java zu verwenden!
Compiliert wird so: javac swe1/tictactoe/TicTacToe.java
Gestartet wird so: java swe1/tictactoe/TicTacToe
Verzeichnisstruktur:
-
MyPrograms
-
Basic.java
-
swe1
-
tictactoe
-
Field.java
-
TicTacToe.java
-
Player.java
-
Move.java (sofern vorhanden)
-
Für diese Übung ist es nicht notwendig ein eigenes Testprogramm
zu schreiben. TicTacToe.java hat bereits die Funktion eines Testprogramms,
da dort (während des Spiels) alle Methoden benutzt und entsprechende
Ausgaben gemacht werden sollten. Werden einige Methoden nicht gebraucht,
sollten diese Methoden trotzdem getestet werden (Ein zusätzliches
Testprogramm schreiben, oder ein paar zusätzliche Anweisungen in das
Programm einfügen).
Hat jemand vor nicht alles zu implementieren, so sind zumindest die
implementierten Methoden zu testen (Um einige Punkte zu bekommen ist es
nicht notwendig das Spiel auch tatsächlich spielen zu können,
Tests sind aber sehr wohl notwendig).