Lernpfad:Einführung in Git/13
Implementiere mit einem Partner/einer Partnerin deiner Wahl das Spiel "Tic-Tac-Toe". Koordiniert euch dabei über ein gemeinsames Git-Repository.
(Einigt euch, wessen Repository aus dem letzten Schritt ihr benutzen wollt und fügt den anderen als Mitarbeiter mit Schreibrechten hinzu: Öffne das Repository in Gitea und dann „Einstellungen“ —> „Mitarbeiter“.)
Bearbeitet dazu zunächst die Aufgaben auf dieser Seite fertig.
Zum Abschluss der Wiederholung der objektorientierten Programmierung mit Java sollst du nun noch ein Mini-Projekt umsetzen: das Spiel "Tic-Tac-Toe".
Auf einem quadratischen, 3x3 Felder großen Spielfeld setzen die beiden Spieler abwechselnd ihr Zeichen (ein Spieler Kreuze, der andere Kreise) in ein freies Feld. Der Spieler, der als Erster drei Zeichen in eine Zeile, Spalte oder Diagonale setzen kann, gewinnt. Wenn allerdings beide Spieler optimal spielen, kann keiner gewinnen, und es kommt zu einem Unentschieden. Das heißt, alle neun Felder sind gefüllt, ohne dass ein Spieler die erforderlichen Zeichen in einer Reihe, Spalte oder Diagonalen setzen konnte.
→ Quelle: wikipedia:Tic-Tac-Toe
Im Programm sollen zwei Spieler im Wechsel ziehen können, bis einer gewonnen hat. Die Wahl des Spielfeldes erfolgt jeweils durch die Eingabe der Feldkoordinaten (siehe Abbildung) auf der Kommandozeile.
(0,2) | (1,2) | (2,2) |
(0,1) | (1,1) | (2,1) |
(0,0) | (1,0) | (2,0) |
Die Ausgabe des Spielfeldes kann als Text auf der Kommandozeile vorgenommen werden.
Objektorientierte Modellierung
Als ersten Schritt muss das Projekt modelliert - also geplant - werden. Dazu wird die Modellierungssprache UML verwendet. Folgendes Entwurfsklassendiagramm zeigt den Grundaufbau des Spiels. Du kannst das Modell beliebig verändern und ergänzen, wenn du möchtest.
Zur Erzeugung von UML-Diagrammen nutzen wir das Programm UMLet. Es erlaubt die Erzeugung (einfacher) UML-Diagramme aus Text-Definitionen. Wenn du UMLet öffnest, siehst du rechts eine Auswahl an UML-Elementen. Durch einen Doppelklick wird es in den Editor links übernommen. Dann siehst du unten ("Properties") die Text-Definition dieses Elements. Dort kannst du Änderungen vornehmen.
Die beiden Klassen oben haben etwa diese Definitionen:
*TicTacToe* -- spielfeld: Zahl[][] -- spielErstellen spielStarten istSpielVorbei: Wahrheitswert
*Spieler* -- name: Text -- ziehen
- Erstelle ein neues Entwurfsklassendiagramm in UMLet und füge die Klassen oben in das Diagramm ein. Modifiziere dann (gemeinsam mit deinem Partner/deiner Partnerin) das Diagramm für euer Spiel. Überlegt euch, welche Klassen, Objektvariablen und Methoden ihr benötigt. Plant ggf. auch schon etwaige Erweiterungen (s.u.) mit ein.
- Speichert das Diagramm im Projektordner ab und committed es in das Repository.
- Transformiert das Entwurfsklassendiagramm in ein Implementierungsklassendiagramm.[2]
- Speichert auch dieses Diagramm im Projektordner ab und committed es in das Repository.
Umsetzungshinweise
- Für die Eingabe auf der Kommandozeile kann die Klasse Scanner benutzt werden.
- Nutze für die Ausgabe die Methoden print, println und printf von System.out.
printf
nimmt als ersten Parameter einen Formatierungsstring entgegen und dann so viele Werte, wie im Formatstring definiert werden. Ein Wert wird mit einem Prozentzeichen (%
) eingeleitet, gefolgt von einem Buchstaben, der den Typ definiert:- Text:
printf("%s", "String")
- Ganzzahl:
printf("%d", 5)
- Dezimalzahl:
printf("%f", 2.4)
- Mehrere Werte:
printf("Hallo %s! Es ist %d Uhr.", "Hansi", 10)
- Text:
- Zwischen
%
und Buchstabe können weitere Formatierungszeichen stehen. Zum Beispiel bedeutet eine Zahl, dass der Wert nach links mit Leerzeichen aufgefüllt werden soll, bis er so viele Zeichen hat:printf("|%4d|", 5) // Ergibt "| 5|"
- Zusätzlich können in jedem String folgende Steuerzeichen vorkommen:
\n
: Zeilenumbruch\t
: Tabulator
- Das Spielfeld besteht aus 3-mal-3 Feldern und kann als zweidimensionales Array gespeichert werden. Wählen einen geeigneten Datentyp für das Array.
- Hauptteil des Spiels ist die Prüfung, ob einer der Spieler gewonnen hat. Überlege dir, welche Endsituationen es im Spiel geben kann.
- Prüfe, ob die Eingaben der Spieler gültige Koordinaten sind und entscheide auch, wie du im Fehlerfall vorgehen möchtest.
- Versuche das Spiel für die Benutzer / Spieler möglichst komfortabel zu gestalten.
Hilfestellungen
Folgende Seiten helfen dir bei der Arbeit:
- Befehlsreferenz Java
- Lernpfad:Objektorientierte Programmierung mit Java
- Lernpfad:Würfelspiel in Java
- ↑ Informatik Band 2: Modellierung, Datenstrukturen und Algorithmen, 978-3-14-037122-3
- ↑ Siehe dazu im Buch Seite 30.
Erweiterungen des Spiels
Hier sind einige Ideen für optionale Erweiterungen des Spiels, falls du nach Umsetzung des Basisspiels noch Zeit hast:
- Implementiere einen Computerspieler.
- Implementiere eine grafische Benutzeroberfläche.
- Vergrößere das Spielfeld (oder mache es dreidimensional).
- Implementiere eine Variante von Upgraded Tic-Tac-Toe: