# Quiz als Studienarbeit



## HalitGö (1. Dez 2015)

Servus zusammen, 

ich möchte ein Quiz in Java programmieren bzw. es ist eine Studienarbeit. 
Da ich mich noch als Anfänger bezeichnen würde, kenne ich mich noch nicht all zu gut aus. 

Dennoch sollte ich ein Quiz hinkriegen. 
Es sollen 3 Schwierigkeitsstufen geben (leicht, mittel und schwer). Hierzu habe ich 3 Frage Klassen angelegt, und in jeder Klasse habe ich eine ArrayList erstellt die, die Fragen aus einer .txt Datei aussliest. Das klappt auch schon!
Zu jeder Frage gibt es 4 Antwortmöglichkeiten. 

Danach habe ich meine GUI Oberfläche der Fragen designt. 
Jetzt zu meiner Frage: Wie schaffe ich es dass meine Frage oben im TextArea angezeigt wird und meine Antwortmöglichkeiten in die 4 Antwortmöglichkeiten eingelesen werden. Am besten sollte dies noch im Zufallsprinzip geschehen. 
Und wie sage ich dem Programm welche Antwort richtig bzw. falsch ist. 
Im Anhang ist eine Vorstellung, wie es aussehen sollte/könnte. 

Ich bedanke mich jetzt schon mal für hoffentlich hilfreiche Antworten.


----------



## strußi (1. Dez 2015)

so wie du es beschreibst brauchst du ein Liste mit den einzelnen Fragen, eine Liste mit den Antworten und eine Liste mit den richtigen Antworten
hast du eine List<String[]> antworten =new ArrayList<>();?
dann brauchst du eine List<int> antwort =new ArrayList<>(); der die nummer der richtigen Antwort hat oder als String die Richtige Antwort hat, damit du mit StringGegebeneAntwort.equals(StringRichtigeAntwort) prüfen kannst ob die gegebene Antwort richtig ist.
dann wäre es einfach. Das String[] auslesen und mittels einer Methode String für String in die TextArea schreiben. 
wie wäre es an stelle der TextArea mit RadioButtons? dann brauchst du nur noch ein Button für weiter.

überleg dir das konzept noch mal, und zeig uns etwas code, damit wir dir bei spezifischen Fragen helfen können


----------



## truesoul (1. Dez 2015)

Hallo,

sowas wie


```
public class Question {

    private List<Answer> answer = new ArrayList<>();
    private String text;

    public List<Answer> getAnswer() {
        return answer;
    }

    public void addAnswer(Answer answer) {
        this.answer.add(answer);
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

public class Answer {

   private String text;
   private boolean isCorrect = false;

   public void setCorrect(boolean isCorrect) {
     this.isCorrect = isCorrect;
   }

   public void setText(String text) {
     this.text = text;
   }

   public boolean isCorrect() {
     return isCorrect;
   }

   public String getText() {
     return text;
   }

}
```

wäre hilfreich. Dann bräuchtest du nur eine Liste mit Questions.
Und wie man in einem TextArea ein text hinzufügt sollte mit Google schnell zu finden sein. 

Und wenn du Frage aus einer Datei einlesen möchtest, dann ist eine sinvolle Dateistruktur/typ gut. XML z.B. 

Grüße


----------



## truesoul (1. Dez 2015)

Hallo,

im zusammenhang mit XML auch ganz interessant: 

http://openbook.rheinwerk-verlag.de...tml#dodtpae5cabdd-427b-4200-b89d-13a8d670e27d

Grüße


----------



## HalitGö (1. Dez 2015)

Also erst mal vielen Dank für die schnellen Antworten, ich bin euch wirklich dankbar 
Nun zum Thema: 
Wie gesagt, ich habe mir vorgestellt 3 FrageKlassen zu erstellen (zu jeder Schwierigkeit, s.Anhang)
 
Ich denke, es ist vielleicht nicht die schlauste Variante, aber wie soll ich sonst 3 Schwierigkeitsstufen hinbekommen die in zufälliger Reihenfolge dran kommen sollen. 
Ist es vielleicht schlauer, eine .txt Datei nur für Fragen einzulesen und diese dann auf das textArea auszugeben? (s.Anhang) 

Tut mir leid, wenn ihr die Frage schon beantwortet habt, ich habe es leider nicht ganz verstanden, was ich jetzt wirklich tun soll. 

Trotzdem jetzt schon mal vielen lieben Dank an euch 

Grüße


----------



## HalitGö (1. Dez 2015)

Achso, dazu hätte ich auch noch eine Frage: 
Im Anhang ist mal ein Entwurf wie die Hauptoberfläche aussehen soll: 
Wie schaffe ich es, wenn ich auf Anleitung drücke, sich ein übersichtliches Fenster öffnet, in das ich meine "Spielanleitung" rein schreiben kann. Das würde mir auch noch sehr weiter helfen


----------



## KaffeeFan (1. Dez 2015)

Du musst dem Button einen ActionListener hinzufügen, in dem du dann angeben kannst, was bei einem Klicken passieren soll.


----------



## HalitGö (1. Dez 2015)

KaffeeFan hat gesagt.:


> Du musst dem Button einen ActionListener hinzufügen, in dem du dann angeben kannst, was bei einem Klicken passieren soll.


Jo, das ist mir klar, aber ich weiß nicht welchen Action Listener und was ich dann einfügen soll.


----------



## KaffeeFan (1. Dez 2015)

button.addActionListener(new ActionListener...

probier mal ein bisschen herum 

P.S: du solltest in den ActionListener z.B. ein JFrame einfügen auf dem du dann z.B. ein JLabel mit der Anleitung anzeigen lassen kannst


----------



## KaffeeFan (1. Dez 2015)

Da ich jetzt Feierabend mache, hier eine mögliche Lösung, falls du es nicht hinbekommst...



Spoiler: Erst selber probieren





```
JButton button = new JButton();
    button.addActionListener(new ActionListener(){
      @Override
      public void actionPerformed(ActionEvent evt)
      {
        JFrame frame = new JFrame("Anleitung");
        frame.setSize(100,100);
        frame.setVisible(true);
       
        JLabel label = new JLabel("Anleitung");
       
        label.add(frame);
      }
    });
```


----------



## HalitGö (2. Dez 2015)

Erst mal vielen Dank für die zahlreichen Antworten, dass alles hilft mir wirklich tierisch weiter und es fängt an Spaß zu machen! 

Momentan arbeite ich an der Anleitung, wenn ich auf der Hauptoberfläche auf "Anleitung" drücke öffnet sich schon mal das Frame (danke KaffeeFan) 
Jetzt möchte ich auf dem Frame einen Button hinzufügen, mit dem ich auf die Oberfläche zurück komme. 

 
Das Problem ist, wenn ich 
frame.add(btnZ); 
mache, wird das komplette Frame ein Button obwohl ich eigentlich gesagt habe wo der Button sein soll...
Achja, gibt es eine Möglichkeit in dem Anleitungsfenster mit dem WindowBuilder zu arbeiten? 
Das würde bestimmt besser und effizienter gehen.

Danke jetzt schon mal, das hier ist wirklich eine große Hilfe!!!

Grüße


----------



## KaffeeFan (2. Dez 2015)

Du musst dem JFrame ein passendes Layout geben, dann wird der Button "normal" angezeigt

p.s: Mit WindowBuilder kenne ich mich nicht aus, sorry


----------



## strußi (2. Dez 2015)

ich nehme gerne noch ein Panel zwischen Frame und Components so dass, die Components auf dem Panel liegen, wenn ich dann die Gui erweitern möchte, ich entweder ein weiters Panel nehmen kann oder noch ein Panel mit einem anderen Layout zwischenschieben kann.


----------



## HalitGö (3. Dez 2015)

Hallo, 

ich arbeite gerade wieder am Quiz.  
Es gibt 3 Schwierigkeitsstufen der Fragen (Leicht, mittel und schwer) die zufällig gestellt werden sollen. Ist es sinnvoll nur eine Liste mit mit Fragen zu erstellen, 1 liste nur mit Antworten. Oder wie mache ist das am besten? 
Ist es sinnvoll eine Liste zu machen mit allen Fragen 
und eine nur mit Antworten nur zu den Fragen? Wie verknüpfe ich das alles am Besten? 

Danke jetzt schon mal 
Grüße


----------



## Joose (3. Dez 2015)

Indem du jeweils eine eigene Klasse für Fragen und Antworten erstellst.
Die Klasse Fragen hat dann eine Liste von Antworten.

Siehe den Post von @truesoul http://www.java-forum.org/thema/quiz-als-studienarbeit.170717/#post-1073777
Da steht schon eine mögliche Musterlösung


----------



## System.exit(0) (3. Dez 2015)

Wäre es nicht einfacher, eine Liste zu erstellen, die alles beinhaltet?
Schwieirigkeitsstufe, Frage, richtige Antwort, drei falsche Antworten?
Diese liest du dann aus und kannst dann die vier Antworten "mischen", weißt aber, dass die erste Antwort die richtige war.

Eine Datei ist leichter zu pflegen als drei oder vier.


----------



## Tonimono (4. Dez 2015)

Ich habe letztes Jahr auch ein Quiz geschrieben.
Dabei habe ich pro Frage eine ArrayList gemacht, die jeweils die Frage, 4 Antwortmöglichkeiten und die Zahl(1,2,3 oder 4) der richtigen Antwort und den Schwirigkeitsgrad (1,2 oder 3)beinhaltet.
Diese ArrayLists habe ich dann wieder in 3 Arrays für die 3 Schwirigkeitsstufen gepackt.

Bestimmt nicht die eleganteste Lösung. Aber immerhin hat es funktioniert


----------



## HalitGö (17. Dez 2015)

Servus miteinander, 
momentan bin ich dank eurer Hilfe schon gut weiter gekommen, stehe aber noch vor einigen Fragen: 
z.b: 
Die eingelesene Frage soll ganz oben in der textArea stehen
und die 4 Antwortmöglichkeiten sollen untereinander stehen
also so
FRAGE
1. ANTWORT
2. ANTWORT
usw....
momentan sieht es so aus:  


Die Fragen stehen in einer Textdatei, das sieht so aus: 
  

Das wäre mein erstes Problem, danach stellt sich mir die Frage, wie ich es hinbekomme zu sagen, welche Antworten richtig und welche Falsch sind. 

Fettes Dankeschön jetzt schon mal!!!!!!!!!!!!!!!


----------



## Joose (17. Dez 2015)

Naja du musst doch nur statt dem "," zwischen den Antworten einen Zeileumbruch "\n" einfügen. (Stichwort "String.replace()")
Ich nehme an ein "x" vor einer Antwort soll die richtige markieren?

Wie schon weiter oben beschrieben würde ich die Fragen + Antworten einlesen und in Objekte umwandeln. Durch diesen OOP Ansatz machst du dir einiges einfacher.


----------



## HalitGö (18. Dez 2015)

Ok danke schonmal, 
ich habe jetzt 3 FragenKlassen
JEDE Klasse beinhaltet 30 Fragen (die in einer .txt Datei stehen)  und zu jeder Frage 4 Antwortmöglichkeiten, die auch in der selben .txt Datei stehen.) 

Jetzt meine Frage: Wie teile ich es mit dem Programm zu sagen, welche Antwort richtig und welche falsch ist?!
Ich weiß das habe ich schon mal gefragt, aber ich konnte mir nichts aus den Antworten ziehen... Tut mir leid ._.

Ich hoffe ich kann mit den nächsten Antworten etwas anfangen 

lg


----------



## Joose (18. Dez 2015)

HalitGö hat gesagt.:


> ich habe jetzt 3 FragenKlassen
> JEDE Klasse beinhaltet 30 Fragen (die in einer .txt Datei stehen)  und zu jeder Frage 4 Antwortmöglichkeiten, die auch in der selben .txt Datei stehen.)



Warum 3 FragenKlassen? Eine Klasse ist die Blaupause für ein Objekt mit Eigenschaften. Sprich es ist sinnvoller das ganze als Klasse "QuestionPool" und "Question" abzubilden.
Die Klasse Question beinhaltet die Frage, sowie die 4 Antworten und auch die Information welches die richtige Antwort ist.
Die Klasse QuestionPool verwaltet eine Liste von Question Objekten.



HalitGö hat gesagt.:


> Jetzt meine Frage: Wie teile ich es mit dem Programm zu sagen, welche Antwort richtig und welche falsch ist?!



Du hast die richtigen Fragen mit "x" markiert. Beim Einlesen der Textdatei musst du eben schauen ob eine Antwort mit "x" startet. (String.startWith())

Hier das schon gepostete Beispiel einer Question Klasse (von @truesoul)

```
public class Question {
   private List<Answer> answer = new ArrayList<>();
   private String text;

   public List<Answer> getAnswer() {
     return answer;
   }

   public void addAnswer(Answer answer) {
     this.answer.add(answer);
   }

   public void setText(String text) {
     this.text = text;
   }

   public String getText() {
     return text;
   }
}

public class Answer {
   private String text;
   private boolean isCorrect = false;

   public void setCorrect(boolean isCorrect) {
     this.isCorrect = isCorrect;
   }

   public void setText(String text) {
     this.text = text;
   }

   public boolean isCorrect() {
     return isCorrect;
   }

   public String getText() {
     return text;
   }
}
```

Erweitert um einen QuestionPool

```
public class QuestionPool {
   private List<Question> pool;
  
   public QuestionPool() {
     this.pool = new ArrayList<Question>();
   }
  
   public void addQuestion(Question newQuestion) {
     this.pool.add(newQuestion);
   }
}
```

Bei diesem Code müssest du nur noch eine Klasse schreiben welche dir die gewünschte Datei einliest und in entsprechende Question Objekte umwandelt. Und diese Objekte dann in den Pool "steckt".


----------



## Jardcore (18. Dez 2015)

Wie würdest du es denn machen, wenn du es nicht mit java machen würdest sonder nur Papier und einen Stift hättest?
Wenn du das weißt, dann übertrage es durch die Objektorientierung in die virtuelle Welt.


----------



## HalitGö (22. Dez 2015)

Servus, 

bin mal wieder am Coden und habe folgendes Problem. 
Ich glaube ich hab das schon mal oben geschrieben, aber ich checke das nicht ganz wie ich es jetzt mit den richtigen Antworten machen solll! 

Es gibt immernoch eine Textdatei mit Fragen und Antworten, die richtigen Antworten fangen mit einem "x" in der Textdatei an. 
So, verknüpfe ich am besten das ganze. Sorry, ich weiß, ich habe das jetzt schon paar mal gefragt, aber ich kapier es einfach nicht. 

Danke im Voraus


----------

