Ruleset
Implementierung der Ruleset-Klasse
Die Klasse 'Ruleset' ist das Herzstück des Programms:
-
checkDraw(self,field,col)
muss überprüfen, ob ein Spielzug überhaupt gültig ist. Dies ist genau dann der Fall, wenn in der Spalte noch Plätze frei sind. -
checkGameOver(self,field)
muss überprüfen, ob überhaupt noch Felder frei sind, um weiterspielen zu können. -
checkPlayerWon(self,field,player,col)
muss überprüfen, ob der letzte Zug des Spielers zum Sieg führt.
Aufgabe 1
Implementiere die Methode checkDraw(self,field,col)
. Die Methode bekommt das Spielfeld und eine Spalte,
in die eingeworfen werden soll und entscheidet dann, ob der Spielzug möglich ist. Rückgabewert ist entweder
'True', wenn der Zug gültig ist und 'False', wenn nicht. Überlege dir, was genau überprüft werden muss.
Aufgabe 2
Implementiere nun die Methode checkGameOver(self,field)
. Die Methode bekommt das Spielfeld und überprüft,
ob es überhaupt noch leere Felder enthält. Auch hier soll entweder 'True' oder 'False' zurückgeliefert werden.
Implementierung der checkPlayerWon
-Methode
Die Methode checkPlayerWon
ist nicht so einfach zu realisieren. Es gibt außerdem viele Möglichkeiten,
zu überprüfen, wann ein Spieler gewonnen hat. Sobald ein Zug gespielt wurde, muss überprüft werden, ob ein
Viererblock an Spielsteinen mit der gerade gespielten Spielerfarbe sowohl horizontal, vertikal als auch diagonal existiert.
Aufgabe 3
Überlege dir informell einen Algorithmus, wie du einen solchen Viererblock suchen würdest. Schreibe diesen auf
(informell) und trenne nach horizontale (waagrechte), vertikale (hoch - und runter) und diagonale (unten
links nach oben rechts sowie oben links nach unten rechts) Viererblöcke.
Welche Vor- oder Nachteile hat dein Algorithmus?
Wir entscheiden uns hierbei für einen Algorithmus, der insbesondere bei größeren Spielfeldern ineffizient, allerdings verhältnismäßig einfach zu realisieren ist. Die Idee für die horizontale Suche sei hier formuliert:
Schau Dir die Zeile an, in der der gerade eingeworfene Stein liegt. Gehe die ganze Zeile durch und suche nach einem Viererblock
Aufgabe 4
Wie kann solch eine Suche in einer Zeile algorithmisch gelöst werden? Formuliere das Problem als Pseudo-Code.
Hier ist ein Vorschlag für die horizontale Suche. Beachte, dass zu Beginn das Feld und die eingeworfene Positionen (Row/Col) sowie die SpielerID einer neuen Variable zugewiesen werden, da sie nun öfters gebraucht werden und jedes Mal der Zugriff über das Objekt field umständlicher ist.
fields = field.getFields()
lastRow = field.getLastRow()
lastCol = field.getLastCol()
teamcolor = player.getID()
# check rows_________________________________________________________
counter = 0
#Check for 4 successive entries of teamcolor starting at row 0
#Reset counter whenever a different color is between
row_coord = lastRow
col_coord = 0
while (col_coord <=6):
if fields[row_coord][col_coord] == teamcolor:
counter = counter+1
if counter>=4:
print(str(player.getName())+ " hat gewonnen")
return True
else:
counter = 0
col_coord = col_coord+1
Aufgabe 5
Implementiere die vertikale Suche analog zu der horizontalen!
Die diagonale Suche muss wiederrum in zwei Teile geteilt werden: Diagonal von links nach rechts und diagonal von rechts nach links. Damit man genauso nach einem 4er-Block suchen kann wie bei der Horizontal/Vertikalsuche, muss man den Anfang der Diagonalen suchen, auf der sich der Stein befindet:
In Python:
# Find starting point at the lower left
row_coord = lastRow
col_coord = lastCol
while ((row_coord>0) and (col_coord>0)):
row_coord = row_coord-1
col_coord = col_coord-1
Hat man den Anfang der Diagonale gefunden, funktioniert die Suche analog zu den anderen Suchaspekten.
Aufgabe 6
Implementiere die vollständige diagonale Suche!
Hast du Probleme? Dann schaue dir die Datei RuleSet_CodeSnippet an und analysiere den Code, indem du die Kommentarfelder
ausschreibst.
Aufgabe 7
Überlege Dir, was passieren würde, wenn anstatt der Variablen row_coord und col_coord die Original-Koordinaten aus dem Field-Objekt nehmen würden! Schaue dir dazu alle Teile der checkPlayerWon-Methode an, die bisher implementiert wurden!
Quellen
- [1]: Spiel Vier Gewinnt - Urheber: SD BRI - Lizenz: inf-schule.de