[Übung] Ein Quiz in Java

Wir entwickeln eine kleine Konsolen-Anwendung in Java, in der der Spieler ein Quiz spielen kann. Dieses besteht aus Fragen mit Antwort-Möglichkeiten, die verschiedenen Kategorien zugeordnet sind.

Ausbildungsziel

Ziel der Übung ist das Erstellen einer objektorientierten Applikation.

Es sollen Klassendiagramme erstellt werden.

Der Code wird eng mit Tests zusammen erarbeitet.

Am Ende sollen die Teilnehmer eigenständig nach Vorgaben Programme dokumentieren, testen und erstellen können.

Voraussetzungen

  • Grundkenntnisse JAVA
  • Grundkenntnisse OOP
  • UML
  • Unit-Testing
  • PC oder Laptop mit Eclipse und jUnit

Dauer

2 – 3 Tage

Themen

  • JAVA
  • Objektorientierte Programmierung (OOP)
  • Unit-Testing
  • UML
  • Test-Driven Development (TDD)

Ablauf

Zunächst wird die Augabe durch den Trainer vorgestellt.

Anschliessend werden zusammen die Klassen mit ihren Eigenschaften und Methoden erarbeitet und an eine Metaplan-Wand gehängt.

Folgende Klassen sollten am Ende stehen:

Klasse Eigenschaften Methoden
Frage Frage: String

Antworten: String[]

richtigeAntwort: int

Konstruktor(frage: string, antworten: string[], richtigeAntwort: int)

printFrage(): string

antwortRichtig(antwort: int): bool

Kategorie  fragen: ArrayList<Frage>

name: String

Konstruktor(name: string)

FrageHinzufügen(frage: Frage): void

ZufallsFrage(): Frage

Spiel spielName: String

kategorien: Kategorie[]

punkte: int

siegPunkte: int

Konstruktor(spielName: String, kategorien: Kategorie[], siegPunkte: int)

GetFrage(kategorie: int): Frage

AddPunkt(): void

printStatus(): void

hatGewonnen(): boolean

printSieg(): void

Program static main(args: string[]): void

static setupSpiel(): Spiel

(Beachte: Getter und Setter tauchen hier der Einfachheit nicht auf, sollten genutzt werden, wo nötig)

Auf dieser Grundlage erstellen die Teilnehmer Klassendiagramme, die Anschließend vom Trainer geprüft und abgenommen werden.

Weiter geht es mit der Programmierung des Codes:

Die Teilnehmer erstellen die Klassen „Frage“, „Kategorie“ und „Spiel“ , dazu parallel die Unit-Tests. Der Trainer unterstützt wo nötig, Zusammenarbeit ist vorgesehen.

Wenn alle Tests erfolgreich durchlaufen und alle Methoden implementiert sind, wird ein Aktivitätsdiagramm für die Main-Methode erstellt, damit hier klar ist, wie der Ablauf stattfindet.

Diese soll dann auch programmiert und getestet werden.

Abschließend kontrolliert der Trainer die Ergebnisse und nimmt das Programm ab. Sollte noch Zeit vorhanden sein, können noch:

  • Mehr Fragen eingebaut werden
  • Die Fragen um einen Punkte-Wert ergänzt werden (Statt immer 1 Punkt)
  • Die Teilnehmer gegenseitig die Quizze der anderen Spieler lösen
  • Eine Highscore-Funktion eingebaut werden
  • Die Frage aus einer Datei gelesen werden

Musterlösung

Anklicken für Lösung

Klassendiagramme (plantUML)


@startuml

title Klassendiagramm

class Frage {
-fragestellung: String
-richtigeAntwort: int
-antworten: String[]
+Frage(fragestellung: String, antworten: String[], richtigeAntwort: int)
+PrintFrage(): String
+AntwortRichtig(antwortNummer: int): boolean
}

class Kategorie {
-name: String
-fragen: ArrayList<Frage>
+Kategorie(name: String)
+Zufallsfrage(): Frage
+FrageHinzufügen(frage: Frage): void
}

class Spiel {
-spielName: String
-kategorien: Kategorie[]
-punkte: int
-siegPunkte: int
+Spiel(spielName: String, siegPunkte: int, kategorien: Kategorie[])
+GetFrage(kategorie: int): Frage
+AddPunkt(): void
+PrintStatus(): String
+HatGewonnen(): boolean
+printSieg(): String
}

class Program {
+static main(args: String[]): void
+static setupSpiel(): Spiel
}

Program <– Spiel
Spiel <– Kategorie
Spiel — Frage
Kategorie <– Frage

@enduml

Übung Quiz: Klassendiagramme
Übung Quiz: Klassendiagramme

Aktivitätsdiagramm (plantUML)


@startuml

title Aktivitätsdiagramm

start
:Objekt Spiel erstellen;

repeat
:Ausgabe: Kategorie wählen;
:Eingabe: Kategorienummer;
:Frage holen und ausgeben;
:Antwort vom Nutzer vergleichen;
if(Antwort richtig?) then (ja)
:Punkt hinzufügen;
else (nein)
:Richtige Antwort ausgeben;
endif;
repeat while (Hat Gewonnen?) is (Nein)
:Siegmeldung ausgeben;
stop

@enduml

Übung Quiz: Aktivitätsdiagramm
Übung Quiz: Aktivitätsdiagramm

Code

Hier das ZIP-File mit dem Projekte für Eclipse.

Frage.java


package br.sua.ausbildung.quiz;

public class Frage {
private String fragestellung;
private String[] antworten;
private int richtigeAntwort;

public Frage(String fragestellung, String[] antworten, int richtigeAntwort) {
this.fragestellung = fragestellung;
this.antworten = antworten;
this.richtigeAntwort = richtigeAntwort;
}

public String PrintFrage() {
String ausgabe = „“;
ausgabe += this.fragestellung;
ausgabe += System.lineSeparator();
for(int i = 0; i < this.antworten.length; i++) {
ausgabe += „(“ + i + „)“ + this.antworten[i] + System.lineSeparator();
}
return ausgabe;
}
public boolean RichtigeAntwort(int antwort) {
if (this.richtigeAntwort == antwort) {
return true;
} else {
return false;
}
}
public String PrintRichtigeAntwort() {
return this.antworten[this.richtigeAntwort];
}
}

 

FrageTest.java


package br.sua.ausbildung.quiz;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class FrageTest {

Frage f;
@BeforeEach
void setUp() throws Exception {
f = new Frage(„1+1=?“, new String[] {„1″,“2″,“3″,“4“}, 1);
}

@Test
void testRichtigeAntwort() {
assertTrue(f.RichtigeAntwort(1));
assertFalse(f.RichtigeAntwort(2));
}

@Test
void testPrintRichtigeAntwort() {
assertEquals(„2“, f.PrintRichtigeAntwort());
}
}

Kategorie.java


package br.sua.ausbildung.quiz;

import java.util.ArrayList;

public class Kategorie {
private String name;
private ArrayList fragen;

public Kategorie(String name) {
this.name = name;
this.fragen = new ArrayList<>();
}

public String GetName() {
return this.name;
}

public int AnzahlFragen() {
return this.fragen.size();
}

public void FrageHinzufügen(Frage f) {
this.fragen.add(f);
}

public Frage ZufallsFrage() {
return this.fragen.get((int)(Math.random() * this.fragen.size()));
}
}

 

KategorieTest.java


package br.sua.ausbildung.quiz;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class KategorieTest {

Kategorie k;
Frage f1, f2;
@BeforeEach
void setUp() throws Exception {
f1 = new Frage(„1+1=?“, new String[] {„1″,“2″,“3″,“4“}, 1);
f2 = new Frage(„2+2=?“, new String[] {„1″,“2″,“3″,“4“}, 3);
k = new Kategorie(„Test“);
}

@Test
void testFrageHinzufügen() {
assertEquals(0,k.AnzahlFragen());
k.FrageHinzufügen(f1);
assertEquals(1,k.AnzahlFragen());
k.FrageHinzufügen(f2);
assertEquals(2,k.AnzahlFragen());
}

@Test
void testGestName() {
assertEquals(„Test“, k.GetName());
}

@Test
void testZufallsFrage() {
k.FrageHinzufügen(f1);
k.FrageHinzufügen(f2);
for (int i = 0; i < 10; i++) {
assertEquals(Frage.class, k.ZufallsFrage().getClass());
}

}

}

Spiel.java


package br.sua.ausbildung.quiz;

public class Spiel {

private String spielName;
private Kategorie[] kategorien;
private int punkte;
private int siegPunkte;

public Spiel(String spielName, Kategorie[] kategorien, int siegPunkte) {
this.spielName = spielName;
this.kategorien = kategorien;
this.siegPunkte = siegPunkte;
this.punkte = 0;
}

public int GetPunkte() {
return this.punkte;
}

public String PrintKategorien() {
String ausgabe = „“;
ausgabe += „Bitte Kategorie wählen:“;
ausgabe += System.lineSeparator();
for(int i = 0; i < this.kategorien.length; i++) {
ausgabe += „(“ + i + „)“ + this.kategorien[i].GetName() + System.lineSeparator();
}
return ausgabe;
}

public Frage GetFrage(int kategorie) {
return this.kategorien[kategorie].ZufallsFrage();
}

public void AddPunkt() {
this.punkte++;
}

public String PrintStatus() {
return „Der Spiele hat “ + this.punkte + “ Punkte, es fehlen noch “ + (this.siegPunkte – this.punkte) + “ Punkte zum Sieg“;
}

public boolean HatGewonnen() {
return this.punkte == this.siegPunkte;
}

public String printSieg() {
return „Herzlichen Glückwunsch zum Sieg!“;
}
}

SpielTest.java


package br.sua.ausbildung.quiz;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class SpielTest {

Spiel s;
Kategorie k1, k2;
Frage f1, f2, f3, f4;
@BeforeEach
void setUp() throws Exception {
f1 = new Frage(„1+1=?“, new String[] {„1″,“2″,“3″,“4“}, 1);
f2 = new Frage(„2+2=?“, new String[] {„1″,“2″,“3″,“4“}, 3);
k1 = new Kategorie(„Test“);
k1.FrageHinzufügen(f1);
k1.FrageHinzufügen(f2);
f3 = new Frage(„2+1=?“, new String[] {„1″,“2″,“3″,“4“}, 2);
f4 = new Frage(„3+2=?“, new String[] {„1″,“2″,“3″,“5“}, 3);
k2 = new Kategorie(„Test2“);
k2.FrageHinzufügen(f3);
k2.FrageHinzufügen(f3);
s = new Spiel(„TestSpiel“, new Kategorie[] {k1, k2}, 10);
}

@Test
void testGetFrage() {
for (int i = 0; i < 10; i++) {
assertEquals(Frage.class, s.GetFrage(0).getClass());
}
}

@Test
void testAddPunkt() {
assertEquals(0, s.GetPunkte());
s.AddPunkt();
assertEquals(1, s.GetPunkte());
}

@Test
void testPrintStatus() {
assertEquals(„Der Spiele hat 0 Punkte, es fehlen noch 10 Punkte zum Sieg“, s.PrintStatus());
s.AddPunkt();
assertEquals(„Der Spiele hat 1 Punkte, es fehlen noch 9 Punkte zum Sieg“, s.PrintStatus());
}

@Test
void testHatGewonnen() {
assertFalse(s.HatGewonnen());
for (int i = 0; i < 10; i++) {
s.AddPunkt();
}
assertTrue(s.HatGewonnen());
}

@Test
void testPrintSieg() {
assertEquals(„Herzlichen Glückwunsch zum Sieg!“, s.printSieg());
}

}

 

Program.java


package br.sua.ausbildung.quiz;

import java.util.Scanner;

public class Program {

public static void main(String[] args) {
Spiel meinSpiel = SetupSpiel();
Scanner scanner = new Scanner(System.in);

while(!meinSpiel.HatGewonnen()) {
System.out.println(meinSpiel.PrintKategorien());
int katWahl = Integer.parseInt(scanner.nextLine().trim());
Frage frage = meinSpiel.GetFrage(katWahl);
System.out.println(frage.PrintFrage());
int antwortWahl = Integer.parseInt(scanner.nextLine().trim());
if(frage.RichtigeAntwort(antwortWahl)) {
System.out.println(„Richtig!“);
meinSpiel.AddPunkt();
} else {
System.out.println(„Falsch… Richtige Antwort:“);
System.out.println(frage.PrintRichtigeAntwort());
}
System.out.println(meinSpiel.PrintStatus());
}
System.out.println(meinSpiel.printSieg());
}
public static Spiel SetupSpiel() {
Spiel s;
Kategorie k1, k2;
Frage f1, f2, f3, f4;
f1 = new Frage(„1+1=?“, new String[] {„1″,“2″,“3″,“4“}, 1);
f2 = new Frage(„2+2=?“, new String[] {„1″,“2″,“3″,“4“}, 3);
k1 = new Kategorie(„Test“);
k1.FrageHinzufügen(f1);
k1.FrageHinzufügen(f2);
f3 = new Frage(„2+1=?“, new String[] {„1″,“2″,“3″,“4“}, 2);
f4 = new Frage(„3+2=?“, new String[] {„1″,“2″,“3″,“5“}, 3);
k2 = new Kategorie(„Test2“);
k2.FrageHinzufügen(f3);
k2.FrageHinzufügen(f4);
s = new Spiel(„TestSpiel“, new Kategorie[] {k1, k2}, 10);
return s;
}
}

[collapse]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.