Lottozahlen ziehen

Toni32

Mitglied
Hallo,

ich hatte hier als Übung schon angefangen ein Lottozahlen Programm zu schreiben:

http://www.java-forum.org/java-basi...a-kompliziert-fuer-jedermann.html#post1056948

Für jemanden der sich schon etwas mit Java auskennt mag es lächerlich einfach sein, aber ich sitze jetzt schon insgesamt 3 Std. davor und mir qualmt der Kopf!! :oops:
Immer wenn ich ein Stück weiterkomme treten neue Probleme und Fehler auf.

Kurz zur Funktion, man tippt 6 Zahlen, 6 Zufällige sollen dann so oft gezogen werden, bis man 6 Richtige hat.
Die beiden Klassen liefern ja schonmal die entsprechenden Arrays, aber man muss nun bei jedem Durchlauf alle Zahlen auch neu tippen, anstatt nur 1x, ich weiß nur gerade nicht wie ich das hinbekomme.
Könnte mir jemand einen Tipp geben?


Java:
import java.util.Scanner;

class Tippen {
    
    public static int[] zahlenTippen () {
        
    Scanner scan = new Scanner(System.in);
    int [] getippteZahlen = new int[6];
    
    for (int d=0; d<getippteZahlen.length; d++) {                //Zahlen tippen und Array befüllen
    System.out.println("Geben Sie die"+(d+1)+" . Zahl ein:");
    getippteZahlen[d]=scan.nextInt();
        }
        
    return getippteZahlen;
    }
}


class Ziehung {

public int[] ziehen(){


int[] alleZahlen = new int[49];
int[] gezogeneZahlen = new int[6];
int a = 0;                            //Indexzahl für gezogeneZahlen Array
int x = 0;


for(int i=0; i<49; i++) {        // Array mit 49 Zahlen erzeugen
alleZahlen[i]=i+1;
}

for (int j=0; j<6; j++) {
    
    x = (int) (Math.random() *49);   // x zieht eine Zufallszahl aus dem Array
    
    while (alleZahlen[x]==0) {                        //kam die Zahl schon vor (0), neue Ziehen bis nicht mehr 0
        x = (int) (Math.random() *49);
        }
        
    gezogeneZahlen[a]=alleZahlen[x];
    alleZahlen[x]=0;                //setzt die gezogene Zahl auf 0
    a=a+1;
    }
    
    java.util.Arrays.sort(gezogeneZahlen);        //Array gezogeneZahlen sortieren
    
    return gezogeneZahlen;
    
    }
}

class Ausfuehrung {


public static void main(String[]args){
    
Tippen t = new Tippen();
Ziehung z = new Ziehung();

for (int aa=0; aa<t.zahlenTippen().length; aa++) {
System.out.println(t.zahlenTippen()[aa]);
        }
    }
}
 

Major_Sauce

Bekanntes Mitglied
Morgen,

Ich habe mir die Klassen nun nicht angesehen, aber du sagst sie liefern schon die Richtigen arrays...
Also:
Mach einen boolean, nenn den "won" oder so, diese soll false sein.
Dann machst du eine While-loop, die checkt of "won" denn true ist...
In der Loop machst du eine Ziehung + Tippen, vergleichst ob man die Richtigen 6 getippt hat, falls ja dann ist won = true und das ding endet, sonst fängt der wieder oben an...

mfg Major
 

mastercoll5

Aktives Mitglied
Hallo,

Zur kleinen Verbesserung: du kannst das "int a" in der Klasse Ziehung entfernen, da du bereits durch die for-Schleife eine variable j hast, die automatisch hochzählt.

Also:
Java:
gezogeneZahlen[j]=alleZahlen[x];

zu deinen eigentlichen Problem: Erstmal würde ich Variablen für beide Arrays in der Hauptmethode erstellen, damit du nicht immer neue erstellst. Außerdem solltest du auch "zahlenTippen" sortieren.

Also:
Java:
import java.util.Scanner;
import java.util.Arrays;
 
class Tippen {

