Konzept für Quiz

LouCyphre

Bekanntes Mitglied
Hallo,

ich möchte mich in JavaFX einarbeiten und dazu ein Quiz mit GUI schreiben.

Da ich im letzten Thread den Tipp bekommen habe mich erstmal mit der Programmlogik zu beschäftigen bevor ich die GUI baue, will ich mit euch erstmal meinen Ansatz besprechen.

Also ich werde zwei Klassen brauchen : eine für die Fragen, eine für die Antworten.

Die Fragen würde ich in einer ArrayList speichern und dann später in ein Textfeld ausgeben und letztlich aus der Liste schmeißen, damit sie nicht zweimal kommen.

Die Antworten würde ich ebenfalls in einer Liste speichern, wobei die richtige Antwort immer an der ersten Stelle steht, dann zufällig gewürfelt wird und in die Buttons geschrieben wird, damit nicht immer A richtig ist.
Die Antwort Klasse sollte ebenfalls die gegebene Antwort mit der richtigen Antwort prüfen und dann den counter um 1 erhöhen.

Was ich noch nicht richtig konzipiert habe, ist wie ich die Antwortmöglichkeiten an die richtige Frage binde...

Was haltet ihr davon, hab ich was vergessen?
 

mihe7

Top Contributor
Also ich werde zwei Klassen brauchen : eine für die Fragen, eine für die Antworten.
Fragen und Antworten machen aber noch kein Quiz.

Die Fragen würde ich in einer ArrayList speichern und dann später in ein Textfeld ausgeben und letztlich aus der Liste schmeißen, damit sie nicht zweimal kommen.
Das sind Implementierungsdetails, die in diesem frühen Stadium noch keine Rolle spielen.

Konzentriere Dich erstmal auf den Kern des Spiels: wie läuft das Quiz ab? Welche Zustände werden dabei durchlaufen? Gibt es vielleicht einen Kandidaten, den man modellieren möchte? Oder gar mehrere? Einen Quizmaster? Gibt es eine Bewertung? Nach welchen Regeln erfolgt diese? Um nur mal ein paar Dinge zu nennen, die mir ad hoc einfallen würden.
 

kneitzel

Top Contributor
Die Antworten würde ich ebenfalls in einer Liste speichern, wobei die richtige Antwort immer an der ersten Stelle steht, dann zufällig gewürfelt wird und in die Buttons geschrieben wird, damit nicht immer A richtig ist.
Die Antwort Klasse sollte ebenfalls die gegebene Antwort mit der richtigen Antwort prüfen und dann den counter um 1 erhöhen.
Also Du musst Dich sauberer Ausdrücken. Vermutlich meinst Du, dass zu jeder Frage eine Liste mit Antworten gehört.

Also die Klasse Frage umfasst die Frage und die Antworten.

Bezüglich Verhalten: Was für einen Counter willst Du denn hochsetzen? Wo hat die Frage einen Counter? Das klingt jetzt so, dass Du unnötige Abhängigkeiten schaffst. So eine Spielkarte (Ist evtl. ein besserer Name als Frage) muss doch das Spiel nicht kennen. Zumal Du doch die Spiellogik jederzeit anpassen kannst. So ein Zähler wäre also etwas, das in der Spiellogik vorhanden wäre (wenn überhaupt). Und das ist aber dann etwas, das intern ist. Du willst doch die Spiellogik anpassen können ohne dann viele weitere Klassen anpassen zu müssen.

Also da immer aufpassen, wo etwas hin gehört.
 

LouCyphre

Bekanntes Mitglied
Konzentriere Dich erstmal auf den Kern des Spiels: wie läuft das Quiz ab? Welche Zustände werden dabei durchlaufen? Gibt es vielleicht einen Kandidaten, den man modellieren möchte? Oder gar mehrere? Einen Quizmaster? Gibt es eine Bewertung? Nach welchen Regeln erfolgt diese? Um nur mal ein paar Dinge zu nennen, die mir ad hoc einfallen würden.
Gut, das stimmt. Diese Punkte habe ich hier noch nicht mitgeteilt oder bedacht .

Also das Quiz soll so ablaufen. Es gibt eine stage mit einer Frage, dazu 4 Antwortmöglichkeiten. Es läuft ein Timer ab. Dann kommt die nächste Frage. Es gibt natürlich auch einen Spieler.

hier würde jetzt der Punkt von @kneitzel ansetzen bzgl. des Counters. Der Counter soll schlicht dazu dienen, die richtigen Antworten zu zählen.
Aber du hast vollkommen Recht, das sollte der Spieler übernehmen.

Also wäre ich bei zwei Klassen. Nehme ich kneitzels Vorschlag an und nenne die eine Spielkarte(Fragen, Antworten)
und Spieler(Name, zählen der Richtigen).

Der Quizmaster ist das Programm, also die Frage wird von der Spielkarte abgefragt und auch die richtige Antwort ermittelt. Und der Spieler zählt seine richtigen Anworten. Die einzige Aufgabe die für ihn (Quizmaster) sinnvoll wäre, ist die Ermittlung eines Gewinners. Das wiederrum ist nur bei mehren Spielern sinnvoll, sonst kann auch der Spieler selbst... gut das ist eigentlich Quatsch. Wenn es dann mal mehrere Spieler gibt, müsste ich die Klasse schreiben.

