# Quiz mit Schleife



## KaYon (11. Mai 2016)

Sehr geehrte Forenmitglieder.

ich bin gerade dabei ein kleines Quiz zu programmieren, stehe aber gerade vor folgendem Problem:

Das Programm startet und ich bekomme ein Fenster mit 4 Buttons. Beim drücken des Buttons soll bei falscher Antwort der Button rot und der richtige Grün werden. Das funktioniert soweit. Jetzt habe ich das in eine Schleife gepackt und möchte das die Frage x mal wiederholt wird, leider macht Sie das nicht, das Feld und die Buttons bleiben einfach aktiviert und ich kann die Buttons nicht erneut auswählen. Natürlich möchte ich nicht 5x die gleiche frage haben, im späteren verlauf möchte ich das durch Zufall immer eine andere Frage aus einer Exeltabelle ausgelesen wird. Aber zuerst möchte ich dass das Programm z.B 5 mal die Schleife durchläuft also sprich ich 5 mal die gleiche Frage erneut beantworten kann und danach das Programm sich einfach beendet.

Hier ist der Quellcode:

```
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Quiz_Fenster extends JFrame implements ActionListener {
 Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
 JLabel frage;
 JButton ant[] = new JButton[4];
 JPanel panel;
 JFrame w1;
 boolean fragebeantwortet, schleife;
 public static void main(String[] args) {
  new Quiz_Fenster();
 }
 public Quiz_Fenster() {
  panel = new JPanel();
  w1 = new JFrame();
  w1.setSize(400, 400);
  w1.setLocation((int)(dim.getWidth() - 700) / 2, (int)(dim.getHeight() - 1500 / 2));
  w1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  w1.setVisible(true);
  w1.setLayout(null);
  frage = new JLabel("Was ist die Hauptstadt von Deutschland");
  frage.setBounds(52, 15, 250, 40);
  w1.add(frage);
  ant[0] = new JButton(" Stuttgart ");
  ant[0].setBounds(52, 90, 120, 40);
  w1.add(ant[0]);
  ant[1] = new JButton(" München ");
  ant[1].setBounds(52, 160, 120, 40);
  w1.add(ant[1]);
  ant[2] = new JButton(" Berlin");
  ant[2].setBounds(220, 90, 120, 40);
  w1.add(ant[2]);
  ant[3] = new JButton(" Bonn ");
  ant[3].setBounds(220, 160, 120, 40);
  w1.add(ant[3]);
  frage = new JLabel();
  ant[0].addActionListener(this);
  ant[1].addActionListener(this);
  ant[2].addActionListener(this);
  ant[3].addActionListener(this);
 }
 public void actionPerformed(ActionEvent ae) {
  for (int durchlauf = 0; durchlauf < 5; durchlauf++) {
   if (ae.getSource() == this.ant[0]) {
    if ((!(fragebeantwortet))) {
     ant[0].setBackground(new Color(255, 0, 0));
     ant[2].setBackground(new Color(0, 255, 0));
     fragebeantwortet = true;
    }
   } else if (ae.getSource() == this.ant[1]) {
    if ((!(fragebeantwortet))) {
     ant[1].setBackground(new Color(255, 0, 0));
     ant[2].setBackground(new Color(0, 255, 0));
     fragebeantwortet = true;
    }
   } else if (ae.getSource() == this.ant[2]) {
    if ((!(fragebeantwortet))) {
     ant[2].setBackground(new Color(0, 255, 0));
     fragebeantwortet = true;
    }
   } else if (ae.getSource() == this.ant[3]) {
    if ((!(fragebeantwortet))) {
     ant[3].setBackground(new Color(255, 0, 0));
     ant[2].setBackground(new Color(0, 255, 0));
     fragebeantwortet = true;
    }
   }
  }
 }
```
Wäre schön wenn mir jemand weiterhelfen könnte :/


----------



## udo-100 (11. Mai 2016)

