Einleitung
,,Vier-Gewinnt`` soll nach den Regeln der objektorientierten Programmierung implementiert werden. Grundlegendes Konzept dabei ist die Verbindung von Daten und den auf ihnen anzuwendenden Aktionen. Deshalb wurde für die vorliegende Implementation eine Klasse Brett gewählt, welche einerseits die Daten des Spielbretts enthält und andererseits Methoden zu deren Manipulation (z.B. Setzen und Löschen von Steinen, Bewertungsfunktion, Strategie etc.). Da die Strategie letztlich auch nur Steine innerhalb des Spielbretts verändert, ist sie ebenfalls in der Klasse Brett angesiedelt.
Datenstruktur für einen Zug
Um einen Zug zu speichern oder zu übergeben, wird die folgende Datenstruktur benutzt:
struct Zug
{
int x;
int y;
Farbe spieler;
Status status;
};
Dabei kommt den Komponenten im einzelnen folgende Bedeutung zu:
x:
Die x-Koordinate der gesetzten oder zu setzenden Kugel im 67 Raster.
y:
Die y-Koordinate der gesetzten oder zu setzenden Kugel im 67 Raster.
spieler:
Enthält einen Wert aus dem enum-Typ Farbe, der wie folgt definiert ist: enum Farbe {keine, Spieler1, Spieler2}; Dieser Wert bezeichnet welche Kugel an der angegebenen Position zu setzen ist.
status:
Enthält einen Wert aus dem enum-Typ Status, der wie folgt definiert ist: enum Status {ZugLegal, ZugIllegal}; Dieser Wert bezeichnet ob ein Zug an die angegebene Position zugelassen ist oder nicht.
Die Klasse Brett
Die Klasse Brett enthält als Daten das Brett und einige weitere interne (private) Variablen. Desweiteren enthält sie die Funktionen zur Manipulation des Bretts und die Strategie, die anhand der Daten des Bretts einen Gegenzug berechnet.
Die Klasse Brett hat den folgenden Aufbau:
class Brett
{
private:
Zug last;
int counter;
Ergebnis Zustand;
Strategie str;
public:
int brett[6][7];
Brett( Strategie strategie ) {}
void take_back() {}
Zug put(int x, Farbe f) {}
int detect( Zug zg ) {}
Ergebnis check_result() {}
void strat(Farbe f) {}
};
Den einzelnen Daten und Funktionen kommt dabei die folgende Bedeutung zu:
Zug last; (private):
Diese Hilfsvariable vom Typ Zug speichert den letzten Zug, der im Brett gesetzt wurde. Mit ihrer Hilfe kann nach einen vorausschauenden Zug der ursprüngliche Zustand des Bretts wieder hergestellt werden.
int counter; (private):
In dieser Hilfsvariablen wird gespeichert wieviele Kugeln sich aktuell im Spielbrett befinden.
Ergebnis Zustand; (private):
Diese Hilfsvariable vom enum-Typ Ergebnis speichert den aktuellen Zustand (gewonnen / remis / verloren) welcher sich aus der aktuellen Belegung des Bretts ergibt. Der enum-Typ Ergebnis ist dabei wie folgt definiert: enum Ergebnis {Sieg1, Sieg2, Remis}; Dabei steht Sieg1 für einen Sieg des menschlichen Spielers und Sieg2 für den Sieg der Computer-Strategie.
Strategie str; (private):
Diese Hilfsvariable vom enum-Typ Strategie speichert, welche Strategie aktuell eingestellt ist. Der enum-Typ Strategie ist dabei wie folgt definiert: enum Strategie {defensiv = -250, normal = 100, aggressiv = 350}; Die zugeordneten Zahlenwerte werden bei der Bewertung von Computerzügen addiert.
int brett[6][7]; (public):
Im Array brett wird das Spielbrett gespeichert.
Brett( Strategie strategie ){} (public):
Konstruktor für die Klasse Brett. Dem Konstruktor wird die Default-Strategie übergeben. Er initialisiert das Brett und andere interne Daten.
void take_back(){} (public):
Diese Funktion nimmt den letzten Zug zurück. War noch kein Zug getätigt, so passiert nichts.
Zug put(int x, Farbe f){} (public):
Diese Funktion versucht in der Spalte x, eine Kugel der Farbe f zu setzen. War dies erfolgreich, so wird im Rückgabezug neben der Spalte auch die y-Position, bei welcher die Kugel endete gespeichert. Desweiteren wird vermerkt, daß es sich um einen legalen Zug handelte und der Zähler für abgelegte Kugeln wird erhöht. Konnte die Kugel nicht mehr gesetzt, werden wird im zurückgegebenen Zug als x,y-Koordinate und illegal als Status vermerkt.
int detect( Zug zg ){} (public):
Diese Funktion testet von der im Zug übergebenen x,y Position aus in alle Richtungen, wieviele Steine der im Zug übergebenen Farbe bereits vorhanden sind. In Abhängigkeit von der Länge der gefundenen Reihen einer Farbe wird ein Zahlenwert ermittelt, welcher der Rückgabewert der Funktion ist. Besondere Konstellationen (3er, 4er) werden mit Bonuspunkten bewertet. Konnte aus irgendwelchen Gründen keine Bewertung vorgenommen werden, wird ein negativer Zahlenwert zurückgegeben.
Ergebnis check_result(){} (public):
Diese Funktion ermittelt den innerhalb der Strategie gespeicherten Zustand (gewonnen / verloren / remis) und liefert diesen als Rückgabewert.
void strat(Farbe f){} (public):
Diese Funktion ermittelt für die Farbe f (ausgehend von der aktuellen Brettposition und der eingestellten Strategie) einen möglichst optimalen Gegenzug und setzt diesen im Brett. Ändert sich dadurch der aktuelle Zustand, so wird dies in der privaten Variablen Zustand gespeichert.
|