Also es wären dann drei Klassen : Spielkarte, Spieler und Quizmaster

Zumal Du doch die Spiellogik jederzeit anpassen kannst. So ein Zähler wäre also etwas, das in der Spiellogik vorhanden wäre (wenn überhaupt). Und das ist aber dann etwas, das intern ist. Du willst doch die Spiellogik anpassen können ohne dann viele weitere Klassen anpassen zu müssen.
Du sprichst ja hier so ein bisschen die Modularisierung an. wäre das nach dem oben genannten Konzept gegeben oder gibts hier noch Bedarf?
 

kneitzel

Top Contributor
Ja, das sieht schon deutlich besser aus. Quizmaster wäre die Spiellogik oder das Spiel. Der Spieler kann eine Wertung haben. Und die Spiellogik kann - wenn ein Spieler eine Frage richtig beantwortet hat, da den Zähler erhöhen.
Das sieht nach eine validen Lösung aus.

Wichtig ist halt, das man sich ein System ausdenkt von Objekten, die Sinnvoll miteinander agieren und dabei möglichst unabhängig voneinander sind.
 

LouCyphre

Bekanntes Mitglied
okay Super!

Wenn ich jetzt anfange die Klassen zu modellieren, habe ich direkt ein Problem mit der Spielkarte ( eigentlich zwei ).
Ich hätte jetzt stupide zwei ArrayLists angelegt eine für die Fragen, die andere für die Antworten.

Spielkarte:
import java.util.ArrayList;

public class Card {

    ArrayList<String> questions = new ArrayList<>();
    questions.add("...");

    ArrayList<String> answers = new ArrayList<>();
}

Soweit so schlecht. Das erste Problem ist technischer Natur und zwar nimmt IntelliJ die .add() Methode nicht an. Das wundert mich, weil ich im vorherigen Projekt das genauso verwendet habe. Weiß wer woran das liegt?

Das zweite Problem seht ihr vllt schon: Wie hänge ich die beiden sinnvoll zusammen? Ich hatte anfangs überlegt die Frage und die Antworten in einen Sting zu packen, wobei die richtige Antwort immer an einer bestimmten Stelle steht also " Frage, richtige Antwort, andere Möglichkeiten"
so dass ich letztlich für die Ermittlung der richtigen Antwort die explizite Stelle abfrage. Aber irgendwie erscheint mir das ... naja, nicht so schön und halt auch später blöd, weil ja die Frage ins Textfeld soll und die möglichen Antworten in Buttons.
 

kneitzel

Top Contributor
Das erste Problem ist technischer Natur und zwar nimmt IntelliJ die .add() Methode nicht an. Das wundert mich, weil ich im vorherigen Projekt das genauso verwendet habe. Weiß wer woran das liegt?
Du schreibst den Befehl direkt in der Klasse und nicht in der Methode!

Und das ist irgendwie unverständlich: Eine Karte hat mehrere Fragen? Ich dachte, eine Frage und mehrere Antworten, wobei die erste Antwort die Richtig ist? Das hattest Du doch geschrieben dachte ich.

Und ansonsten kannst Du auch Antwort als eine Klasse machen, die halt die eigentliche Antwort als auch ein Flag hat, ob die Antwort korrekt ist oder nicht.
 

LouCyphre

Bekanntes Mitglied
Du schreibst den Befehl direkt in der Klasse und nicht in der Methode!
ah ja 😓

Und das ist irgendwie unverständlich: Eine Karte hat mehrere Fragen?
Auf der Rückseite? Nee Spaß bei Seite. Klar, die Karte hat eine Frage und 4 Anworten. Aber würde das nicht auch bedeuten, dass zu jeder neuen Frage eine neue Instanz erstellt werden muss. Und wie füge ich dann die Fragen und antworten hinzu?

Java:
public class Card(String frage, ArrayList<String> antworten){
    
    //"..."
}

Das scheint mir jetzt gerade irgendwie unpraktisch, weil die Fragen auch eventuell Random kommen sollen etc.
Das hattest Du doch geschrieben dachte ich.
Hab ich. Aber eher als Frage ob das konzeptionell okay wäre oder besser geht.
 

kneitzel

Top Contributor
Also ich selbst würde die Antwort auch eher als eine Klasse sehen, d.h. mit Flag ob richtig/falsch.

Die Klasse Card kann dann über diverse Wege gefüllt werden:
- Methoden (Setter / add Methoden)
- Konstruktor

Den Default Konstruktor brauchst Du ggf. wenn Du Frameworks nutzen willst, die die Serialisierung übernehmen. (Dann hast Du die Fragen in einer Datei oder so.)

Erstes hat halt dann sowas wie setQuestion(String), addAnswer(String answer, boolean isCorrect) oder addAnswer(Answer answer)
Bei einem Konstruktor kannst Du z.B. varargs nutzen:
public Card(string question, Answer... answers)

Das einfach mal als kurz skizzierte Ideen.
 

Jw456

Top Contributor
Ich würde villeicht eine Klasse QuizFrage machen. In ihr ist dann die frage und die vier Antworten gespeichert.

Und in einer anderen Klasse in der eine Liste ist die die einzeln QuizFragen speichert.
 

LouCyphre

Bekanntes Mitglied
Also ich selbst würde die Antwort auch eher als eine Klasse sehen, d.h. mit Flag ob richtig/falsch.
Also das als bool , enum lohnt sich da nicht oder? hatte kurz noch drüber nachgedacht zu unterscheiden ob es neben true und false auch noch nicht beantwortet gibt. ist aber letztlich auch bloss false.