Bitte den Code mit Formatierung mit dem IKON <Einfügen - Code> hier einstellen.
Das Lesen ist sonst eine Herausforderung.


----------



## Java20134 (12. Mai 2016)

Ich würde Dir vorschlagen eine Datenbank oder einfache Textdatei mit allen möglichen Fragen zu erstellen und anschließend wählst du bei richtiger Antwort eine neue pseudozufällige Frage mit vier Antworten aus! Dabei musst du beachten, dass die richtige Antwort auch in der Datenbank angegeben werden muss, bspw. als Ziffer, damit man die vom Benutzer eingegebene Auswahl überprüfen kann.


----------



## KaYon (12. Mai 2016)

Java20134 hat gesagt.:


> Ich würde Dir vorschlagen eine Datenbank oder einfache Textdatei mit allen möglichen Fragen zu erstellen und anschließend wählst du bei richtiger Antwort eine neue pseudozufällige Frage mit vier Antworten aus!



Wie mache ich das am besten, kenne mich in Java noch nicht so gut aus :/


----------



## Jardcore (12. Mai 2016)

Erstell dir ein Objekt "Frage" und ein Objekt "Antwort":

```
public class Frage {
    private String text;
    private List<Antwort> antworten;

    // getter / setter
}
```


```
public class Antwort {
    private String text;
    private boolean richtig;

    // getter / setter
}
```

Eine Frage hat dabei eine Sammlung von Antworten, die Antwort weiß immer ob sie Richtig ist oder nicht.
Wenn du nun eine Frage stellst, kannst du die Antwort, die der Spieler gegeben hat mit den möglichen Antworten der Frage vergleichen. Wenn die Texte übereinstimmen prüfst du weiterhin ob das auch die richtige Antwort war.

Dann erstellst du dir wie von Java20134 erwähnt eine Text Datei oder eine Datenbank.
Folgendes Beispiel ist in JSON:

```
{
    "fragen": [{
        "text": "Was ist die Antwort auf die Frage nach dem Leben, dem Universum und dem ganzen Rest",
        "antworten": [
         { "text": "Pizza", "richtig": false },
         { "text": "Glück", "richtig": false },
         { "text": "Geld", "richtig": false },
         { "text": "42", "richtig": true }
        ]
    }, {
        "text": "1+1=?",
        "antworten": [
         { "text": "1", "richtig": true },
         { "text": "2", "richtig": false },
         { "text": "34", "richtig": false },
         { "text": "42", "richtig": false }
        ]
    }]
}
```

Im Pseudocode ist grundlegend dann folgendes zutun -->

```
ladeFragenAusDateiUndLegeSieInDieFragenbox();

while(IstFragenboxLeer) {
    holeFrageAusFragenbox();
    stelleFrage();
    warteAufAntwort();
    pruefeAntwort();
    vergebePunkte();
}
```

Ich hoffe ich konnte ein wenig Hilfestellung leisten. 



KaYon hat gesagt.:


> Wie mache ich das am besten, kenne mich in Java noch nicht so gut aus :/


 Kennst du dich in anderen Sprache aus?


----------



## Java20134 (12. Mai 2016)

Du erstellst eine Textdatei mit einem beliebigem Namen. Anschließend schreibst du deine Fragen in die Datei im folgendem Format: Frage: Antwort1, Antwort2, Antwort3, Antwort4, richtigeAntwort.
Nun kannst du mit dem BufferedReader jede Zeile einzeln herauslesen und bspw. einer Klasse Datenbank zuzuordnen. Du ordnest der Datenbank dann bspw. ein Objekt vom Typ Question hinzu und diese Klasse enthält die Frage und die Antworten mit der richtigen Antwort. Die Klasse Datenbank enthält nun eine Liste mit allen Fragen und es gibt eine Methode, wo eine pseudozufällige Question zurückgegeben werden kann.

