Closed gustda closed 6 years ago
Anforderungsermittlung: Für die Gestellte Aufgabe ist es wichtig zu ermitteln, welche Anforderungen dafür Erfüllt werden müssen. In der ersten Iteration habe ich einige Anforderungen aufgenmommen. Diese waren aber noch nicht zuenede definiert oder sind nun nicht mehr ausreichend, weil sich die die Aufagbe geändert hat. Deshalb muss zuerst überprüft werden, was an Anforderungen notwenidg ist, was angepasst, verfeinert oder neu aufgenommen werden muss. Danach werden die Anforderungen Priorisiert und damit in eine Reihenfolge gebracht, die es ermöglicht diese Anforderungen zu erfüllen ohne in eine Abhängigkeit zu laufen, die dazu führt, dass die Anwendung nicht baut oder nicht ausführbar ist. Ich werde jede Anforderung einzeln synchronisieren (hoffentlich denke ich daran ;-) ).
Req. 2.1 reicht für die Aufgabe, die das Speilfeld erfüllen muss nicht mehr aus. Es müssen jetzt Spielfelder mit Spielsteinen angezeigt werden. -> Neues Req. 3.1 "Spielfeld mit Spielsteinen zeichnen" erstellt. Req. 2.3 "Meldungen an Spieler ausgeben" ist schlecht beschrieben. Es beschreibt zumbeispiel nicht konkret, was ausgegeben werden soll, was alles angezeigt wird. Ich werde diese Anforderung dahingehend interpretieren, dass sie die Grundsätzliche Anforderung darstellt, überhaupt etwas an den Spieler auszugeben. Was genau angezeigt wird, wird in weiteren Anforderungen Spezifiziert. dazu wird Req. 2.3 abgeändert (Namen angepasst, ein Abnahmekriterium hinzugefügt)
Priorität der Anforderungen
Kurzer Abriss zu dem, was jetzt wärend der Implementierung passiert ist. Teil der Aufgabe war ja, eine Begründung für den Lösungsweg zu geben.
Die Methode Run des GameControllers hat nun eine Schleife bekommen, da die Eingabe ja jetzt mehrfach wiederholt werden muss. Ich verwende do-while, weil ich mindestens einmal durch die Schleife muss, da der Anwender sonst nichts eingeben kann und damit auch das Spiel nicht beenden kann. Hier wird das Spielfeld gezeichnet und auch auf die Spielereingaben gewartet. Die Auswertung der Eingaben werden ebefalls im GameController in der Methode CheckAndProcessCommand durchgeführt. Das Ergbenis davon ist zum Einen, dass ein CommandState zurück gegeben wird, der zusammen mit dem aktuellen Spieler (actplayer) für die Ausgabe der Meldungen verwendet wird. Wenn bei der Eingabe ein Stein gesetzt wird, dann werden die Koordinaten an das Spielobjekt übergeben.
Das Spielobjekt verwaltet ein Dictionary, welches das Spielbret representiert. Hier werden Spielsteinstatus verwaltet, ein Tristate der sagt, welchem Spieler dieses Feld gehört oder ob es frei ist. Wenn Ein Feld frei war, wird dieses besetzt, danach wird überprüft, ob das Spiel beendet ist, dies findet auch in den Klasse Game statt.
Nachdem die Eingabe ausgewertet wurde, wird die Schleife im GameController erneut durchlaufen. Zuerst wird die Ausgabe gelöscht, danach die Ausgabe neu erzeugt. Dafür ist der ConsoleOutputController zuständig. Dies wird so gemacht, da auf diese Weise ein "Stehendes Bild" erzeugt wird.
Der ConsoleOutputController schreibt einerseits die Eingabeaufforderung mit Mitteilung an den Spieler und deligiert das Zeichnen des Spielfelds an die Klasse Gameboard. Dies ist extrahiert, weil das Spielfeld eher ein bisschen Grafik ist, das andere nur Text, müsste aber eigentlich nciht zwingend ausgelagert werden. Das Spielfeld Zeichnet also das Spielfeld und setzt dabei die Zeichen für die Spieler über einen Konverter (GetGameStone) ein. Dies mache ich aus zwei Gründen über einen Converter. 1. ich brauche das 9mal. 2. so kann ich sehrschnell die Zeichen ändern, wenn ich bspw. einmal eine anpassung vornehme, bei der die Spieler ihr Zeichen aussuchen können. Die Spielersymbole gehören aber relativ dicht ans Spielfeld, sonst hätte ich auch einfach eine nur die Zeichen und nicht die Spieler als Eigenschaften der Spielfelder übergeben können. Aus meiner Sicht gehören die Spielfelder aber einem Spieler und haben nciht ein X oder ein O das ist nur die Anzeige, deswegen der Konverter dort im Spielfeld.
Damit viel Spaß beim Durchgehen ;-) Ist jetzt doch aufwändiger geworden, mit der ganzen Schreiberei, aber ist ja Wochenende.
Aufgabe ist es das Spieler 1 seinen ersten Spielstein plazieren kann. -> Erweiterung, beide Spieler können ihre Steine setzten. Es erfolgt eine Überprüfung, ob das Feld frei ist. Die Aufgabe ist erledigt, wenn beide Spieler abwechselnd Spielsteine setzen können und das Spiel beendet ist, wenn alle Felder belegt sind. Ein Auswertung ob Gewinnkriterien erfüllt sind wird nicht durchgeführt.
Ich werde dieses Issue verwenden um den Lösungsweg zu beschreiben und ein paar Gedanken dazu zu äußern, warum ich welche Entscheidung getroffen habe. Vor allem aber um mich den Anforderungen, die zur Erfüllung dieses Ziels notwendig sind zu widmen.