addAnswer(Answer answer)
hier sollte der bool dann einfach mit in der Klasse stecken, ja?

Ist eigentlich Flag mit boolean synonym, also was die Technik dahinter angeht?

Dann hast Du die Fragen in einer Datei oder so.)
Das klingt sehr gut. Kann das FX?
 

kneitzel

Top Contributor
Also wenn es nur zwei Werte sind, die gegensätzlich sind, dann würde ich da immer boolean nehmen. Dann heisst das Feld halt entsprechend istRichtig oder so. Und dann ist klar, was die Werte true/false bedeuten. Aber Du kannst da natürlich auch eine enum definieren. Ist auf jeden Fall eine valide Lösung.

Das klingt sehr gut. Kann das FX?
JavaFX sehe ich hier eigentlich weniger. Ich denke bei sowas an Libraries wie jackson oder gson.

Also gson ist relativ einfach zu handhaben - Einstiegspunkt wäre dann z.B. https://sites.google.com/site/gson/gson-user-guide - da reicht schon fast Object Examples:

Object Examples​

class BagOfPrimitives {
private int value1 = 1;
private String value2 = "abc";
private transient int value3 = 3;
BagOfPrimitives() {
// no-args constructor
}
}

(Serialization)
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);
==> json is {"value1":1,"value2":"abc"}

Note that you can not serialize objects with circular references since that will result in infinite recursion.

(Deserialization)
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
==> obj2 is just like obj
Das BagOfPrimitives wäre dann halt Deine Card oder List<Card> oder so. Und das schreibst Du dann wie unter Serialization beschrieben bzw. liest es wie unter Deserialization. Wenn Du dir die Dokumentation der Klasse Gson ansiehst, dann solltest Du auch finden, wie Du direkt in einer Datei/Stream oder aus einer Datei/Stream lesen kannst.
 

LouCyphre

Bekanntes Mitglied
Also ich hab jetzt mal was zusammen geschustert um die Frage aus ner .json auszulesen.

Das gleiche würde ich dann auch mit den Antworten machen.

muss mir nur dann erstmal den konkreten Aufbau von so einer .json anschauen, damit ich dann auch gezielt auslesen kann, weil jetzt ist ja noch völlig unklar was dann am Ende ausgelesen wird.

Ich weiß jetzt gerade nicht ob es funktioniert bzw. ob das so vom Aufbau her passt.

Reciht das so mit dem relativen Pfad? (Ich benutze IntelliJ)

Java:
public class Card {

    private final Gson gson = new Gson();
    private String question;
    private final File question_file = new File("Quiz//src//question.json");

    public void readQuestion() throws IOException {

        try{
            if(!question_file.exists()) question_file.createNewFile();

            question = gson.fromJson(new FileReader(question_file),String.class);

        }catch (FileNotFoundException e){
            e.printStackTrace();
        }

    }
}
 

kneitzel

Top Contributor
Generell gibt es aus meiner Sicht drei Fälle, die zu empfehlen sind:
a) Die Datei ist etwas, die der User bestimmen will. Also wird der User nach der Datei gefragt und dann die Datei, die der User angibt, geöffnet.
b) Die Datei geht den User nichts an und sie gehört fest zur Applikation und wird nicht verändert. Dann packt man diese gerne direkt in die Applikation als Ressource.
c) Die Datei geht den User normalerweise nichts an aber die Datei soll sich ändern können: Dann muss man einen Ort für die Datei finden. Unter Windows wird da in der Regel %APPDATA% verwendet, unix artige systeme packen es einfach ins user Home.

Für Deine ersten Tests wäre b) evtl. am einfachsten. Und das bedeutet, dass Du nicht so einen Pfad angibst sondern die Datei in die Ressourcen packst um dann mittels getClass().getResourceAsStream einen Stream zu bekommen, von dem gson dann die Daten lädt.
 

LouCyphre

Bekanntes Mitglied
b) Die Datei geht den User nichts an und sie gehört fest zur Applikation und wird nicht verändert. Dann packt man diese gerne direkt in die Applikation als Ressource.
Lustigerweise habe ich eigentlich genau das versucht. Also die .json ist bei mir im Projekt Quiz im src Ordner

das hab ich versucht damit auszudrücken, bzw. auch gehofft, dass das so passen würde.
private final File question_file = new File("Quiz//src//question.json");

Hab es erstmal jetzt so als Rohbau für das abfragen aus der .json

Java:
public class Card {

    private final File questions = new File("HOW?");
    private String question;
    List<String> listOfQuestions = new ArrayList<>();