```
public class Question {
     private String question;
     private String[] answers;
     private int correctAnswer;

     //setter und getter Methoden
}

public class DataBank {
     private ArrayList<Question> questions;
     //oder JavaFX
     private ObservableList<Question> questions;

     public void addQuestion(Question q){
          questions.add(q);
     }

     public Question getRandomQuestion(){
          int random = Math.random()*questions.size();
          return question.get(random);
     }
}
```


----------



## KaYon (12. Mai 2016)

Vielen Dank für eure Antworten, ich werde das gleich mal ausprobieren.

Eine Frage noch: Kann ich dir von euch vorgeschlagenen Antworten auf mein Programm übertragen oder soll ich ein neues Programm schreiben ?


----------



## Java20134 (12. Mai 2016)

Du kannst denn Code kopieren, wenn du das meinst. Da sollte nichts dagegen sprechen!


----------



## KaYon (12. Mai 2016)

Habe das nun ausprobiert aber leider funktioniert es nicht, liegt wahrscheinlich daran, dass ich nicht genau weiß wo und wie ich das in mein ursprüngliches Programm reinschreiben soll.


----------



## Java20134 (12. Mai 2016)

Poste doch einmal deinen bisherigen Code!


----------



## KaYon (12. Mai 2016)

Java20134 hat gesagt.:


> Poste doch einmal deinen bisherigen Code!




```
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Quiz_Fenster extends JFrame implements ActionListener {
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
JLabel frage;
JButton ant[] = new JButton[4];
JPanel panel;
JFrame w1;
boolean fragebeantwortet, schleife;
public static void main(String[] args) {
  new Quiz_Fenster();
}
public Quiz_Fenster() {
  panel = new JPanel();
  w1 = new JFrame();
  w1.setSize(400, 400);
  w1.setLocation((int)(dim.getWidth() - 700) / 2, (int)(dim.getHeight() - 1500 / 2));
  w1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  w1.setVisible(true);
  w1.setLayout(null);
  frage = new JLabel("Was ist die Hauptstadt von Deutschland");
  frage.setBounds(52, 15, 250, 40);
  w1.add(frage);
  ant[0] = new JButton(" Stuttgart ");
  ant[0].setBounds(52, 90, 120, 40);
  w1.add(ant[0]);
  ant[1] = new JButton(" München ");
  ant[1].setBounds(52, 160, 120, 40);
  w1.add(ant[1]);
  ant[2] = new JButton(" Berlin");
  ant[2].setBounds(220, 90, 120, 40);
  w1.add(ant[2]);
  ant[3] = new JButton(" Bonn ");
  ant[3].setBounds(220, 160, 120, 40);
  w1.add(ant[3]);
  frage = new JLabel();
  ant[0].addActionListener(this);
  ant[1].addActionListener(this);
  ant[2].addActionListener(this);
  ant[3].addActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
  for (int durchlauf = 0; durchlauf < 5; durchlauf++) {
   if (ae.getSource() == this.ant[0]) {
    if ((!(fragebeantwortet))) {
     ant[0].setBackground(new Color(255, 0, 0));
     ant[2].setBackground(new Color(0, 255, 0));
     fragebeantwortet = true;
    }
   } else if (ae.getSource() == this.ant[1]) {
    if ((!(fragebeantwortet))) {
     ant[1].setBackground(new Color(255, 0, 0));
     ant[2].setBackground(new Color(0, 255, 0));
     fragebeantwortet = true;
    }
   } else if (ae.getSource() == this.ant[2]) {
    if ((!(fragebeantwortet))) {
     ant[2].setBackground(new Color(0, 255, 0));
     fragebeantwortet = true;
    }
   } else if (ae.getSource() == this.ant[3]) {
    if ((!(fragebeantwortet))) {
     ant[3].setBackground(new Color(255, 0, 0));
     ant[2].setBackground(new Color(0, 255, 0));
     fragebeantwortet = true;
    }
   }
  }
}
```


----------



## Java20134 (13. Mai 2016)

Du hast uns gesagt, dass du etwas ausprobiert hast: Ich kann davon nichts sehen!


----------