    public int[] zahlenTippen () {
 
        Scanner scan = new Scanner(System.in);
        int [] getippteZahlen = new int[6];
 
        for (int d=0; d<getippteZahlen.length; d++) {                //Zahlen tippen und Array befüllen
            System.out.println("Geben Sie die"+(d+1)+" . Zahl ein:");
            getippteZahlen[d]=scan.nextInt();
        }
        Arrays.sort(getippteZahlen);                                           //Sortiert nochmal die Array
        return getippteZahlen;
    }
}
 
 
class Ziehung {
 
public int[] ziehen(){
 
 
int[] alleZahlen = new int[49];
int[] gezogeneZahlen = new int[6];
int x = 0;
 
 
for(int i=0; i<49; i++) {        // Array mit 49 Zahlen erzeugen
alleZahlen[i]=i+1;
}
 
for (int j=0; j<6; j++) {
 
    x = (int) (Math.random() *49);   // x zieht eine Zufallszahl aus dem Array
 
    while (alleZahlen[x]==0) {                        //kam die Zahl schon vor (0), neue Ziehen bis nicht mehr 0
        x = (int) (Math.random() *49);
        }
 
    gezogeneZahlen[j]=alleZahlen[x];                                   //j würde deinen alten a entsprechen
    alleZahlen[x]=0;                //setzt die gezogene Zahl auf 0
    }
 
    Arrays.sort(gezogeneZahlen);        //Array gezogeneZahlen sortieren
 
    return gezogeneZahlen;
 
    }
}
 
class Ausfuehrung {
 
 
public static void main(String[]args){
 
    Tippen t = new Tippen();
    Ziehung z = new Ziehung();

    int[] tzahlen = t.zahlenTippen();                                        //speichert die Arrays local aus dem Rückgabewert der Methoden
    int[] zzahlen = z.ziehen();
 
    System.Out.Println(Arrays.toString(tzahlen));               //Gibt die Arrays aus
    System.Out.Println(Arrays.toString(zzahlen));
}
}

Jetzt kannst du noch eine Schleife einfügen die, die Arrays vergleicht. Das überlasse ich mal dir, wie du das machst ;)
 
Zuletzt bearbeitet:

Toni32

Mitglied
Ich habe jetzt mit der Array-vergleichen Schleife herumexperimenterit, aber ich bekomme es einfach nicht hin.
Arrays.equals(tZahlen, zZahlen) liefert aus irgendeinem Grund sofort True, wodurch die Schleife ja abgebrochen wird.

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


class Tippen {
    
    public static int[] zahlenTippen () {
        
    Scanner scan = new Scanner(System.in);
    int [] getippteZahlen = new int[6];
    
    for (int d=0; d<getippteZahlen.length; d++) {                //Zahlen tippen und Array befüllen
    System.out.println("Geben Sie die"+(d+1)+" . Zahl ein:");
    getippteZahlen[d]=scan.nextInt();
        }
        
    return getippteZahlen;
    }
}


class Ziehung {


public int[] ziehen(){

int[] alleZahlen = new int[49];
int[] gezogeneZahlen = new int[6];
int a = 0;                            //Indexzahl für gezogeneZahlen Array
int x = 0;


for(int i=0; i<49; i++) {        // Array mit 49 Zahlen erzeugen
alleZahlen[i]=i+1;
}


for (int j=0; j<6; j++) {
    
    x = (int) (Math.random() *49);   // x zieht eine Zufallszahl aus dem Array
    
    while (alleZahlen[x]==0) {                        //kam die Zahl schon vor (0), neue Ziehen bis nicht mehr 0
        x = (int) (Math.random() *49);
        }
        
    gezogeneZahlen[j]=alleZahlen[x];
    alleZahlen[x]=0;                //setzt die gezogene Zahl auf 0
    }
    
    java.util.Arrays.sort(gezogeneZahlen);        //Array gezogeneZahlen sortieren
        
    return gezogeneZahlen;
    
    }
}