    public void readQuestion() {
        try {
            JsonElement questionElement = JsonParser.parseReader(new FileReader(questions));
            JsonObject questionObject = questionElement.getAsJsonObject();

            JsonArray jsonArrayofQuestions = questionObject.get("").getAsJsonArray();

            for (JsonElement qElement : jsonArrayofQuestions){
                JsonObject qJsonObject = qElement.getAsJsonObject();

                question = qJsonObject.get("question").getAsString();

                listOfQuestions.add(question);
                System.out.println(listOfQuestions);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

ungetestet


fragen json:
{"questions":[
  {
    "Who is you're mommy?"
  },
  {
    "Are Batman and Joker from the same father?"
  }
 ]
}

Die Frage mit dem Pfad aus den App Ressourcen habe ich noch nicht beantwortet.
getClass().getResourceAsStream
Das versteh ich irgendwie nicht. Wieso .getClass() ?
 

mihe7

Top Contributor

LouCyphre

Bekanntes Mitglied
Okay danke, ich versuchs dann Mal.

Was ich bei#16 noch vergessen habe zu fragen: wie kann ich aus dem listOfQuestions array, einzelne Strings auslesen? Brauche ich dazu einen Iterator?
 

mihe7

Top Contributor
Aber, weil ich es gerade sehe: Du fuhrwerkst wieder mit Dingen rum, ohne Dein Design zu haben.

Oben schreibst Du, dass Du eine Karte hast, die jeweils vier Antworten kennt. Jetzt schreibst Du eine Klasse für die Karte, die eine Liste von Fragen beinhaltet. Das passt nicht zusammen.

Vergiss I/O, vergiss UI. Zunächst. Du willst eine Karte mit mehreren Antworten, von denen eine korrekt ist. Das kann man unterschiedlich abstrakt modellieren. Bleiben wir einfach mal nah an den Gegebenheiten:
Java:
// Repraesentiert eine einzelne Karte.
public class Card {
    private final String question;
    private final List<String> answers;
    private final String correctAnswer;

    /*  Erzeugt eine neue Karte.
     *  Die Karte enthaelt die gegebene Frage und die gegebenen Antworten.
     *  Es wird angenommen, dass die erste gegebene Antwort die korrekte Antwort ist.
     */
    public Card(final String question, final String ... answers) {
        // hier kann man noch Pruefungen der Parameter einbauen.
        this.question = question;
        this.answers = new ArrayList<>(Arrays.asList(answers));
        this.correctAnswer = answers.get(0);
    }
}

Natürlich kann man das auch allgemeiner modellieren, mit der Antwort als eigene Klasse, die dann auch weiß, ob sie die korrekte ist (s. Antwort von @kneitzel oben).

Damit kannst Du schon was anfangen. Wenn Du z. B. eine Klasse für die ersten Tests/Gehversuche schreibst:
Java:
public class App {
    public static void main(String[] args) {
        List<Card> cards = Arrays.asList(new Card[]{
            new Card("Wie werden Parameternamen in Java geschrieben?",
                    "lowerCamelCase", "UpperCamelCase", "SCREAMING_SNAKE_CASE", "snake_case"),
            new Card("Wie werden Konstanten in Java geschrieben?",
                    "SCREAMING_SNAKE_CASE", "UpperCamelCase", "lowerCamelCase", "snake_case")
        });
        // ...
    }
}
Damit hast Du schon einmal eine Liste von zwei Karten. Um das Einlesen kannst Du Dich ebenso später kümmern wie um das UI. Schreib erstmal die Logik des Spiels. Die Testklasse (App) kannst Du zum Testen verwenden.
 

LouCyphre

Bekanntes Mitglied
ich bin ein bisschen lost und habe mir erstmal nochmal den Zettel genommen und versucht alle Klassen und darin benötigten Methoden zu skizzieren.

Also Ich hatte ja letztlich 3+ Klassen skizziert.
Java:
Card(Frage, Antworten){
    
} 
    
Player(Card){
    @Getter @Setter
    String name;
    zählenDerRichtigen();
}

Quiz(Player){
    zeigeFrage();
    werteAntwortAus();
}

Also nochmal in Worten um Missverständnisse zu vermeiden. Das oben ist natürlich nur eine schlechte Skizze.

Also die Card Klasse beinhaltet die Frage und die Antworten.
->
Der Player erhält eine Karte, hat einen Namen und zählt selbst seine richtigen Antworten.
->
Das Quiz bekommt einen Player und zeigt die Frage ( diese Methode würde ich nach jeder beantworteten Frage erneut aufrufen) und wertet die Antwort aus. Das ganze in einer Schleife bis keine Frage mehr übrig ist.

Ich weiß, ich weiß es ist recht holprig und ich hab sicher was nicht richtig bedacht. Mir kommt es nicht ganz rund vor. Ich bin mir nicht sicher ob es Sinn macht die zeigeFrage() Methode schon direkt in die Card mit reinzuhauen und im Quiz dann einfach sowas wie showNextQuestionen() oder über eine Schleife currentQuestion() oderähnliches zu machen.
Vielleicht kann mich nochmal wer zurecht rücken.

PS:
this.correctAnswer = answers.get(0);
Das .get hat ein Problem mit dem Index. Muss ich noch casten oder geht das so generell nicht?
 

mihe7

Top Contributor
ich bin ein bisschen lost
:) Das ist normal. Mit dem Modell bist Du schon auf dem richtigen Weg.

Das ganze in einer Schleife bis keine Frage mehr übrig ist.
Nein, im Quiz läuft das nicht über eine Schleife (die würde keine Unterbrechungen zulassen). Das Quiz ist ein Zustandsautomat: Du hast einen "Spielstand" (z. B. dem Spieler S mit Punktestand P wird gerade Frage 1 angezeigt), der durch eine Aktion "von außen" in den nächsten Spielstand überführt wird (Spieler S, mit Punktestand P' wird gerade Frage 2 angezeigt). Das Quiz selbst agiert nicht, es regiert nur.

Nehmen wir mal den Ablauf von Wer wird Millionär. Wenn Du ein neues Quiz startest, dann wird eine Karte ausgewählt, zu deren Frage der Spieler eine Antwort geben soll. Gibt er eine Antwort, wird diese bewertet. War sie richtig, bekommt der Spieler die Punkte gutgeschrieben, war sie falsch ist das Spiel beendet und sein Punktestand wird ggf. heruntergesetzt. Er kann das Spiel aber jederzeit beenden und die bereits erspielten Punkte mitnehmen.

Heißt:
  1. Das Starten des Quiz führt dazu, dass eine Karte ausgewählt und die Frage "gezeigt" wird. Das Anzeigen selbst passiert nicht durch das Quiz sondern durch das UI.
  2. Der Spieler agiert. Er kann eine Antwort geben (quiz.processAnswer(givenAnswer)) oder das Spiel beenden (quiz.quit()).
  3. Die aufgerufenen Methoden führen zu einem Zustandsübergang: processAnswer kann z. B: dazu führen, dass die nächste Frage "gezeigt" wird oder der Punktestand des Spielers auf 0 gesetzt und das Spiel beendet wird. Ähnliches gilt natürlich auch für quiz.quit().
  4. Das UI zeigt den neuen Spielstand an.
Das Quiz könnte also nun folgende Methoden anbieten (hier mal als Interface):
Java:
interface Quiz {
    Karte aktuelleKarte();
    void verarbeiteAntwort(String antwort);
    void beendeQuiz();
}
Wenn Du aufgepasst hast, fehlt hier noch eine Kleinigkeit: das UI muss z. B. noch wissen, ob das Spiel aktuell überhaupt läuft oder schon beendet wurde. Hier sollte man dem Quiz noch eine weitere Methode spendieren.

Das wäre jetzt eine Schnittstelle, mit der das UI mit dem Quiz zusammenarbeiten kann. Natürlich kann die Klasse intern weitere Methoden wie zeigeKarte() haben.
 

AndiE

Top Contributor
Es kommt eben drauf an, wie das Spiel funktionieren soll. In meiner Schulzeit hat man noch Fragen mit A,B oder C beantwortet. Dann wurden z.B. 10 Fragen zu einem Stoffgebiet gestellt, und wer am meisten richtig hatte, hatte gewonnen.

Ganz klassisch würde ich hier erst mal von den Datenobjekten und Aktoren ausgehen. Eine Raterunde hat Bezeihungen zu einem Quizmaster und einem Spieler. Der Quizmaster et eine Beziehung zu einem Aufgabenstapel. Eine Aufgabe enthält die Frage und die drei Antworten, wovon nur eine richtig ist.

Das Spiel funktioniert dann so:
Der Quizmaster nimmt aus dem Stapel eine Aufgabe und stellt dem Spieler die Frage und nennt ihm die möglichen Antworten. Der Spieler wählt eine aus. Der Quizmaster wertet die Antwort aus. War die Antwort richtig, schreibt sich der Spieler einen Punkt gut. Das Ganze geht über die Anzahl der Fragerunden.
 

temi

Top Contributor
Es kommt eben drauf an, wie das Spiel funktionieren soll. In meiner Schulzeit hat man noch Fragen mit A,B oder C beantwortet. Dann wurden z.B. 10 Fragen zu einem Stoffgebiet gestellt
Das wäre allerdings mit der von @mihe7 vorgeschlagenen Schnittstelle auch möglich. Die Methode verarbeiteAntwort() muss bei einer falschen Antwort, das Quiz ja nicht beenden. Das hängt dann von der konkreten Implementierung der Schnittstelle ab, so dass es auch verschiedene Implementierungen der Schnittstelle geben kann, die alle unterschiedliche Modalitäten haben.
Java:
Quiz quiz1 = new WerWirdMillionaer();
Quiz quiz2 = new HoechstePunktzahlAusXFragen(10);

Ein wenig müsste man daran eventuell noch herumfeilen.
 

LouCyphre

Bekanntes Mitglied
Heißt:
  1. Das Starten des Quiz führt dazu, dass eine Karte ausgewählt und die Frage "gezeigt" wird. Das Anzeigen selbst passiert nicht durch das Quiz sondern durch das UI.
  2. Der Spieler agiert. Er kann eine Antwort geben (quiz.processAnswer(givenAnswer)) oder das Spiel beenden (quiz.quit()).
  3. Die aufgerufenen Methoden führen zu einem Zustandsübergang: processAnswer kann z. B: dazu führen, dass die nächste Frage "gezeigt" wird oder der Punktestand des Spielers auf 0 gesetzt und das Spiel beendet wird. Ähnliches gilt natürlich auch für quiz.quit().
  4. Das UI zeigt den neuen Spielstand an.
Das Quiz könnte also nun folgende Methoden anbieten (hier mal als Interface):
Java:
interface Quiz {
Karte aktuelleKarte();
void verarbeiteAntwort(String antwort);
void beendeQuiz();
}
Danke! Das ist ein guter Impuls.

Ich habe noch einige Fragen, bevor ich mit der GUI anfangen kann.
Erstmal der Code wie ich ihn jetzt hier habe.

Java:
import java.util.Arrays;
import java.util.List;

public class App implements IQuiz{
    public static void main(String[] args) {

        App app = new App();
        app.currentCard();
    }

    @Override
    public Card currentCard() {
        List<Card> cards = Arrays.asList(new Card[]{
                new Card("Wie werden Parameternamen in Java geschrieben?",
                        "lowerCamelCase", "UpperCamelCase", "SCREAMING_SNAKE_CASE", "snake_case"),
                new Card("Wie werden Konstanten in Java geschrieben?",
                        "SCREAMING_SNAKE_CASE", "UpperCamelCase", "lowerCamelCase", "snake_case")
        });

        System.out.println(cards.get(0));
        return null;
    }

    @Override
    public void processAnswer(String givenAnswer) {
        Player player = new Player("Lou", false);

        if(player.givenAnswer){

            player.countRightAnswers();

        }

    }

    @Override
    public void quitQuiz() {

    }
}

In Zeile 20 gibt er mir nur eine Speicheraddresse aus " Card@4c873330 ". Weiß wer warum?


public Card(final String question, final String ... answers) { // hier kann man noch Pruefungen der Parameter einbauen. this.question = question;

Hier meinst du ich könne noch Prüfungen für die Parameter einbauen. Was meinst du konkret damit?

Der Code wie ich ihn hier gepostet habe ist so nur erstmal für Testzwecke. ICh weiß, dass er an manchen Stellen noch gebügelt werden muss.
Zur Vollständigket hier noch die Player Klasse. Der Rest ist wie von @mihe7 gepostet.

Java:
import lombok.Getter;
import lombok.Setter;

public class Player {
    @Setter
    @Getter
    private String name;
    public int rightAnswers;
    public boolean givenAnswer;

    public Player(String name, boolean givenAnswer) {

        this.name = name;
        this.givenAnswer = givenAnswer;
    }

    public void countRightAnswers() {

        if (givenAnswer) {

            rightAnswers++;
        }

    }
}
 

kneitzel

Top Contributor
In Zeile 20 gibt er mir nur eine Speicheraddresse aus " Card@4c873330 ". Weiß wer warum?
Das ist die default Verhaltensweise von toString() in Object. Damit was vernünftiges ausgegeben wird, musst Du entweder die toString() Methode überschreiben oder du schreibst zur Ausgabe in einer für Ausgabe zuständigen Klasse eine spezielle Methode zur Ausgabe einer Card.
 

kneitzel

Top Contributor
Hier meinst du ich könne noch Prüfungen für die Parameter einbauen. Was meinst du konkret damit?
Evtl. willst Du es nicht akzeptieren, dass als eine Frage oder Antwort einfach null angegeben wird oder ein leerer String. Zu dem Konzept gehört nicht nur eine Überlegung, was für Klassen es gibt sondern auch was für Werte bei den Attributen zulässig sind.

Wenn Du eine Klasse Mensch hast, dann willst Du evtl. als Alter keine Zahlen <0 und > 125 erlauben. Und Name muss gesetzt setzt sein (also nicht null oder "" oder so)

Das sind aber damit auch Dinge, die wir Dir nicht sagen können sondern die Du Dir überlegen musst.
 

LouCyphre

Bekanntes Mitglied
musst Du entweder die toString() Methode überschreiben
Java:
    @Override
    public String toString(){
        return String.format("%s\n %s\n", question, answers);
    }

also so meinst du , ja? ist das mit den C Platzhaltern noch aktuell oder macht man das mittlerweile anders?

Das sind aber damit auch Dinge, die wir Dir nicht sagen können sondern die Du Dir überlegen musst.
Ich verstehe. Ja ich bin nur nicht drauf gekommen was @mihe7 damit meinte. Leuchtet jetzt ein.
 

kneitzel

Top Contributor
Es gibt viele Wege, wie man es machen kann. Die String.format Lösung ist auf jeden Fall valide. Aber answers ist eine List<String> - da wirst Du also in eine ähnliche Problematik kommen fürchte ich.
 

LouCyphre

Bekanntes Mitglied
Aber answers ist eine List<String> - da wirst Du also in eine ähnliche Problematik kommen fürchte ich.
Jaein. Also es hat mir die komplette Liste ausgegeben inklusive Klammern.

Ich habs jetzt so gemacht um alles einzeln ohne Klammern zubekommen. Ist ja aber sowieso nur ne Übergangslösung.
Java:
@Override
    public String toString(){
        return String.format("%s\n %s %s %s %s ", question, answers.get(0), answers.get(1),
                                answers.get(2), answers.get(3) );
    }

Wenn du die Methode überschreiben müsstest, wie würdest du denn rangehen ;)

Java:
import lombok.Getter;
import lombok.Setter;

public class Player {
    @Setter
    @Getter
    private String name;
    public int rightAnswers;
    public boolean givenAnswer;

    public Player(String name, boolean givenAnswer) {

        this.name = name;
        this.givenAnswer = givenAnswer;
    }

    public void countRightAnswers() {

        if (givenAnswer) {

            rightAnswers++;
        }

    }
}

Hast du oder wer anders noch Anmerkungen/ Verbesserungsvorschläge zu der Playerklasse ? Sonst würde ich, denke ich bald mit der GUI und JavaFX beginnen.
 

kneitzel

Top Contributor
Jaein. Also es hat mir die komplette Liste ausgegeben inklusive Klammern.
Ja, daher meinte ich "ähnlich". Es gibt halt eine Standard Implementation, die relativ einfach gehalten ist und auf die Bedeutung oder ähnliches keinen besonderen Wert legt.

Wenn du die Methode überschreiben müsstest, wie würdest du denn rangehen ;)
Ich habe Lombok Annotations gesehen: @ToString
Ohne Lombok wäre es in der IDE ein einfaches: IDE, generiere mit eine toString() Methode.

Hintergrund ist, dass dies eben nicht dafür gedacht ist, als Ausgabe für Programme zu dienen.

Hintergrund ist dabei einfach, dass man Aufgaben unterteilt. Die Klasse Card wäre also nur für die Verwaltung der Karte da. Wie die Anzeige aussehen soll, geht diese Klasse einfach nichts an. Das wird auch immer anders aussehen. In einer Swing Applikation hast Du da evtl. irgendwelche JLabel ... eine JavaFX Anwendung nutzt irgendwelche anderen Controls. Wenn es als HTML gerendert werden soll, dann wird da wieder was anderes bei rauskommen.
Dann gibt es evtl. Einstellungen, die variiert werden können - und da wollen wir keine Abhängigkeit zu haben.

Daher eine klare Aufgabenteilung: Da hast Du dann von mir aus eine CardView, die dann für die Darstellung zuständig ist. Diese Klasse kann dann ggf. auch Einstellungen kennen (Sowas wie "hoher Kontrast ist eingeschaltet" um dann darauf zu reagieren (Wir verändern die Darstellung, damit es auch für Menschen mit Sehschwäche gut zu erkennen ist).
Das ändert aber nichts an der Card Klasse.

Und wenn Du dann aus dem Swing Client ein HTML Client bauen willst: Card musst Du nicht anpassen. Es gibt dann von mir aus eine neue, andere View Klasse.

Ist das etwas verständlich?
 

mihe7

Top Contributor
Mal ganz allgemein: wir können hier an Code meist nur Skizzen liefern, die als Denkanstöße zu verstehen sind. Von daher setze ich dann z. B. nur den "happy path" um und lasse dann Fehlerbehandlung etc. weg. Das wäre einfach zu viel des Guten und versperrt ggf. auch den Blick auf das Wesentliche. Also: bei komplexen Fragestellungen bzw. Lösungen einfach davon ausgehen, dass gezeigter Code nur Denkanstoß ist, Fehler (auch logische) enthalten kann usw.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
B Enum innerhalb einer Klasse / anderes Konzept Java Basics - Anfänger-Themen 8
B Limitierungs - Klassse (Restriction).... Konzept so OK? Java Basics - Anfänger-Themen 0
Java-Insel Game-Konzept Java Basics - Anfänger-Themen 10
Spin Objektorientierung . Konzept Java Basics - Anfänger-Themen 4
Ollek Projektplanung - Konzept - Wie geht ihr dort vor? Java Basics - Anfänger-Themen 2
O OOP Problem - Konzept Falsch? Java Basics - Anfänger-Themen 7
rambozola Konzept Webentwicklung mit J2EE Java Basics - Anfänger-Themen 3
S Model-View-Controller Konzept Beispiel Java Basics - Anfänger-Themen 11
C Stream-Konzept Java Basics - Anfänger-Themen 2
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 2
S BubbleSort für ArrayLists Java Basics - Anfänger-Themen 3
T Übungsbuch für Anfänger Java Basics - Anfänger-Themen 3
D Methoden Plathhalter für Integer in einer Methode Java Basics - Anfänger-Themen 19
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
Aqtox Hallo ich muss für die Schule ein Wuerfell Duell erstellen jedoch habe ich ein fehler Java Basics - Anfänger-Themen 4
L loop für Namen Java Basics - Anfänger-Themen 11
kxrdelis Konstruktor für ein Rechtwinkliges Dreieck Java Basics - Anfänger-Themen 10
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
nevel Programm für die Summer der Zahlen 1- 1ß Java Basics - Anfänger-Themen 12
I Entity erstellen, die für API gedacht ist Java Basics - Anfänger-Themen 33
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
Animal-Mother BMI Rechner erstellen für W/M Java Basics - Anfänger-Themen 7
E Kleines Java-Projekt für Anfänger Java Basics - Anfänger-Themen 10
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
I DecimalFormat in Zahlenformat für Währung, habe 7,99, bekomme aber 7 Java Basics - Anfänger-Themen 4
L Methode für Zweidimensionale Arrays Java Basics - Anfänger-Themen 4
Kanaska Datentyp für Zahlenbereiche Java Basics - Anfänger-Themen 7
T Startbildschirm für ein Spiel erstellen Java Basics - Anfänger-Themen 0
U BestPractise für Deployment unter Windows gesucht Java Basics - Anfänger-Themen 12
lilrack UML Diagramm für Parkplatzverwaltung Java Basics - Anfänger-Themen 8
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
B Generische Typen für dynamisches Formular Java Basics - Anfänger-Themen 3
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
T Start-Activity für Java Maven Web-Anwendung festlegen Java Basics - Anfänger-Themen 2
T Alternative für switch case Java Basics - Anfänger-Themen 1
P Ressourcen für JSON & API Informationen? Java Basics - Anfänger-Themen 1
M Java Einstellung von Apache POI für MS Word Erstellung mit Eclipse Java Basics - Anfänger-Themen 6
L Compiler-Fehler SupressWarning für clone() Java Basics - Anfänger-Themen 6
P Wie für EIN Java Programm von 64bit Java (=Standard) auf 32bit Java Installation (Windows) umschalten? Java Basics - Anfänger-Themen 6
B Methode für jede beliebe Entity erstellen Java Basics - Anfänger-Themen 7
D Ampel für Mitarbeiter zum An-/Abwesend zeigen Java Basics - Anfänger-Themen 28
T Wahrscheinlichkeiten für Slot Machine Java Basics - Anfänger-Themen 13
C Konvertierung des int typs in den double typ für die Ausgabe mit Nachkommastellen Java Basics - Anfänger-Themen 4
M Code nur für Cracks? Crack the Passwort Übung Java Basics - Anfänger-Themen 7
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
T Roulette für Anfänger Java Basics - Anfänger-Themen 7
A Überprüfung für unentschieden in TicTacToe Java Basics - Anfänger-Themen 10
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
J alternierendes Probing-Verfahren für Hash-Tabellen implementieren Java Basics - Anfänger-Themen 0
V Ersätze für Java-Scanner Java Basics - Anfänger-Themen 9
B Get / Set - Methode für verschiedene Entities? (generisch) Java Basics - Anfänger-Themen 21
S Was für Aufgaben könnten sich hier hinter verbergen? Java Basics - Anfänger-Themen 5
R OOP Einfaches Programmierbeispiel für Assoziation, Aggregation und Komposition gesucht Java Basics - Anfänger-Themen 10
H Datentypen Was für eine Format verbirgt sich hinter dem Integer-Wert 053? Java Basics - Anfänger-Themen 2
NeoLexx Variable für Array wird nicht korrekt übergeben Java Basics - Anfänger-Themen 45
A Literale für primitive Daten Typen Java Basics - Anfänger-Themen 4
M Lösung Aufgabe - Java Programmiren lernen für Dummies Java Basics - Anfänger-Themen 11
M Regex für bestimmte Wörter bzw. bestimmte Zeichen erstellen Java Basics - Anfänger-Themen 5
D Zusammenhängenden Graphen für Gleisnetz erstellen Java Basics - Anfänger-Themen 13
M Writer für unterschiedliche Obj/inbt/double erstellen? Java Basics - Anfänger-Themen 1
D Denkweise für Rekusionen Java Basics - Anfänger-Themen 1
L Worauf muss ich achten, wenn ich externe Bibliotheken für meine Anwendungen verwende? Java Basics - Anfänger-Themen 6
M Unverständnis für ":" und "?" Java Basics - Anfänger-Themen 28
X Buchungssystem für Busse Java Basics - Anfänger-Themen 11
W Eclipse Autoformatierung für Streams ändern ? Java Basics - Anfänger-Themen 1
X Modellieren eines Buchungssystems für Busfahrkarten Java Basics - Anfänger-Themen 53
T Collections Methode (Knoten hinzufügen) für Graphen Java Basics - Anfänger-Themen 32
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
T Text-Ausgabe für Textadventure - Organisation Java Basics - Anfänger-Themen 5
Kamy Ein einfaches "Vier Gewinnt" Spiel für Anfängerin Java Basics - Anfänger-Themen 51
I Preis finden für ein Uber-App(?) Java Basics - Anfänger-Themen 3
G Unterklassen (Klasse für Ausgabe) Java Basics - Anfänger-Themen 4
F RegEx für Email Java Basics - Anfänger-Themen 2
F Methode für Teilbarkeit durch 5 tut was anderes.... Java Basics - Anfänger-Themen 3
J Hat jemand einen Lösungsansatz für diese Aufgabe? Java Basics - Anfänger-Themen 1
F Hilfe für einen Anfänger! Java Basics - Anfänger-Themen 4
K nur für das verständnis Java Basics - Anfänger-Themen 3
A Bedingungen für Parameterwerte Java Basics - Anfänger-Themen 7
H For-Schleife für 60 sekunden laufen lassen Java Basics - Anfänger-Themen 1
K GUI Entwicklung - Welche Richtung passt für euch zum mobilen Zeitalter? Java Basics - Anfänger-Themen 4
J Projektideen für Java (auch gehobeneres Niveau)? Java Basics - Anfänger-Themen 16
K Konstruktor für ein Objekt mit Zugriffsmethoden Java Basics - Anfänger-Themen 7
OSchriever Exception für Abbrechen-Schaltfläche JOptionpane Java Basics - Anfänger-Themen 9
P Übungsaufgaben für Anfänger? Java Basics - Anfänger-Themen 2
D Richtig für Programmieren an der UNI lernen Java Basics - Anfänger-Themen 8
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
M Welches Framework für kleine WebApp nutzen? Java Basics - Anfänger-Themen 6
O Iterator für eine geordnete Menge Java Basics - Anfänger-Themen 134
N Schleife für ein Würfelspiel Java Basics - Anfänger-Themen 10
R getUserProperties() macht für mich keinen Sinn Java Basics - Anfänger-Themen 8
F Regex für Inlineformatierungen Java Basics - Anfänger-Themen 12
M Formate für Dateien und Pfade? Java Basics - Anfänger-Themen 1
N Obstmarkt für Intellektuelle Java Basics - Anfänger-Themen 40
J Erste Schritte Actionlistener für tbar/ JButton Java Basics - Anfänger-Themen 15
B Erste Schritte nio oder io für neues Projekt Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben