# Arraylist/For Schleife/Scanner



## diyatenim47 (23. Jun 2014)

Hallo Leute,
und zwar habe ich folgendes Problem. Wie kann ich bei einer Arraylist in einem Eintrag (....) Strings als verschieden Dinge deklarien z.B also in der arraylist steht dann blabla.add("Frage","antwort1","antwort2"...,korrekt antwort "int"). Vielleicht kann mir etwas mit this machen. Und was ich noch machen möchte ist, dass ich die Arraylist mit einem Input verbinden möchte uns es jenach input also tasteneingabe am Terminal das dann outprinted. Also gebe ich die korrekte Antwort im Terminal ein z.B int=4 So führe mich zur nächsten Arraylist Eintrag bzw Frage.

Habs jetzt kurz und knapp formuliert stehe unter zeitdruck.
Bad German i know =)


----------



## JavaMeister (23. Jun 2014)

Ich verstehe 0.

Und würde ich meine Antwort so posten, wie du deine Frage, dann wär beiden nicht gedient.


----------



## Gucky (23. Jun 2014)

Vorab muss ich mich über JavaMeister und seine kontinuierlichen Versuche das Forenklima in Richtung eisig mit Aussicht auf Shitsorms zu verschieben, aufregen.

Nachdem dies geschehen ist, kann ich mich nun dem TO widmen:
Die Zauberwörter in dem Fall heißen, denke ich mal, HashMap und Containerklasse, auch wenn ich den letzten Teil nicht so ganz verstanden habe.


----------



## kaoZ (23. Jun 2014)

Ich kann mich nur anschließen ,deine Frage ist equivalent zu :


```
Es waren einmal zwei Kamele, eines davon war Lila, wieviel wiegt der Sand  wenn es Dunkel ist ?
```

 aber du könntest sowas ( Frage / Antwort ) entweder mit einer Map oder einem Set realisieren, oder du schreibst eine eigene Klasse welche dir diese Funktionalität liefert, insofern das was man dem Text entnehmen konnte ansatzweise an das drankommt was du vorhast


----------



## diyatenim47 (23. Jun 2014)

Oh Gott xD
Bin für Beleidigungen offen. Ihr kennt mich nicht und ich euch nicht.Also es geht mir auf gut Deutsch am Po vorbei. Wie dem auch sei. Ich bin tod müde von der Arbeit und werde genauere Details morgen bzw. übermorgen preisgeben. Was ich jetzt schon mal sagen ist, dass es eine Art Wer wird Millionär ? Spiel werden soll. Also in einem Arraylist Eintrag wären Frage Antworten und richtige Antwort(als Zahl) enthalten.

So weit bis morgen.

Danke trotzdem für eure Aufmerksamkeit


----------



## JavaMeister (23. Jun 2014)

> Vorab muss ich mich über JavaMeister und seine kontinuierlichen Versuche das Forenklima in Richtung eisig mit Aussicht auf Shitsorms zu verschieben, aufregen.



Man kann sich natürlich auch im Forum mit drittklassigen Halbwissen Antworten hevortun  Aber was solls ^^ Gibt immer Menschen, die es niemals verstehen werden.

Und wer Kritik mit Shitstorm gleichsetzt, der sollte sich überlegen, ob derjenige in Foren aktiv sein möchte ;D. Aber ich bin mir sicher, dass Gucky auch hierfür eine Antwort parat hat. Möchte das Thema aber nicht weiter vertiefen.

---

Fachlich ist natürlich die ANtwort einer Hashmap nicht falsch. Jedoch könnte man auch hier genauso sagen "Löse es mit einer Datenstruktur, die 1 auf die Lösung abbildet und einen weiterne Eintrag y hat, der die nächste Frage beantwortet."

Ich persönlich bleibe bei meiner Aussage: Frage enthält unzureichend viele Informationen, um eine richtige Antwort zu geben.


----------



## kaoZ (24. Jun 2014)

> Bin für Beleidigungen offen.



Das war keineswegs beleidigend gemeint , nur hast du a.) den Text in einem derart kryptischen Satzbau gestaltet das man ihm kaum entnehmen kann was genau du willst,

und b.) kommt es immer drauf an was genau du vorhast, nun wissen wir das es eine Art 'Wer wird Millionär' werden soll.

Da kommt mir doch immer gleich dir Frage hoch , wie weit deine Kenntnisse in OOP reichen , ich kann nämlich immer nicht verstehen wie immer gleich alle ohne auch nur eine Grundlage zu kennen, anfangen müssen irgendwelche Spiele umzusetzen und dann kotzen wenn es schon an der Syntax scheitert 

[EDIT]


> Ich persönlich bleibe bei meiner Aussage: Frage enthält unzureichend viele Informationen, um eine richtige Antwort zu geben.



Dem stimme ich voll und ganz zu.
[/EDIT]



Also ist es keineswegs böse gemeint.


----------



## diyatenim47 (25. Jun 2014)

Es wird als Klausur bewertet mein Freund .Wie dem auch sei. 

Also ich habe 3 Klassen erstellt. Die erst soll ein "Questionpool" werden, die zweite("Question") die Arraylist Einträge wie soll ich sagen spezifizieren. Also, das was ich oben schon erwähnt habe. Die Dritten Klasse, nenn wir sie "Game", soll das ganze zum laufen bringen. Hier mein jetztiger Fortschritt.

Also erstmal "Questionpool":
import java.util.ArrayList;
import java.util.Random;

public class QuestionPool {

    private ArrayList<Question> e;

    public QuestionPool() 
    {
        e = new ArrayList<Question>();
    }      

    public void populateEasy()
    {
        e.add(new Question("BLA BLA ?","Bla","Bla", "", "", 3));
        e.add(new Question("FA AD AS?","WDWAD","awdawdawdw", "", "", 4));
        e.add(new Question("What is the colour of an green apple?","yellow","green","red","blue",2));        
    }

    public void populateMedium() 
    {
        e.add(new Question("BLA BLA ?","Bla","Bla", "", "", 3));
        e.add(new Question("FA AD AS?","WDWAD","awdawdawdw", "", "", 4));
    }

    public void populateHard()
    {
        e.add(new Question("BLA BLA ?","Bla","Bla", "", "", 3));
        e.add(new Question("FA AD AS?","WDWAD","awdawdawdw", "", "", 4));
    }

    public int sizeOfE() {
        return e.size();
    }

    public Question getE(int i) {
        return e.get(i);
    }

}

...................

"Question" :
public class Question
{
    private String displayText;
    private String answer1;
    private String answer2;
    private String answer3;
    private String answer4;
    private int correct; // between 1 and 4

    public Question(String displayText, String answer1, String answer2, String answer3, String answer4, int correct) {
        this.displayText = displayText;
        this.answer1 = answer1;
        this.answer2 = answer2;
        this.answer3 = answer3;
        this.answer4 = answer4;
        this.correct = correct;      
    };
    public Question String;
    {
        System.out.println();
    }

}
..................
und "Game" wobei ich HIER NOCH GAR NICHT WEITERGEKOMMEN ALSO KANN MAN ES IGNORIEREN 

import java.util.Scanner;

public class Game
{
private Scanner reader;
private Question question;
private QuestionPool questionpool;

public Game()
{
    reader= new Scanner(System.in);
}

public void populateEasy();
{    

easy= new QuestionPool();
medium = new QuestionPool();
hard= new QuestionPool();
easy.populateEasy();
medium.populateMedium();
hard.populateHard();
}
  }

Also ich wär euch sehr verbunden, wenn ihr mich zu Threads oder Websites weiterleiten könnt, welche mir bei meinem Problem bzw. Sachverhalten etwas helfen könnten. Also her mit den Links oder sprecht  bitte


----------



## Gucky (25. Jun 2014)

Erstmal bitte, wie es über jedem Beitrageditierkasten dick und fett in rot steht Java Code in Java-Tags!

Zu den Threads: google mal nach Java ist auch eine Insel Threads.


----------



## kaoZ (26. Jun 2014)

> Es wird als Klausur bewertet mein Freund .Wie dem auch sei.



Nichts des so trotz ist eine ArrayList, insofern ihr diese nicht als feste Vorgabe habt die *Falsche* Datenstruktur für deinen Anwendungsfall !

WENN ihr explizit eine ArrayList zur Datenhaltung verwenden müsst , leg eine an welche z.B Frage und Antwort als String enthält, getrennt durch einen Separator like 
	
	
	
	





```
;
```

sprich


```
"Was macht das ?";"Das leuchtet Blau."
```

schreibe dir eine Methode die diese Einträge des Arrays entgegen nimmt, daraus Frage und Antwort durch trennung am Separator generiert, die Frage ausgibt, die Antwort mit der Antwort im Tupel vergleicht, und bei einer Korrekten Antwort dementsprechend darauf reagiert 

Hier mal ein schnell geschriebes Beispiel was genau ich meine ( hier ohne GameLoop ! )


```
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;

public class Question {
	
	static HashMap<Integer, Question> map = new HashMap<>();
	static int ID = 0;

	private String question;
	private String answer;
	
	public Question(String question, String answer) {
	    this.question	 = question;
	    this.answer		 = answer;
	    map.put(ID++, this);
    }
	
	public static Question getQuestionAtIndex(int id){
		
		Question quest = null;
		
		for (Entry<Integer, Question> entry : map.entrySet()) {
			if(entry.getKey() == id){
				quest = entry.getValue();
			}
        }
		
		return quest;
	}
	
	public String getQuestion(){
		return this.question;
	}
	
	public String getAnswer(){
		return this.answer;
	}
	
	public void printQuestion(){
		System.out.println(this.question);
	}
	
	public void printAnswer(){
		System.out.println(this.answer);
	}
	
	public static void main(String[] args) {
	    new Question("Was ist die richtige Datenstruktur ?", "Eine HashMap");
	    new Question("Was ist Blau und dreht sicht?", "Ein Planet, Muhaha !");
	    
	    Question one = Question.getQuestionAtIndex(0); // nur zur verdeutlichung
	    one.printQuestion();
	    
	    
	    //Question.getQuestionAtIndex(0).printQuestion();  <<-- Equivalent zu obriger ausführung !
	    
	 
	    String answer = new Scanner(System.in).nextLine(); // Resource leak !
	    
	    if(answer.equals(Question.getQuestionAtIndex(0).getAnswer())){
	    	System.out.println("YEAH ! That's right !");
	    }
	    else{
	    	System.out.println("OH NO ! Try Again");
	    }
	    
    }
}
```

Die Ausgabe dazu bei Richtiger , und bei falscher Antwort:


```
Was ist die richtige Datenstruktur ?
Eine HashMap
YEAH ! That's right !
```


```
Was ist die richtige Datenstruktur ?
Eine ArrayList
OH NO ! Try Again
```

Wie du sehen kannst lege ich hier eine Statische HashMap an , welche alle erstellten Fragen mit den dazu gehörenden Antworten enthält, diese werden bei Objekterzeugung direkt im Konstruktor schon der Map übergeben, zudem wird der Identifier (ID) mit jeder erstellten Frage hoch inkrementiert !

So kannst du bequem über 
	
	
	
	





```
Question.getQuestionAtIndex(int i){...}
```
 auf die angelegten Fragen zugreifen.


und kannst einfach über Referenzlose Objekte immer wieder neue Fragen hinzufügen :


```
new Quesiton("Ist das Leben nicht schön?", "Hallo Welt ?!");
```

Das abgleichen der Einträge in der Map mit den eingegebene Antworten wäre dann Aufgabe deiner Spiellogik , und du würdest dies dann z.B in einer compare() methode ausführen.

Mann KANN das ganze wie gesagt auch in einer ArrayList machen , ist allerdings "wesentlich" aufwendiger da du dann Frage und Antwort vorher trennen müsstest.


----------



## kaoZ (26. Jun 2014)

Man könnte sogar noch einen Schritt Weiter gehen , und die Antwort wiederrum in eine Separate Klasse auslagern, dann würde die Klasse *Question* als Attribut eine Referenz auf eine *Answer* halten . usw... usw...


----------



## diyatenim47 (28. Jun 2014)

Danke erstmal vielmals. Meine Frage lautet nun kalt hast du bei deinem Beispiel Code berücksichtigt , dass es 4 Antworten geben soll , welche dann am Terminal zusammen mit der Frage angezeigt werde sollen (println). Also nur damit ich bescheid weiss. Wie gesagt hab vor 3 Monaten angefangen mit Java und habe vorher noch nie irgend etwas mit Informatik zu tun gehabt


----------



## Harry Kane (29. Jun 2014)

Also die Aussage das eine ArrayList die falsche Datenstruktur ist, würde ich so nicht unterschreiben. Ich sehe keinen wirklichen Nachteil gegenüber dem Vorschlag von Kaoz.
Als interne Datenstruktur in einer Question-Klasse ist sie nicht  sinnvoll, aber als Datenstruktur zur Organisation von Question-Objekten IMHO die erste Wahl, so wie du es ja schon mit deinem QuestionPool umgesetzt hast.
Der Rest dürfte nicht weiter schwierig sein:
Du gehst der Reihe nach durch deine Question-Objekte durch und zeigst die Frage sowie die vier Antworten an. Dann fragst du eine Zahl zwischen 1-4 (oder einen Buchstaben zwischen A und D ab) und vergleichst die Usereingabe mit dem Wert, der in der Question für die richtige Antwort hinterlegt ist. Natürlich muss an dieser Stelle die Eingabe eines Index ausreichen und nicht, wie in Kaoz Lösung, der exakte Wortlaut der richtigen Antwort.
Falls korrekt, nächstes Question-Objekt. Falls falsch: Spiel zuende.
Funktionen wie das Festlegen des Gewinnbetrags etc. könntest du ebenso in deiner QuestionPool-Klasse hinterlegen.


----------



## kaoZ (29. Jun 2014)

Recht hast du,  ich hatte vergessen mich auf die interne Datenhaltung zu beziehen, es spricht natürlich nichts dagegen alle Fragen wie in seinem  QuestionPool dann einfach in einer Arraylist zu speichern, auch die interne Datenhaltung ist natürlich in dieser Art einer Collection, wie schon erwähnt, durchaus möglich.
Die Frage ist letzten Endes wie er die Umsetzung des Vergleiches/der Auswertung von richtigen Antworten zu der passenden Frage lösen möchte.


----------



## Java20134 (29. Jun 2014)

Du kannst dir auch mal dieses Video angucken. Let's make a Quizgame / Quizspiel [Java] (#01) [German] [HD] - YouTube


----------



## diyatenim47 (2. Jul 2014)

Ich hab es nun geschaftt es zum laufen zu bekomen. Nun hätte ich eine weiter Frage. Wie denkt ihr, könnte ich die typischen Jokers (50:50, Publikum etc.) einbauen. Also wonach sollte ich googeln bzw. recherchieren ? Links wären nett.

Und nochmal danke, dass ich euch Zeit für mich genommen habt...alle ihr seid klasse ^^

Gruß


----------



## kaoZ (2. Jul 2014)

Würde ich eine Abstrakte Basisklasse für definieren , dann in Spezialisierungen unterteilen, welche als Attribut z.b einen counter
enthalten, welcher nach Nutzung dekrementiert wird.

so kannst du je Spezialisierung festlegen wie viele welcher Joker, wie oft verwendet werden können .

Dann fügst du deiner Spielklasse einfach als Attribut ein Array von Jokern hinzu und diesem dann die jeweiligen Spezialisierungen, was die einzelnen Joker für Funktionen haben definierst du in den einzelnen Spezialisierungen, ebenso wie oft diese genutzt werden können etc.


----------



## Java20134 (2. Jul 2014)

Du kannst doch mit Zufallszahlen ändern. (Zufallszahl zwischen 1-10

```
int zufallszahl = Math.random()*10+1
```


----------



## Gucky (2. Jul 2014)

Den Publikumsjoker würde ich so einbauen, dass ein Zufallsgenerator vielleicht 1000 Werte erzeugt und diese auf die Antworten vertelt werden. Die richtige Antwort hat dir höchste Wahrscheinlichkeit. Die Anderen unterschiedliche (auch per Zufall).
50:50 kannst du so machen, dass einfach zwei der falschen Antworten gelöscht werden. Wieder Zufällig.


----------



## kaoZ (2. Jul 2014)

Hier nochmal ein Beispiel zu dem was ich meinte :

Wie du es letztendlich implementiert ist dann ganz dir überlassen , dies ist nur ein OO Lösungsansatz


```
public abstract class Joker {

	public Joker() {}
	
	
	class PublikumsJoker extends Joker{
		
		public PublikumsJoker(int anzahlZuschauer) {
	        // TODO Auto-generated constructor stub
        }
	}
	
	class TelefonJoker extends Joker{
		
		public TelefonJoker(String personName, String number) {
	        // TODO Auto-generated constructor stub
        }
	}
	
	class FifyFiftyJoker extends Joker{
		
		public FifyFiftyJoker(Questions[] questions) {
	        // TODO Auto-generated constructor stub
        }
	}
}
```


----------



## diyatenim47 (6. Jul 2014)

Danke vielmals...Hab wie gesagt viel um die Ohren. Feedback heute Abend oder morgen. Danke dir kaoz Gucky und Java fürs erste.
Gruß
=)


----------



## diyatenim47 (12. Jul 2014)

Also wie ich verstanden habe soll ich die Joker mit im Endeffekt mit einem Zufallsgenerator machen. Nun ich weiss aber nicht wo ich anfangen soll. Kaoz deinen Ansatz verstehe ich überhaupt nicht. Also per random werte erzeugen und dann beim e.g Publikumsjoker zufällig verteilen und eine Bekommt halt den größten Wert .
Ich weiss immer noch nicht wie ich anfangen soll. Zur Zeit suche ich auf google.
Habt Geduld mit mir  

Gruß


----------



## kaoZ (12. Jul 2014)

Mein Ansatz behandelt Joker wie man es in der OOP auch machen sollte als Objekte, hier eben vom Typ Joker, welche Eigenschaften die einzelnen Joker haben wird in ihren Spezialisierungen festgelegt.

So wie du bei deinem Spiel Fragen in Form von Objekten definierst kannst du es eben auch mit Jokern machen, die Joker haben dann wie auch die Fragen bestimmte Eigenschaften und Methoden.


----------



## diyatenim47 (12. Jul 2014)

Ok Kaoz soweit verstanden. Müsste dein Gehirn noch für was anderes anzapfen. Also, ich habe zur Zeit nur 1 Fragepool als seperate Klasse. Nun möchte ich 2 verschiedene hinzufügen (Für jeden Schwierigkeitsgrad einen Fragepool/klasse): einfach,medium,hard). Also nachdem mein erster Fragepool 5 Fragen zufällig rausgepickt hat, soll er auf eine anderen Fragen pool wechseln. Ich hab es mit der For Schleife versucht, bekomme es aber nicht gebacken.

Hier mein Fragepool:
[JAVA=42] 
public class Fragen{
    int zufall;
    String fragen[] = new String[7];
    static String frage;

    String Fragenmedium[];

    public Fragen(){

        fragen[1] = "What is the capital city of Germany?$Frankfurt$München$Hamburg$Berlin$4";
        fragen[2] = "Who is the main character in the cartoon `Micky Mouse`?$Donald Duck$Pluto$Micky Mouse$Spongebob$3";
        fragen[3] = "Who is the CEO of Apple?$Brad Pitt$Tim Cook$Michelle Citchen$Bill Gates$2";
        fragen[4] = "Who was the first president in the USA?$Barack Obama$Gerd Schröder$George Washington$George W. Bush$3";
        fragen[5] = "In what city did the famous `Tea Party` occur to protest the British East India Company?$Miami$New York $Philadelphia$Boston$4";
        fragen[6] = "The FC Bayern Munich is a professionel football team in which league?$Bundesliga$Oberliga$Championsleague$Regional Liga$1";

        frage =  fragen[zufall(1,7)];

        }

    public int zufall(int min,int max){
       zufall = (int)((max-min)*Math.random()+min);

       return zufall; 


     //hier habe ich versuchst die Schleife zu platzieren, also for (zufall int==5){
      Fragenmedium(); }




        }


        }

[/code]

Könntest du mir weiter helfen Kaoz ?


----------



## diyatenim47 (12. Jul 2014)

[Java=42] 
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Quiz_Fenster implements ActionListener {
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

    JLabel frage;
    JButton ant[] = new JButton[4];    
    JFrame w1;
    JProgressBar b;

    int lösung,richtig;

    public static void main (String[] args) { 
        new Quiz_Fenster();
    }

    public Quiz_Fenster(){

    {
        w1 = new JFrame();
        w1.setSize(400,300);
        w1.setLocation((int)  (dim.getWidth()-400/2),(int)(dim.getHeight()-300/2));
        w1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        w1.setVisible(true);
        w1.setLayout(null);


        ant[0] = new JButton("   ");
        ant[0].setBounds(52,90,120,40);
        ant[0].addActionListener(this);

        w1.add(ant[0]);

        ant[1] = new JButton("   ");
        ant[1].setBounds(52,160,120,40);
        ant[1].addActionListener(this);

        w1.add(ant[1]);

        ant[2] = new JButton("   ");
        ant[2].setBounds(220,90,120,40);
        ant[2].addActionListener(this);

        w1.add(ant[2]);

        ant[3] = new JButton("   ");
        ant[3].setBounds(220,160,120,40);
        ant[3].addActionListener(this);

        w1.add(ant[3]);

        frage = new JLabel("HIer steht die Frage!");
        frage.setBounds(52,15,250,40);
        w1.add(frage);

        b = new JProgressBar(0,100);
        b.setBounds(120,220,140,25);
        b.setValue(0);
        b.setStringPainted(true);
        w1.add(b);                        

    }}

    public void actionPerformed(ActionEvent e){
        if(e.getSource() == ant[0]){
            if (lösung == 1){
                Nachricht("Right","Keep it up...");
                Prozent();
                frage_change.neueFrage();

            }
            else{
                Nachricht("Wrong answer","Not correct...");
                System.exit(0);
    }}



      if(e.getSource() == ant[1]){
            if (lösung == 2){
                Nachricht("Right","Keep it up...");
                Prozent();
                frage_change.neueFrage();

            }
            else{
                Nachricht("Wrong answer","Not correct");
                System.exit(0);
    }}




      if(e.getSource() == ant[2]){
            if (lösung == 3){
                Nachricht("Right","Keep it up...");
                Prozent();
                frage_change.neueFrage();

            }
            else{
                Nachricht("Wrong answer","Not correct");
                System.exit(0);
    }}



      if(e.getSource() == ant[3]){
            if (lösung == 4){
                Nachricht("Right","Keep it up...");
                Prozent();
                frage_change.neueFrage();

            }
            else{
                Nachricht("Wrong answer","Not correct");
                System.exit(0);
    }}


}

 public void ChangeButtonText(int button,String text){
        ant[button-1].setText(text);       
    }

 public void ChangeLabelText(String text){
        frage.setText(text);

    }

public void Nachricht(String Aussage,String info){
    Object[] options = { "OK"};
    JOptionPane.showOptionDialog(null, Aussage, info, JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);

}

public void Prozent(){
    if(richtig <= 7){
        richtig+=1;
        Prozentrechnung(richtig,8);
    }
    else{
        Nachricht("Super !","You are a millionair now. Congratulatio! ");
        System.exit(0);

}
}

public void Prozentrechnung(int zahl,int gesamt){
    b.setValue((int) 100/gesamt*zahl);

}


}

[/code]


----------



## diyatenim47 (12. Jul 2014)

[JAVA=42] 
class frage_change {

    static String ri_frage = null;
    static String op1 = null;
    static String op2 = null;
    static String op3 = null;
    static String op4 = null;
    static int lösung = 0;

    static Quiz_Fenster quiz;
    static Fragen frage_klasse;
    static String akt_Frage;



    public frage_change(){

        quiz= new Quiz_Fenster();
        neueFrage();

    }

    public static void neueFrage(){
        frage_klasse = new Fragen();
        akt_Frage = Fragen.frage;

        parser();
        aendereText();

    }

    public static void parser(){

        String[] frage = akt_Frage.split("\\$");

        for(int x = 0;x< frage.length;x++){

            switch(x){

             case 0 :
                ri_frage = frage[x];
             break;

             case 1:
                 op1 = frage[x];
             break;

             case 2:
                 op2 = frage[x];
             break;

             case 3:
                 op3 = frage[x];
             break;

             case 4:
                 op4 = frage[x];
             break;

             case 5:
                 lösung = Integer.parseInt(frage[x]);
             break;   

    }}
}

    public static void aendereText(){

            quiz.ChangeLabelText(ri_frage);
            quiz.lösung = lösung;
            quiz.ChangeButtonText(1, op1);
            quiz.ChangeButtonText(2, op2);
            quiz.ChangeButtonText(3, op3);
            quiz.ChangeButtonText(4, op4);        

    }

}
[/code]

Das wars eigentlich was ich bisher erreichen konnte. Wie gesagt müsste ich es irgendwie in 3 Arrays aufteilen. Wobei nach 5 Fragen aufs andere Array zugegriffen wird. Also 5 Fragen von der einfachen Klasse ("Fragen") dann wechsel zur anderen etc... Zudem müsste ich noch eine Schleife irgenwo in diesem Morast von Code implementieren, welche nach jeder richtigen Antwort, das bis dahin gewonnen Geld ausgibt. Beispielsweise nach 5 richtigen antworten hat man 1000 Euro gewonnen.


----------



## kaoZ (12. Jul 2014)

Ich würde mir ggf. schon Früher gedanken darum machen, fangen wir mal bei der Klasse an die eine Frage Repräsentiert

Hier mal rein fiktiv ohne Antwort etc.... nur zum Verständnis


```
public class Question {
	
	static final int SIMPLE = 1;
	static final int MIDDLE = 2;
	static final int HARD 	= 3;
	
	private String quest;
	private int type;
	
	public Question(String quest, int type) {
		this.quest = quest;
	}
	
	public String getQuestion() {return this.quest;}
	
	public int getType() {return this.type;}

}
```

und die Klasse die nachher die Fragen als eine Art Sammlung enthalten soll


```
import java.util.ArrayList;


public class QuestionPool {

	static ArrayList<Question> simplePool = new ArrayList<>();
	static ArrayList<Question> midPool = new ArrayList<>();
	static ArrayList<Question> hardPool = new ArrayList<>();
	
	public QuestionPool() {}
	
	public void addQuestions(Question...quest){
		for (int i = 0; i < quest.length; i++) {
	        if (quest[i].getType() == Question.SIMPLE) {
	            simplePool.add(quest[i]);
            }
	        if (quest[i].getType() == Question.MIDDLE) {
	            midPool.add(quest[i]);
            }
	        if (quest[i].getType() == Question.HARD) {
	            hardPool.add(quest[i]);
            }
        }
	}
	
	public Question[] getRandomQuestions(int count){
		
		Question[] q = new Question[count];
		
		// implement all stuff here
		
		return q;
		
	}

}
```

Hier ein Beispiel :


```
public class Test {

	
	public static void main(String[] args) {
	    Question a = new Question("Was ist Java?", 1);
	    Question b = new Question("Warum ist das so?", 2);
	    
	    QuestionPool.addQuestions(a,b);
	    
	    System.out.println(QuestionPool.simplePool.size());
	    System.out.println(QuestionPool.midPool.size());
	    System.out.println(QuestionPool.hardPool.size());
    }
}
```

Die Ausgabe macht hier schon sichtbar das hier schon nach Typ der Fragen kategorisiert wird, und die Fragen in der jeweiligen Liste landen.

```
1
1
0
```

Nun kannst du hergehen und anhand deiner Vorstellungen die Implementierung der Methode getRandomQuestions()
so implementieren wie du sie haben möchtest, es wird dir dann z.B eine Array mit einer von dir gewählten anzahl an leichten, mittleren und schweren Fragen zurückgeliefert, welche du dann einfach an deine Gameklasse übergibst.

Hier ist mal eine Beispielimplementierung :


```
public static Question[] getRandomQuestions(){
		
		Random rdm = new Random();
		
		Question[] q = new Question[15];
		
		for (int i = 0; i < q.length; i++) {
	        if (i <= 5) {
	            q[i] = simplePool.get(Math.abs(rdm.nextInt() % 5));
            }
	        if (i > 5) {
	            q[i] = new Question("default", 3);
            }
        }
		
		return q;
		
	}
```

Die Ausführung :


```
public class Test {

	
	public static void main(String[] args) {
	    Question a = new Question("Was ist Java?", 1);
	    Question b = new Question("Warum ist das so?", 1);
	    Question c = new Question("Wieso nur?", 1);
	    Question d = new Question("Wie war die Frage?", 1);
	    Question e = new Question("Was ist Blaues Licht?", 1);
	    
	    QuestionPool.addQuestions(a,b,c,d,e);
	    
	    System.out.println(QuestionPool.simplePool.size());
	    System.out.println(QuestionPool.midPool.size());
	    System.out.println(QuestionPool.hardPool.size());
	    
	    Question[]  pool = QuestionPool.getRandomQuestions();
	    
	    System.out.println(pool.length);
	    System.out.println(pool[0].getQuestion());
	    System.out.println(pool[1].getQuestion());
	    System.out.println(pool[2].getQuestion());
	    System.out.println(pool[3].getQuestion());
    }
}
```

Die Ausgabe dazu :


```
5
0
0
15
Warum ist das so?
Was ist Java?
Wie war die Frage?
Was ist Blaues Licht?
```

Hier könnte man jetzt noch mit der Klasse 
	
	
	
	





```
BitSet
```
  in verbindung mit .
	
	
	
	





```
nextInt();
```
 der Klasse 
	
	
	
	





```
Random
```
 verhindern das gleiche fragen den einzelnen Listen hinzugefügt werden.


----------



## diyatenim47 (12. Jul 2014)

Hmm danke wiedermal, dass du dir Zeit genommen hast. Nun...verstehen du echt deinen größtenteils. Jedoch ist die sehr schwierig für mich es zu implementieren. Ich bin wirklich neu und nach deinen Post denke ich, dass du dich schon ein weilchen mit Java beschäftigst. Ich habe leider keine Zeit mehr um großartige Veränderungen durch zunehmen und für jede kleine Veränderung die ich vornehme brauche ich schon eine gewisse Zeit.
Deshalb frage ich dich Kaoz...kannst du mir bei meinem jetztigen Stand vom Spiel helfen also wo ich genau was ändern soll. Wenn es nicht geht auch nicht schlimm, muss ich halt mit leben :/

Jedenfalls danke ich dir für die ganzen Hilfe während des Threads.

Gruß
diyatenim


----------



## turtle (12. Jul 2014)

Nun gebe ich Dinge zu Protokoll, die mir aufgefallen sind:

Du solltest einen Layout-Manager bemühen und NICHT dich um die Positionierung der Elemente kümmern Ich nehme immer den jGoodies-Formlayout, der auch vom WindowBuilder in Eclipse unterstützt wird.
Du solltest das DRY-Prinzip beachten. DRY=*D*on't *R*epeat *Y*ourself. Also schreibe Code nur einmal. Diesen Code-Abschnitt sehe ich mehrmals und solltest du vermeiden.

```
Nachricht("Right", "Keep it up...");
				Prozent();
				// frage_change.neueFrage();

			} else {
				Nachricht("Wrong answer", "Not correct");
				System.exit(0);
			}
```
Methoden werden lowerCamelCase geschrieben und beginnen mit einem Verb. Also heissen deine Methoden vielleicht besser zeigeNachricht, zeigeFortschritt und berechneProzent und so weiter.

Ich habe mal, da ich heute meinen Grosszügigen habe D) mal das Programm umgeschrieben.
Ist zwar kein Klon vom Millionärsspiel, aber zumindest eine Frage kann man beantworten und zwar mehrmals falsch, wie man an der Progressbar sieht. Ist sicher nicht perfekt, zeigt aber wohin deine Reise gehen sollte


```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingConstants;

import com.jgoodies.forms.factories.FormFactory;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;

import java.awt.Font;

import javax.swing.AbstractAction;
import javax.swing.Action;

@SuppressWarnings("serial")
public class Quiz_Fenster extends JPanel {

	private JLabel frage;
	private JButton btnAntwort1;
	private JButton btnAntwort2;
	private JButton btnAntwort3;
	private JButton btnAntwort4;
	private JProgressBar progressBar;
	private FrageAntwort frageAntwort;
	private int n = 0;

	public static void main(String[] args) {
		JFrame w1 = new JFrame();
		w1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Quiz_Fenster quiz_Fenster = new Quiz_Fenster();
		w1.getContentPane().add(quiz_Fenster);
		FrageAntwort frageAntwort = new FrageAntwort("Wie heisst die Hauptstadt von Deutschland?", "Frankfurt",
				"München", "Hamburg", "Berlin", "Berlin");
		quiz_Fenster.stelleFrage(frageAntwort);
		w1.pack();
		w1.setVisible(true);
	}

	private void stelleFrage(FrageAntwort frageAntwort) {
		this.frageAntwort = frageAntwort;
		frage.setText(frageAntwort.getFrage());
		btnAntwort1.setText(frageAntwort.getAntwort1());
		btnAntwort2.setText(frageAntwort.getAntwort2());
		btnAntwort3.setText(frageAntwort.getAntwort3());
		btnAntwort4.setText(frageAntwort.getAntwort4());
	}

	public Quiz_Fenster() {
		setLayout(new FormLayout(new ColumnSpec[] { ColumnSpec.decode("center:300px"), }, new RowSpec[] {
				RowSpec.decode("20dlu"), FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("fill:default"), FormFactory.UNRELATED_GAP_ROWSPEC, }));
		frage = new JLabel("Hier steht die Frage!");
		frage.setFont(new Font("Tahoma", Font.PLAIN, 14));
		frage.setHorizontalAlignment(SwingConstants.CENTER);
		frage.setBounds(52, 15, 250, 40);
		add(frage, "1, 2, center, top");

		JPanel panel = new JPanel();
		add(panel, "1, 4, fill, fill");
		panel.setLayout(new FormLayout(
				new ColumnSpec[] { FormFactory.DEFAULT_COLSPEC, FormFactory.RELATED_GAP_COLSPEC,
						ColumnSpec.decode("center:default:grow"), ColumnSpec.decode("50dlu"),
						ColumnSpec.decode("center:default:grow"), FormFactory.RELATED_GAP_COLSPEC,
						FormFactory.DEFAULT_COLSPEC, }, new RowSpec[] { RowSpec.decode("50dlu"),
						FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, RowSpec.decode("20dlu"),
						FormFactory.DEFAULT_ROWSPEC, RowSpec.decode("20dlu"), FormFactory.DEFAULT_ROWSPEC, }));

		btnAntwort1 = new JButton("Antwort1");
		btnAntwort1.addActionListener(new ButtonListener(btnAntwort1));
		panel.add(btnAntwort1, "3, 3");

		btnAntwort2 = new JButton("Antwort2");
		btnAntwort2.addActionListener(new ButtonListener(btnAntwort2));
		panel.add(btnAntwort2, "5, 3");

		btnAntwort3 = new JButton("Antwort3");
		btnAntwort3.addActionListener(new ButtonListener(btnAntwort3));
		panel.add(btnAntwort3, "3, 5");

		btnAntwort4 = new JButton("Antwort4");
		btnAntwort4.addActionListener(new ButtonListener(btnAntwort4));
		panel.add(btnAntwort4, "5, 5");

		progressBar = new JProgressBar();
		progressBar.setMinimum(0);
		progressBar.setMaximum(3);
		panel.add(progressBar, "3, 7, 3, 1");

	}

	protected void stelleAntwort(String antwort) {
		if (antwort.equals(frageAntwort.getRichtigAntwort())) {
			JOptionPane.showMessageDialog(null, "Richtig");
		} else {
			progressBar.setValue(++n);
			if (n == 3) {
				JOptionPane.showMessageDialog(null, "Sie haben leider verloren");
			}
		}
	}

	class ButtonListener implements ActionListener {
		private JButton btnAntwort;

		public ButtonListener(JButton btnAntwort) {
			this.btnAntwort = btnAntwort;
		}

		public void actionPerformed(ActionEvent e) {
			stelleAntwort(btnAntwort.getText());
		}
	}

	public FrageAntwort getAktuelleFrage() {
		return frageAntwort;
	}

}

class FrageAntwort {
	private String frage;
	private String antwort1;
	private String antwort2;
	private String antwort3;
	private String antwort4;
	private String richtigAntwort;

	public FrageAntwort(String frage, String antwort1, String antwort2, String antwort3, String antwort4,
			String richtigAntwort) {
		this.frage = frage;
		this.antwort1 = antwort1;
		this.antwort2 = antwort2;
		this.antwort3 = antwort3;
		this.antwort4 = antwort4;
		this.richtigAntwort = richtigAntwort;
	}

	public String getFrage() {
		return frage;
	}

	public void setFrage(String frage) {
		this.frage = frage;
	}

	public String getAntwort1() {
		return antwort1;
	}

	public void setAntwort1(String antwort1) {
		this.antwort1 = antwort1;
	}

	public String getAntwort2() {
		return antwort2;
	}

	public void setAntwort2(String antwort2) {
		this.antwort2 = antwort2;
	}

	public String getAntwort3() {
		return antwort3;
	}

	public void setAntwort3(String antwort3) {
		this.antwort3 = antwort3;
	}

	public String getAntwort4() {
		return antwort4;
	}

	public void setAntwort4(String antwort4) {
		this.antwort4 = antwort4;
	}

	public String getRichtigAntwort() {
		return richtigAntwort;
	}

	public void setRichtigAntwort(String richtigAntwort) {
		this.richtigAntwort = richtigAntwort;
	}
}
```


----------



## diyatenim47 (12. Jul 2014)

Erstmal dir auch ein herzliches Danke schön Schildkröte . Bekomm es aber nicht zum laufen. Error Meldung  "package com.jgoodies.forms.factories does not exist"  . Hab gegoogelt und hab mir dann auch jgoodiesforms runtergeladen. Weiss aber nicht wohin ich das entpacken soll. Im Ordner vom Projekt geht es nicht und weiss auch nicht wohin genau im BlueJ Ordner. 

Gruß


----------



## turtle (13. Jul 2014)

> BlueJ


Entschuldigung, habs überlesen
BlueJ kenne ich gar nicht:autsch:


----------

