i

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:

Spiel Vier Gewinnt mit eingezeichneten Diagonalen[1]

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

Suche

v
7.2.5.3.5
inf-schule.de/oop/python/viergewinnt/implementierung/ruleset
inf-schule.de/7.2.5.3.5
inf-schule.de/@/page/YDCLoiiroQJROSZT

Rückmeldung geben