class Ausfuehrung {

public static void main(String[]args){
    
Tippen t = new Tippen();
Ziehung z = new Ziehung();


int zZahlen[] = z.ziehen();
int tZahlen[] = t.zahlenTippen();

int counter = 1;
boolean won = false;

while (won=false) {
    
    z.ziehen();
    System.out.println(counter);
    counter++;
    
    if (Arrays.equals(tZahlen, zZahlen)) {
        won=true;
     } 
}
System.out.println ("6 RICHTIGE!");


//System.out.println(Arrays.toString(tZahlen));
//System.out.println(Arrays.toString(zZahlen));

    }
}
 

mastercoll5

Aktives Mitglied
Hallo, versuch erst mal so:

Java:
While(won == false) {
    won = true;
    tZahlen[] = t.zahlenTippen();
    for(int i = 0; i < 6; i++) {
        If(zZahlen[i] == tZahlen[i]) {
            won = false;
            break;
        }
    }
    If(won == true) System.Exit.println("6 Richtige")
}
 
Zuletzt bearbeitet:

Toni32

Mitglied
Ah, ich hab den Fehler gefunden, ich hatte ja nur ein = bei while (won=false) :noe:

Aber komischerweise klappt es weder mit Arrays.equals noch mit Deiner Methode (Vergleich in der for Schleife), er findet nie einen 6'er. Habe es jetzt mehrmals bis insgesamt ca. 80 Mio Versuchen laufen lassen. Die Wahrscheinlichkeit liegt ja bei knapp 1:14 Mio, da sollte doch mal was kommen.

Oder stimmt da irgendetwas mit den Arrays nicht? Kann nur keinen Fehler finden, wäre da noch für einen Tipp dankbar.
 

mastercoll5

Aktives Mitglied
Ich habe einen Fehler in Zeile 6 meines Codes, andere bitte das == zu !=

Außerdem funktioniert es nur, wenn du die Array in der Methode zahlenTippen vor dem return sortierst
 

mastercoll5

Aktives Mitglied
Dann natürlich nicht, du musst aber immer Personen bedenken, die selbst wenn eine sortierte Eingabe gefordert wird, sich nicht daran halten.

Du hast außerdem vergessen, t.ziehen() in eine variable zu speichern

//edit: Ich bin jetzt mit deinen classen durcheinander gekommen, es muss zZahlen[] = z.ziehen() heißen
 
Zuletzt bearbeitet:

Toni32

Mitglied
Irgendwie klappt das immer noch nicht, per Arrays.equals wie auch mit for Schleife findet er nie einen 6'er und Dein Code lässt sich nicht compilieren und wirft etliche Fehler raus. So ganz verstanden hab ich das auch noch nicht, warum wir won direkt zu Beginn der While Schleife auf true gesetzt und tZahlen nochmal t.zahlenTippen zugewiesen? Hab die 1. Zuweisung oben jetzt deshalb mal rausgenommen.

Hier nochmal die ganze main:

Java:
public static void main(String[]args){    
Tippen t = new Tippen();
Ziehung z = new Ziehung();


int zZahlen[] = z.ziehen();
int tZahlen[];


int counter = 1;
boolean won = false;


While(won == false) {
    won = true;
    tZahlen[] = t.zahlenTippen();
    for(int i = 0; i < 6; i++) {
        If(zZahlen[i] != tZahlen[i]) {
            won = false;
            break;
        }
    }
    If(won == true) {
        System.exit.println("6 Richtige");
        }


         }
    }
}
 

mastercoll5

Aktives Mitglied
Hier habe ich nochmal die Groß- und Kleinschreibung angepasst und die oben genannten Fehler behoben:

Java:
 int[] tzahlen = t.zahlenTippen();                    
	    int[] zzahlen = null;
	    int d = 0;
	    boolean won = false;
	    
	    while(won == false) {
	        won = true;
	        d++;
	        zzahlen = z.ziehen();
	        for(int i = 0; i < 6; i++) {
	            if(zzahlen[i] != tzahlen[i]) {
	                won = false;
	                break;
	            }
	        }
	        if(won == true) System.out.println("6 Richtige");
	    }
	 
	    System.out.println("Dürchläufe: " + d);
	    System.out.println(Arrays.toString(tzahlen));
	    System.out.println(Arrays.toString(zzahlen));

