Team: Mattéo Sophys, Lara Cotti, Fabian Schenker, Matthias Gass, Max Knauber, Romain Bornex
- Einleitung
- Ziele
- Randbedingungen
- Build-Anleitung
- Kurze Bedienungsanleitung
- User Stories
- Releaseplan
- Dokumentation Sprint 1
- Taskliste der User Storys
- Anreicherung User Storys
- UML Package, Klassen- und Sequenzdiagramm
- Dokumentation wichtiger Code Snippets
- Herleitung der Testfälle aus den User Storys
- Dokumentation Sprint 2
- Taskliste der User Storys
- Anreicherung User Storys
- UML Package, Klassen- und Sequenzdiagramm
- Dokumentation wichtiger Code Snippets
- Herleitung der Testfälle aus den User Storys
- Fazit
Dieses Git-Repository wurde zur Dokumentation und Zusammenarbeit
der Gruppe LAMAFAMAROMA in den Studienfächern Software Engineering
und Informatik II erstellt.
Die Aufgabe war es, ein beliebiges Java Programm zu erstellen, das mit unseren Programmierungskenntnissen
umgesetzt werden kann.
Zudem soll mit JavaFX eine Benutzeroberfläche erstellt werden.
Als Gruppe haben wir uns entschieden, das Spiel Hangman umzusetzen.
Während des Projekts sollen wir lernen, wie wir die erworbenen Kompetenzen
aus den zwei Fächern Programmieren und Software Engineering zusammen
verknüpfen können.
Das Projekt soll in 2 Sprints umgesetzt werden
und über Jira koordiniert werden. Zusätzlich sollen die Rollen
Product Owner (PO) und Scrum Master (SM) von einem Gruppenmitglied übernommen
werden.
Das Programm soll in Java programmiert sein, wozu folgende Programme und Tools zur Verfügung stehen:
Java: JDK 16.0
Programmierumgebung: IntelliJ
Build-Automatisierung: Maven
Repository: Github
Der Aufwand des Projektes wird gleichmässig auf alle Studierenden verteilt.
git clone: https://github.com/fabianschenker/hangman.git
-
Im IntelliJ klicken Sie auf File -> New -> Project from Version Control.
-
Fügen Sie die Repo URL in das Feld ein und speichern Sie sie in C:\HANGMAN und klonen sie das Ganze.
-
Wählen Sie den neusten Release-Branch.
-
Stellen Sie sicher das im Terminal Java Version 16 aktiv ist.
-
Kontrollieren Sie dass Sie sich im Terminal auf C:\HANGMAN befinden.
-
Im Terminal, lassen Sie folgende Commands laufen:
mvn clean javafx:jlink cd target/hangman-spiel/bin ./java -m com.example.hangman1/com.example.hangman1.RunGame
- Erstellen Sie im C:\ einen Ordner mit dem Namen HANGMAN
- Laden Sie die Zip Datei aus dem Release Feld von Github herunter und entpacken Sie den Ordner in C:\HANGMAN
- Suchen Sie im Ordner C:\HANGMAN die Verknüpfung zum Launcher hm-launcher.bat und führen sie diese aus.
Das Ziel des Spiels Hangman ist es, mit möglichst wenig Versuchen ein unbekanntes Wort zu erraten.
Dabei wird zu Beginn nur die Anzahl Buchstaben angezeigt, aus denen das Wort besteht.
Nun kann man versuchen mit den 26 Buchstaben des Alphabets das Wort zu erraten.
Wenn man einen richtigen Buchstaben erraten hat, dann wird die Position im Wort mit dem Buchstaben ersetzt.
Wenn man nun aber einen falschen Buchstaben versucht, so wird ein Teil einer Hangman Figur gezeichnet.
Das Spiel ist gewonnen, wenn man das Wort errät, bevor die elf Elemente der Hangman Figur auf dem Bildschirm dargestellt werden.
Wenn die Hangman Figur zuvor fertiggestellt wird, ist das Spiel verloren.
User Story | Beschreibung | Akzeptanz Kriterien | Priorität | Story Points |
---|---|---|---|---|
03 | Als Kunde möchte ich eine Anzeige der Wortlänge haben. | Damit der Spieler von Beginn an das Wort abschätzen kann. | hoch | 4 |
04 | Als Kunde möchte ich Buchstaben eingeben können, um die richtigen Buchstaben zu erraten. | Damit der Spieler mit dem Buchstaben eine Unterlinie ersetzten kann. | hoch | 8 |
05 | Als Kunde möchte ich korrekte Buchstaben anstelle des Platzhalters angezeigt bekommen. | Damit der Spieler sehen kann an welchen Positionen sich dieser Buchstaben im Wort befindet. | hoch | 9 |
06 | Als Kunde möchte ich falsche Buchstaben aufgelistet bekommen. | Damit der Spieler sehen kann welche nicht richtigen er schon verwendet hat. | hoch | 10 |
07 | Als Kunde möchte ich meinen Fortschritt durch eine Hangman Figur angezeigt bekommen. | Damit man sieht wie viele Fehlversuche man schon hatte. | hoch | 8 |
08 | Als Kunde möchte ich eine Meldung bekommen, wenn ich das Spiel gewonnen/verloren habe. | Damit der Spieler den Endstatus des Spiels angezeigt bekommt. | mittel | 6 |
09 | Als Supporter möchte ich eine hinterlegte Wort-Datenbank die angepasst werden kann. | Damit der Bearbeiter seine Wörter im Spiel ändern kann. | mittel | 4 |
10 | Als User möchte ich eine Meldung bei doppelter/ungültiger Dateneingabe. | Um zu sehen dass das Zeichen nicht geht oder schon benutzt worden ist. | mittel | 5 |
11 | Als User möchte ich als Spielsprache DEUTSCH definieren. | Damit die Wortwahl in der Wortliste sicher eindeutig ist. | mittel | 2 |
12 | Als User möchte ich als Fehler-Anzahl für die Hangman Darstellung 11 definieren. Hügel, Pfahl, Pfahl, Querstrebe, Seil, Kopf, Körper, Arm, Arm, Bein, Bein | Damit klar ist wie viele Punkte dem Spieler noch fehlen. | mittel | 9 |
20 | Erstellen eines Maven Projekts mit einer HelloWorld Anwendung. | Um ein Grundgerüst für das Projekt zu erstellen | tief | 2 |
30 | Die verwendeten Buchstaben soll in einem Feld dargestellt werden. | Art der Umsetzung von US 06. | hoch | 8 |
31 | Die Hangman Grafik soll Schrittweise in 11 Elementen auf dem Bildschirm dargestellt werden. | Art der Umsetzung von US 07. | mittel | 6 |
32 | Die Darstellung der Buchstabenfelder soll durch ein Wort in Grossbuchstaben in einem Feld dargestellt werden | Art der Umsetzung von US 05. | hoch | 6 |
65 | Spaghetti Code Aufräumen | Kommentare, logische Struktur, Code vereinfachen. | mittel | 7 |
66 | Maven Test Projekt | Um Klassen und Methoden zu Testen | hoch | 8 |
67 | Klasse zur Eingabe von neuen Wörtern | Um die Wortdatenbank direkt aus dem Programm erweitern zu können | tief | 4 |
69 | UML | Um eine Übersicht über das Programm zu erhalten | tief | 8 |
77 | Build Projekt | Um über die Kommandozeile oder über vorgefertigte ZIP-Datei das Programm zu bilden, respektive zu entpacken und laufen zu lassen. | high | 8 |
- Die User Storys Nummerierung wurde zur Übersicht von der fortlaufenden Jira-Nummerierung übernommen.
Release 1 | Release 2 | Ausbaustufe 1 | Ausbaustufe 2 |
---|---|---|---|
US 03 | US 07 | US 67 | Datenbank |
US 04 | US 08 | Icon | Advanced Interfaces |
US 05 | US 12 | - | Animations |
US 06 | US 30 | ||
US 09 | US 31 | ||
US 10 | US 32 | ||
US 11 | US 65 | ||
US 20 | US 66 | ||
- | US 69 | ||
- | US 77 |
US = User Storys
Zu Beginn des ersten Sprints hatten wir unser erstes Scrum-Meeting. Dabei ordneten wir unseren User Storys StoryPoints und Prioritäten zu.
Danach teilten wir die User Storys jeweils einem Teammitglied zu, welches die Hauptverantwortung für diese Story trug.
Jede Story hatte 1-5 Tasks, die benötigt wurden, um die Story zu vervollständigen.
Wir kommunizierten untereinander welche Tasks eng miteinander zusammenarbeiteten und wer wen dadurch, falls nötig, unterstützen konnte.
Jeder der Teilnehmer konnte seine Aufgaben pünktlich erfüllen und teilweise konnten wir bereits in SceneBuilder Anwendungen vorgreifen.
User Story | Tasks | Geschätzter Aufwand in Minuten |
---|---|---|
US 03 | Klasse Wort erstellen zum auslesen der Datenbank | 210 |
US 04 | Scanner erstellen, Klein in Grossbuchstaben, Nur erster Buchstabe in Char Einlesen | 120 |
US 05 | Kontrolle Buchstabe korrekt, Eingabe Buchstabe in unbekanntes Wort | 180 |
US 06 | Kontrolle Buchstabe falsch, Eingabe Buchstabe in Vektor "Falsch" | 150 |
US 09 | .txt file erstellen, zufälliges Auslesen eines Wortes | 150 |
US 10 | Vergleich zu Wort/Falsch, Kontrolle Gültig/Ungültig, Ausgabe Fehler | 60 |
US 11 | User Sprache Deutsch | 30 |
US 20 | Erstellen Maven Projekt zur Vorbereitung | 60 |
Erstellen Eingabe für Wort:
Das Eingabefeld und der Enter Button der funktioniert. Auch das Wort wird schon mit Underlines angezeigt.
Spiel gewonnen:
Die Darstellungen für "gewonnen" werden beim richtigen Wort angezeigt.
Wurde zu diesem Zeitpunkt noch nicht behandelt. Siehe Dokumentation Sprint 2 für die Dokumentation von Package und Diagrammen.
Überprüfung, ob der eingegebene Buchstabe bereits vorhanden ist
static void doppelt(){
for (int i = 0; i < richtig.length(); i++) {
if (richtig.charAt(i) == Controller.ein) {
counter--;
}
}
}
Überprüfen der Eingabe auf Sonderzeichen
Pattern p = Pattern.compile("[^a-z]", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(eingabe);
boolean b = m.find();
Wurde zu diesem Zeitpunkt noch nicht behandelt. Siehe Dokumentation Sprint 2 für die Dokumentation der Testfälle.
Auch den Sprint 2 konnten wir mit einem erfolgreichen SCRUM Meeting starten, bei dem wir neben den aufgeteilten UserStorys noch weitere hinzufügen konnten.
Das Vergeben von Punkten und Aufgaben lief analog zum ersten Sprint.
Wir konnten auch in diesem Sprint unsere Ziele pünktlich erreichen.
Die Aufwandseinschätzung war zwar in diesem Sprint nicht mehr ganz so präzise, jedoch war die Gesamtzeit ungefähr die gleiche, was dies ausglich.
Zudem hatten wir noch genug Zeit zur Verfügung um die Ausbaustufe 1 umzusetzen.
User Story | Tasks | Geschätzter Aufwand in Minuten |
---|---|---|
US 07 | Fehlerzählung und Abfrage Fortschritt | 90 |
US 08 | SceneBuilder gewonnen/verloren kreieren, Abfrage gewonnen/verloren | 90 |
US 12 | Hangman Figur in SceneBuilder kreieren | 60 |
US 30 | SceneBuilder Auflistung verlorene Buchstaben, Abfrage verwendete Buchstaben | 120 |
US 31 | Anzeigebedingungen für Hangman Figur kreieren | 90 |
US 32 | Textfeld und Ausgabe für Wort | 90 |
US 65 | Aufräumen und Kürzen von längeren Code-Zeilen | 120 |
US 66 | Erstellen von Tests für Programm | 210 |
US 69 | Generieren von UML - Diagrammen der Programmstruktur | 90 |
US 77 | Build Projekt | 240 |
Startbildschirm:
Der Startbildschirm wurde erstellt, um ein neues Wort direkt zu Beginn in die Wortliste einzufügen.
Worteingabe:
Das Feld zur Worteingabe mit Anzeige der Eingabebedingungen.
Aktion wenn Enter gedrückt wird
public void readEingabe() {
if (counter < 11 && startProgramm && !fertig) {
String e = meineEingabe.getText().toUpperCase();
aufraeumen();
if(e.equals(String.valueOf(random))){
GameEngine.counter = richtig.length();
victory();
erratenesWort.setText(String.valueOf(random));
meineEingabe.clear();
}else if(e.length()==1){
ein = e.charAt(0);
eingabeKontrollieren();
erratenesWort.setText(GameEngine.richtig);
falscheBuchstaben.setText(GameEngine.falsch);
progresImage();
victory();
}else{
makeVisibleL(ungueltigeEingabe);
meineEingabe.clear();
}
}
}
Fortschritt der Hangman Figur
if (!falsch.contains(Character.toString(input))) {
Controller.counter++;
falseLetters.add(input);
falsch = ScreenOutput.buildFalse(falseLetters);
}
Um die Klasse test() zu testen, erzeugen wir ein randomWort um die Benutzereingabe zu simulieren
und lassen uns durch die entsprechende Funktion die Underlines anzeigen.
Wir lassen die Klasse Test() mit den vorherigen Parametern laufen und lassen uns die Positionen der A's darstellen
Durch AssertTrue sehen wir, ob die GameEngine.test() gut gelaufen ist.
Die Benutzung von assertAll() sorgt dafür, dass alle Funktionen durchlaufen werden und keine ausgelassen werden kann
void test1() {
Controller.random = "JAVATESTENISTSCHWER".toCharArray();
Controller.underlines = Wort.buildUnderlines(Controller.random);
Controller.ein = 'A';
GameEngine.test();
assertAll(
()-> assertEquals(GameEngine.richtig,"_A_A_______________","GameEngine.richtig nicht korrekt"),
()-> assertTrue(GameEngine.visible[1],"Erstes A nicht erkannt"),
()-> assertTrue(GameEngine.visible[3],"Zweites A nicht erkannt")
);
}
Um die Klasse Vergleich zu testen, erstellen wir ein testword, dieses verpacken wir in einen char, suchen uns einen Buchstaben aus und notieren seine Position im Wort.
Den zu erratenden Buchstaben speichern wir in einem Vektor.
Über assertEquals testen wir die richtige Grösse des Testvektors und ob die Positionen des zu testenden Buchstabens richtig erfasst wurden.
void position() {
char[] testchar = "HUNDSGEMEIN".toCharArray();
Vector<Integer> testvector = Vergleich.position(testchar, 'E');
Assertions.assertAll(
() -> assertEquals(testvector.size(), 2, "Anzahl richtige Buchstaben stimmt nicht"),
//Integers in the vector "position" should be 6 and 8 =14
() -> assertEquals(testvector.get(0) + testvector.get(1), 14, "Position nicht richtig erfasst"));
}
Durch das Projekt Hangman haben wir sehr viel Neues gelernt und konnten das Gelernte auch gleich praktisch anwenden.
Als besondere Herausforderung hat sich Github mit der Administration der ganzen Merges herausgestellt.
Es erleichtert die Zusammenarbeit zwischen den einzelnen Aufgaben und das parallele Arbeiten an gleichen Themen,
jedoch hat es sich für uns Beginner als knifflige Aufgabe herausgestellt alles ohne Verluste zu mergen.
Des Weiteren waren es eher die kleinen Dinge, die am meisten Ehrgeiz in Anspruch nahmen wie z.B. das Einfügen des Logos für das Programm.
Als Reflexion haben wir auch ein paar Dinge, die wir bei einem nächsten Projekt anders machen würden. Zum einen wäre dies durchgehend klarere Variable-Bezeichnungen zu verwenden, die eindeutiger auf Ihre Funktion hinweisen. Auch die Mischung von englischen und deutschen Variablen-Bezeichnungen ist uns dabei noch aufgefallen. Zum Schluss wäre da noch die hohe Anzahl von Variablen und Methoden die public gesetzt sind.
Schlussendlich sind wir mit allen Aufgaben, die wir uns gestellt haben, fertig geworden und sind stolz unser fertiges Projekt präsentieren zu dürfen.
Projekt Hangman, Mechatronik Trinational, Promotion Franklin, Dez. 2021