Jetzt zur Erklärung:
Die While-Schleife läuft so lange, bis eine Array zufällig mit der, die eingetippt ist, übereinstimmt. Am Anfang der Schleife wird won = true gesetzt, wenn dies nicht in der For-Schleife geändert wird, ist es eine gleiche Array und die Schleife wird verlassen. Der eigentliche Vergleich ist in der For-Schleife, dort werden immer die Zahlen aus beiden Array nacheinander verglichen. Wenn nur eine Zahl der 1. Array != (ungleich) der Zahl der 2. Array (vgl. Z.12) ist, wird die for-Schleife verlassen und won = false gesetzt. Darauf beginnt das ganze von vorn, jedoch mit einer neuen Arrray (vgl. Z.10).

Man könnte das ganze auch als Methode schreiben, vlt wird das dann deutlicher:

Java:
public boolean compare(int[] t, int[] z) {

    zzahlen = t.ziehen();
    for(int i = 0; i < 6; i++) {
         if(z[i] != t[i]) {
            return false;
        }
    }
    return true;
}

Java:
int[] tzahlen = t.zahlenTippen();
int[] zzahlen = z.ziehen();

while(true) {
    if(compare(tzahlen, zzahlen)) {
        System.out.println("6 Richtige!")
        break;
    } else {
        zzahlen = z.ziehen();
    }
}
 
Zuletzt bearbeitet:

Toni32

Mitglied
Ah ok, jetzt funktioniert es auch endlich, danke!

Mich würde aber noch interessieren, wieso es auf meine Art nicht klappt.

Ich habe den Verdacht, dass der eigentlich Fehler die Zuweisung zZahlen=zZiehen(); ist. Diese hatte ich nämlich noch vor der While Schleife, Du hast sie aber darin. Wenn ich das in meiner Version ändere, klappt es auch.

Warum ist es wichtig, die Zuweisung innerhalb der Schleife vorzunehmen? Wird bei Aufruf von z.ziehen() nicht jedesmal auch der "Zeiger" bzw. die Referenz, die zZahlen auf das Array hat, mit aktualisiert?

Deine Version ist allerdings auch wesentlich schneller, ich denke weil er bei einer Unstimmigkeit direkt den Vergleich abbricht und den nächsten Durchgang startet.
 

mastercoll5

Aktives Mitglied
Wenn du nur z.Ziehen() in deine Schleife schreibst, wird zZahlen nicht geändert, d.h. du vergleichst die selben Arrays in einer Endlosschleife.
 

Toni32

Mitglied
Dann hatte ich da ein Verständnisproblem, ich dachte wenn man einer Variablen einen Wert zuweist (in dem Fall ja einem Int Array das Array aus der Methode), dass dann nur eine Referenz zu diesem Wert angelegt wird und sich somit der Wert auch automatisch ändert, wenn die Methode einen neuen Array-Wert erzeugt.
 

Toni32

Mitglied
Ich habe nochmal ein wenig herumprobiert, mich mittlerweile mit ArrayList beschäftigt und eine Art Benchmark eingebaut.

Mit der 1. Methode (gezogene Zahl auf 0 setzen und in while Schleife neue ziehen, bis nicht mehr 0) sind es ca. 1,9 Mio. Versuche pro s, mit ArrayList aber nur magere 700 - 900.000 Versuche.

Ich dachte eigentlich, ArrayList müsste sogar schneller sein, weil ja Elemente nach dem Ziehen daraus entfernt werden und die Liste somit kleiner wird?

Und zu guter letzt, in Bezug auf oo Programmieren, ist die Aufteilung der Klassen und Methoden so ok oder könnte man da noch was verbessern?

Java:
import java.util.Scanner;
import java.util.Arrays;
import java.util.ArrayList;
import java.text.DecimalFormat;


class Tippen {
    
    public static int[] zahlenTippen () {
        
    Scanner scan = new Scanner(System.in);
    int [] getippteZahlen = new int[6];
    
    for (int d=0; d<getippteZahlen.length; d++) {                //Zahlen tippen und Array befüllen
    System.out.println("Geben Sie die "+(d+1)+" . Zahl ein:");
    getippteZahlen[d]=scan.nextInt();
        }
    
    java.util.Arrays.sort(getippteZahlen);
    return getippteZahlen;
    }
}

class Ziehung {


public int[] ziehen(){

int[] gezogeneZahlen = new int[6];
                
        ArrayList<Integer> liste = new ArrayList<Integer>();
        
        for (int i=1; i<=49; i++) {            //befüllt eine ArrayList mit 49 Zahlen
        liste.add(i);
        }
        
        for (int s=0; s<6; s++) {                                //befüllt das Array "gezogeneZahlen" mit 6 Zufallszahlen aus der ArrayList
            int zufallsZahl = (int) (Math.random() *liste.size());
            gezogeneZahlen[s] = liste.get(zufallsZahl);
            liste.remove(zufallsZahl);
        }
        
        java.util.Arrays.sort(gezogeneZahlen);
        
    return gezogeneZahlen;
    
    }
}

class Spiel {
    
    public void spielstarten() {
    
Tippen t = new Tippen();
Ziehung z = new Ziehung();

DecimalFormat df = new DecimalFormat();        //Klasse für Tausender-Trennzeichen

int zZahlen[] = null;
int tZahlen[] = t.zahlenTippen();

int counter = 1;
boolean won = false;

long startZeit=System.currentTimeMillis();        //Laufzeit des Programms feststellen
long endZeit;


while (won==false) {
 
    zZahlen=z.ziehen();

    counter++;
 
    if (Arrays.equals(tZahlen, zZahlen)) {
        won=true;
            } 
        }

        endZeit=System.currentTimeMillis();
        
System.out.println ("6 RICHTIGE!  Nach "+df.format(counter)+" Versuchen");
System.out.println(Arrays.toString(tZahlen));
System.out.println(Arrays.toString(zZahlen));
System.out.println (df.format(counter/((endZeit-startZeit)/1000))+" Versuche pro Sekunde");
     
    }
}

class Lotto {


public static void main(String[]args){

Spiel s = new Spiel();
s.spielstarten();

    }
}
 

TheWhiteShadow

Bekanntes Mitglied
Eine ArrayList ist ein Wrapper für ein Array und kann niemals schneller sein, als dieses. Außerdem kann eine Liste nur Integer speichern. Durch autoboxing wird jedes int in ein Integer und zum Vergleichen wieder zurück konvertiert was ne menge Zeit frißt.
Und noch was:
Die Liste wird beim entfernen zwar kleiner, aber das zugrunde liegende Array nicht, was auch egal ist, weil es bei der Größe keine Auswirkung auf die CPU-Zeit hat.


Die Aufteilung ist immer subjektiv und und jeder sieht es ein bischen anders, also hier nur meine Meinung:

Die Methoden von Tippen und Ziehung gehören in die Klasse Spiel, denn es sind Spielaktionen.
Tippen und Ziehung sollten zusammengelegt werden, da beide Klassen 6 Zahlen halten.
Zudem sollte diese den Vergleich der Zahlen in der equals-Methode implementieren.
Code:
tipp = ZahlenSet(1, 2, 3, 4, 5, 6);
ziehung= ZahlenSet(1, 2, 3, 4, 5, 6);
tipp.equals(ziehung)

mfg TWS
 

Toni32

Mitglied
Bin gerade dabei ein GUI für das Programm zu schreiben.
Dazu brauche ich ja 49 JButtons, die dann in das getippteZahlen Array die entsprechende geklickte Zahl eintragen.

Habe dabei jedoch das Problem, dass die Zuweisung mit ActionPerformed in der For Schleife (getippteZahlen=b) so nicht klappt:

Java:
JButton button[] = new JButton[49];    
    
    for (int b=0; b<49; b++) {
                
    button[b] = new JButton(""+(b+1));
    panel.add(button[b]);
    button[b].addActionListener(new ActionListener() {
        
        public void actionPerformed(ActionEvent event) {
            getippteZahlen[i]=b;
            label.setText(Arrays.toString(getippteZahlen));
            i++;
                        
        }
    });
    
    }

Kann mir jemand sagen wieso das nicht funktioniert? "b" hat doch immer den Wert, den der gerade erzeugte Button auch hat?
 

strußi

Top Contributor
nimm toggelbuttons und actions
Java:
 import java.awt.event.ActionEvent;
import javax.swing.*;

public class ButtonAction extends AbstractAction{
    String b;
    
    public ButtonAction( String name){
        super( name); //Beschriftung des Buttons
        b =name;
    }
  
    
    @Override
    public void actionPerformed(ActionEvent e){
        //ToDo
    }
}

und dann in einer schleife zuweisen
Java:
 new JToggleButton( new ButtonAction( zahl, this))
 

Toni32

Mitglied
Ich habs jetzt hinbekommen, indem ich noch ein final int als Zwischenspeicher hinzugefügt hab.

Puh, nach dem ganzen herumprobieren und unzähligen Fehlern die auftraten, bin ich jetzt durcheinander gekommen, ist das überhaupt so richtig strukturiert??
Vor allem brauche ich ja jetzt auch einen Start Button, der die ganze Ziehung nach Auswählen der Zahlen startet, aber wie mache ich das?
Und sollte die GUI nicht als separate Klasse ausschließlich für die Grafikelemente da sein? Bei mir ist jetzt alles irgendwie verwoben, da die Aufgaben der GUI und die Klasse Tippen vermischt sind. Weiß aber nicht wie ich das sauber trennen soll.

Java:
import java.util.Scanner;import java.util.Arrays;
import java.text.DecimalFormat;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;


class Tippen {
    
    int i;
            
    public int[] zahlenTippen() {
        
    int[] getippteZahlen = new int[6];
    i = 0;
        
    JFrame frame = new JFrame("LottoZiehung");
    JLabel label = new JLabel("Getippte Zahlen");
    
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(7,7));    


    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    JButton button[] = new JButton[49];
    
    JButton startButton = new JButton("Ziehung starten");
    panel.add(startButton);
    
    startButton.addActionListener(new ActionListener() {
        
        public void actionPerformed(ActionEvent event) {
        //Code zum Starten der Ziehung
        }
        
    });
    
    for (int b=0; b<49; b++) {        //49 Buttons und ActionEvents hinzufügen
        
    final int fi = b+1;
                
    button[b] = new JButton(""+(b+1));
    panel.add(button[b]);
        
    button[b].addActionListener(new ActionListener() {
        
        public void actionPerformed(ActionEvent event) {
            getippteZahlen[i]=fi;
            label.setText(Arrays.toString(getippteZahlen));
            i++;
                        
        }
    });    
    
    }                //Ende 49 Buttons hinzufügen
        
    
    frame.add(panel);
    frame.add(BorderLayout.SOUTH, startButton);
    frame.add(BorderLayout.NORTH, label);
    frame.setSize(500, 500);
    frame.setVisible(true);
        
    return getippteZahlen;
    }
}

class Ziehung {

public int[] ziehen(){


int[] alleZahlen = new int[49];
int[] gezogeneZahlen = new int[6];
int x = 0;


for(int i=0; i<49; i++) {        // Array mit 49 Zahlen erzeugen
alleZahlen[i]=i+1;
}


for (int j=0; j<6; j++) {
    
    x = (int) (Math.random() *49);   // x zieht eine Zufallszahl aus dem Array
    
    while (alleZahlen[x]==0) {                        //kam die Zahl schon vor (0), neue Ziehen bis nicht mehr 0
        x = (int) (Math.random() *49);
        }
        
    gezogeneZahlen[j]=alleZahlen[x];
    alleZahlen[x]=0;                //setzt die gezogene Zahl auf 0
    }
    
    java.util.Arrays.sort(gezogeneZahlen);        //Array gezogeneZahlen sortieren
        
    return gezogeneZahlen;
    
    }
}


class Spiel {
    
    public void spielstarten() {
    
Tippen t = new Tippen();
Ziehung z = new Ziehung();


DecimalFormat df = new DecimalFormat();        //Klasse für Tausender-Trennzeichen


int zZahlen[] = null;
int tZahlen[] = t.zahlenTippen();


int counter = 1;
boolean won = false;


long startZeit=System.currentTimeMillis();        //Laufzeit des Programms feststellen
long endZeit;


while (won==false) {
 
    zZahlen=z.ziehen();


    counter++;
 
    if (Arrays.equals(tZahlen, zZahlen)) {
        won=true;
            } 
        }
        endZeit=System.currentTimeMillis();
        
System.out.println ("6 RICHTIGE!  Nach "+df.format(counter)+" Versuchen");
System.out.println(Arrays.toString(tZahlen));
System.out.println(Arrays.toString(zZahlen));
System.out.println (df.format(counter/((endZeit-startZeit)/1000))+" Versuche pro Sekunde");
     
    }
}


class LottoGUI {


public static void main(String[]args){


Spiel s = new Spiel();
s.spielstarten();


    }
}
 

Toni32

Mitglied
Nach einer Nacht drüber schlafen hat's jetzt mit dem Start Button geklappt, irgendwann sieht man halt den Wald vor lauter Bäumen nicht mehr.

Habe die Klasse Spiel jetzt aber auch noch mit "Tippen" und der "GUI" Klasse vereint.
Irgendwie scheint mir das aber unübersichtlich und schlecht strukturiert, oder?

Und noch eine Frage, nach Klicken von "Ziehung starten" soll erstmal "Bitte warten..." erscheinen, aber label.setText("Bitte warten..."); wird einfach ignoriert, wieso?

Java:
import java.util.Scanner;
import java.util.Arrays;
import java.text.DecimalFormat;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;


class Tippen {
    
    int i = 0;
    JLabel label;
    int[] getippteZahlen = new int[6];
            
    public void zahlenTippen() {
            
        JFrame frame = new JFrame("LottoZiehung");
        label = new JLabel("Bitte 6 Zahlen tippen");
        label.setFont(new Font("Arial",Font.BOLD, 24));
    
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(7,7));    


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        JButton button[] = new JButton[49];
    
        JButton startButton = new JButton("Ziehung starten");
        startButton.setFont(new Font("Arial",Font.BOLD, 24));
        panel.add(startButton);
    
        startButton.addActionListener(new ActionListener() {
        
            public void actionPerformed(ActionEvent event) {    //StartButton beginnt Ziehung und Vergleich der Zahlen
            
                label.setText("Bitte warten...");
                Ziehung z = new Ziehung();


                DecimalFormat df = new DecimalFormat();        //Klasse für Tausender-Trennzeichen


                int zZahlen[] = null;
                int counter = 1;
                boolean won = false;


                long startZeit=System.currentTimeMillis();        //Laufzeit des Programms feststellen
                long endZeit;


                    while (won==false) {
                     zZahlen=z.ziehen();
                    counter++;
 
                    if (Arrays.equals(getippteZahlen, zZahlen)) {
                        won=true;
                        } 
                    }
    
                endZeit=System.currentTimeMillis();
                label.setText("<html><body>6 RICHTIGE! <br>  Nach "+df.format(counter)+" Versuchen<br>"+(Arrays.toString(getippteZahlen))+"<br>"+(Arrays.toString(zZahlen))+"<br>"+(df.format(counter/((endZeit-startZeit)/1000))+" Versuche pro Sekunde")+"</body></html>");

                }});
    
        for (int b=0; b<49; b++) {        //49 Buttons und ActionEvents hinzufügen
        
            final int fi = b+1;                //Zwischenspeicher
            button[b] = new JButton(""+(b+1));
            panel.add(button[b]);
            button[b].addActionListener(new ActionListener() {
        
            public void actionPerformed(ActionEvent event) {
                getippteZahlen[i]=fi;
                label.setText(Arrays.toString(getippteZahlen));
                i++;    
        }
    });    
    
    }                //Ende 49 Buttons hinzufügen
            
    frame.add(panel);
    frame.add(BorderLayout.SOUTH, startButton);
    frame.add(BorderLayout.NORTH, label);
    frame.setSize(500, 500);
    frame.setVisible(true);
        
    }
}


class Ziehung {


    public int[] ziehen(){

        int[] alleZahlen = new int[49];
        int[] gezogeneZahlen = new int[6];
        int x = 0;


            for(int i=0; i<49; i++) {        // Array mit 49 Zahlen erzeugen
            alleZahlen[i]=i+1;
            }


            for (int j=0; j<6; j++) {
    
            x = (int) (Math.random() *49);           // x zieht eine Zufallszahl aus dem Array
    
            while (alleZahlen[x]==0) {            //kam die Zahl schon vor (0), neue Ziehen bis nicht mehr 0
            x = (int) (Math.random() *49);
            }
        
            gezogeneZahlen[j]=alleZahlen[x];    // die gezogene Zahl dem Array zuweisen
            alleZahlen[x]=0;                    //setzt die gezogene Zahl auf 0
            }
    
        java.util.Arrays.sort(gezogeneZahlen);        //Array gezogeneZahlen sortieren
        return gezogeneZahlen;
    }
}


class LottoGUI {

public static void main(String[]args){

Tippen t = new Tippen();
t.zahlenTippen();

    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Erste Schritte Lottozahlen richtig generieren. Java Basics - Anfänger-Themen 12
W Lottozahlen Java Basics - Anfänger-Themen 13
J Lottozahlen Java Basics - Anfänger-Themen 129
M Java Programm: Lottozahlen Java Basics - Anfänger-Themen 4
M Lottozahlen 6 aus 49 keine doppelten Java Basics - Anfänger-Themen 5
V Lottozahlen Java Basics - Anfänger-Themen 10
C Arrays Lottozahlen Java Basics - Anfänger-Themen 29
M Lottozahlen mit grafischer Oberfläche Java Basics - Anfänger-Themen 6
Z Problem mit Lottozahlen Generator Java Basics - Anfänger-Themen 2
JeromeM90 Problem bei meinem Programm : Lottozahlen Java Basics - Anfänger-Themen 30
D Lottozahlen Java Basics - Anfänger-Themen 15
B Lottozahlen Programm!?!? Java Basics - Anfänger-Themen 3
O Ziehen im Array um einen Schritt in eine einzige beliebige Richtung Java Basics - Anfänger-Themen 5
S GUI kann im WindowBuilder nicht mehr (größer kleiner ziehen) Java Basics - Anfänger-Themen 2
I Zeichen aus String ziehen Java Basics - Anfänger-Themen 3
L Applikativer Algorithmuss Wurzel ziehen Java Basics - Anfänger-Themen 10
K Methoden "ziehen ohne zurücklegen" - Kontrollstruktur Java Basics - Anfänger-Themen 4
A Werte per Zufall aus einer Datei ziehen und in eine neue Datei schreiben Java Basics - Anfänger-Themen 9
A Karten ziehen Java Basics - Anfänger-Themen 11
T Aus object Array Double Werte ziehen Java Basics - Anfänger-Themen 10
L Randomisierung einer Liste: Ziehen ohne Zurücklegen Java Basics - Anfänger-Themen 5
K JFrame größer ziehen Java Basics - Anfänger-Themen 5
N Datentypen Wurzel aus long ziehen Java Basics - Anfänger-Themen 4
J wurzel ziehen Java Basics - Anfänger-Themen 2
J aktuellen Timestamp ziehen Java Basics - Anfänger-Themen 3
H Rechteck ziehen bei einer Application Java Basics - Anfänger-Themen 2
M Werte quadrieren und Wurzel ziehen Java Basics - Anfänger-Themen 22
R Wurzel ziehen? Java Basics - Anfänger-Themen 24
G gezeichnetes nach Fenster ziehen weg? Java Basics - Anfänger-Themen 2
7 Wurzel ziehen geht nicht :-( Java Basics - Anfänger-Themen 23
P Wurzel ziehen Java Basics - Anfänger-Themen 17
T Wurzel aus einer Double-Zahl ziehen Java Basics - Anfänger-Themen 9
U programmfrage (wurzel ziehen) Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben