Endlosschleife

Status
Nicht offen für weitere Antworten.

Antoras

Top Contributor
Hi,

hab ein Problem mit meiner do-while-Schleife:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Zahlenspiel extends JApplet{
	private int counter = 0, zahl, zufall;
	
	private JTextField tf = new JTextField(8);
	private JLabel lb1 = new JLabel("Zahl zwischen 1 und 100 eingeben");
	private JLabel lb2 = new JLabel("");
	private JLabel lb3 = new JLabel("");	
	
	public Zahlenspiel(){	
		setLayout(new FlowLayout());	
		JButton b = new JButton("Prüfen");
		b.addActionListener(new ActionListener(){
        	public void actionPerformed(ActionEvent e){
        		pruefen();
        	}
		});
		add(lb1);
		add(tf);
		add(b);
		add(lb2);
		add(lb3);
		zufall = (int)(99*Math.random()+1);
	}	
	public void pruefen(){		
		System.out.println(""+zufall);
		do{
			zahl = Integer.parseInt(tf.getText());
			counter = counter++;
			lb2.setText(""+counter);
			if(zahl < zufall){
				lb3.setText("Zufallszahl ist größer");
			}else if(zahl > zufall){
				lb3.setText("Zufallszahl ist kleiner");
			 }else{
			 	lb3.setText("Zufallszahl ist gleich");	
			  }	 					
		}
		while(zahl == zufall);
	}
}
Das Problem ist, dass ich jetzt eine Endlosschleife hab. Erst wenn die eingegebene Zahl gleich der Zufallszahl ist ist das Programm zu Ende. Wie sage ich der Schleife, dass sie nach jedem Durchlauf auf eine neue Eingabe warten soll?

Zweites Problem: Der Counter geht nicht. Es wird nach jedem Durchlauf nur eine 0 angezeigt (wenn man den befehl der Zufallszahl in die pruefen-Methode schreibt).
 

Antoras

Top Contributor
Ah ja, jetzt geht es. Danke dir!

Hatte am Anfang nur eine Methode, da hab ich die Schleife gebraucht, aber so ist es natürlich tausendmal besser.
 

SchonWiederFred

Bekanntes Mitglied
parabool hat gesagt.:
Schreibe nur counter++ oder counter=counter+1 (Langform)
Diese beiden Ausdrücke sind nicht exakt gleich. Die Abkürzung für x=x+1 ist ++x, nicht x++. Die Semantik von x++ verstehen 90% der Programmieranfänger nicht.

(Sofern diese Ausdrücke nicht in größere Ausdrücke eingebettet sind, macht es aber keinen Unterschied.)
 

parabool

Bekanntes Mitglied
ja Postfix und Präfix. Hab nicht darauf geachtet
In dem Zusammenhang war's auch egal.

Aber hast natürlich recht. Man sollte präzise sein.

mmh...Programmieranfänger ? ... :shock:
 

Antoras

Top Contributor
Mir egal ob das x++ oder ++x heißt. Mal solange wie der Unterschied für mich nicht von Bedeutung ist.


Ich hätte da aber gerade nochmal ein Problem mit einer Endlosschleife:

Ich hab Textfelder eines "Magischen Quadrates" mit 2 Schleifen erstellt. Ich möchte, dass der Inhalt waagrecht und senkrecht immer 15 ergibt. So weit so gut. Weiter möchte ich, dass die Zahlen in den Textfelder solange gemischt werden bis dies eben auf alle Reihen (6Stück) zutrifft.

Code:
private void mischen(){
       prüffinal = false;
       //Mischen der Zahlen
       do{
           for (int i=0; i<yway; i++){
               for (int j=0; j<xway; j++){
                   int zufalli = (int)(yway*Math.random());
                   int zufallj = (int)(xway*Math.random());
                   int blubb = zahlen[zufalli][zufallj];
                   zahlen[zufalli][zufallj] = zahlen[i][j];
                   zahlen[i][j] = blubb;
               }
           }
           for (int i=0; i<yway; i++){
               for (int j=0; j<xway; j++){
                   tf[i][j].setText(String.valueOf(zahlen[i][j]));
               }
           }
           //Überprüfung der Zahlen
           for (int i=0; i<yway; i++){
               for (int j=0; j<xway; j++){
                   summe[i] += zahlen[i][j];
                   prüf = summe[i];
               }
           }
           for (int i=0; i<xway; i++){
               for (int j=0; j<yway; j++){
                   summe[i+yway] += zahlen[j][i];
                   prüfnochmal = summe[i+yway];
               }
           }
           for (int i=0; i<summe.length; i++){
               lb[i].setText(String.valueOf(summe[i]));
           }
           if((prüf == 15) && (prüfnochmal == 15)){
              prüffinal = true;
           }               
       }
       while(!prüffinal);
    }
prüffinal ist ein boolean-Wert, die anderen beiden prüf sind int-Werte.

Ich weiß wo der Fehler liegt (glaube ich): prüf und prüfnochmal können nie 15 sein, da sie ja die Schleifen sind, die insgesamt 9 Textfelder zusammenzählen.
Am Anfang hab ich die Werte der Arrays alle einzeln zusammengezählt (also prüf=array[0]+array[1]...). Das war mir jedoch zu umständlich.
Gibt es da eine andere Möglichkeit wie man immer nur 3 Felder zusammenzählt, oder kann man das die alle nur so umständlich zusammenzählen?

Hier noch die komplette Klasse:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MagischesQuadrat extends JApplet{
    private JTextField tf[][];
    private JLabel lb[];
    
    private int xway = 3, yway = 3, zahlen[][], summe[];
    boolean prüffinal;
    int prüf, prüfnochmal;

    public MagischesQuadrat(){
        getContentPane().setLayout(new BorderLayout());
        JPanel p = new JPanel(new FlowLayout());
        JButton b = new JButton("Start");
        b.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent e){
                erstellen();
            }
        });
        p.add(b);
        b = new JButton("Mischen");
        b.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                mischen();
            }
        });
        p.add(b);
        b = new JButton("Prüfen");
        b.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                prüfen();
            }
        });
        p.add(b);
        getContentPane().add(p, BorderLayout.NORTH);

        zahlen = new int[yway][xway];
        tf = new JTextField[yway][xway];
        p = new JPanel(new GridLayout(yway, xway));
        for (int i=0; i<yway; i++){
            for (int j=0; j<xway; j++){
                tf[i][j] = new JTextField();
                p.add(tf[i][j]);
            }
        }
        getContentPane().add(p, BorderLayout.CENTER);

        summe = new int[yway + xway];
        lb = new JLabel[yway + xway];
        p = new JPanel(new GridLayout(1, yway + xway));
        for (int i=0; i<yway+xway; i++){
            lb[i] = new JLabel(" ");
            p.add(lb[i]);
        }
        getContentPane().add(p, BorderLayout.SOUTH);
    }
    private void erstellen(){
        int counter = 1;
        
        for (int i=0; i<yway; i++){
            for (int j=0; j<xway; j++){
               zahlen[i][j] = counter++;
                tf[i][j].setText(String.valueOf(zahlen[i][j]));
            }
        }        
    }
    private void mischen(){
       prüffinal = false;
       //Mischen der Zahlen
       do{
           for (int i=0; i<yway; i++){
               for (int j=0; j<xway; j++){
                   int zufalli = (int)(yway*Math.random());
                   int zufallj = (int)(xway*Math.random());
                   int blubb = zahlen[zufalli][zufallj];
                   zahlen[zufalli][zufallj] = zahlen[i][j];
                   zahlen[i][j] = blubb;
               }
           }
           for (int i=0; i<yway; i++){
               for (int j=0; j<xway; j++){
                   tf[i][j].setText(String.valueOf(zahlen[i][j]));
               }
           }
           //Überprüfung der Zahlen
           for (int i=0; i<yway; i++){
               for (int j=0; j<xway; j++){
                   summe[i] += zahlen[i][j];
                   prüf = summe[i];
               }
           }
           for (int i=0; i<xway; i++){
               for (int j=0; j<yway; j++){
                   summe[i+yway] += zahlen[j][i];
                   prüfnochmal = summe[i+yway];
               }
           }
           for (int i=0; i<summe.length; i++){
               lb[i].setText(String.valueOf(summe[i]));
           }
           if((prüf == 15) && (prüfnochmal == 15)){
              prüffinal = true;
           }               
       }
       while(!prüffinal);
    }
    private void prüfen(){
       /*test = false;  
       
           for (int i=0; i<yway; i++){
               for (int j=0; j<xway; j++){
                   summe[i] += zahlen[i][j];
                   test1 = summe[i] == 15;
               }
           }
           for (int i=0; i<xway; i++){
               for (int j=0; j<yway; j++){
                   summe[i+yway] += zahlen[j][i];
                   test2 = summe[i+yway] == 15;
               }
           }
           for (int i=0; i<summe.length; i++){
               lb[i].setText(String.valueOf(summe[i]));
           }*/
    }
}
 

Antoras

Top Contributor
/push

Falls ich das Problem nicht richtig beschrieben habe:
Felder eines Arrays sollen addiert und die Summe soll verglichen werden. Arrays kann man ja mit array[0]+array[1]+array[3]... addieren. Ich suche aber nach einer Möglichkeit wie man das "einfacher" machen kann.
Dies soll aber auch möglich sein wenn man das Array mit einer Doppelschleife erstellt werden. Das führt nämlich dazu, das Felder waggrecht/senkrecht nebeneinander angeordnet werden. Deren Inhalt möchte ich zusammenzählen, allerdings nicht alle Felder, sondern immer nur die Felder von Spalte 1, Spalte 2, ... und Zeile 1, Zeile 2, ...

Geht das irgendwie?
 
G

Guest

Gast
Bei magischen Quadraten zählen aber auch die Diagonalen oder ?

kopier mal das in deinen code rein:

Code:
private void mischen() {
		prüffinal = false;
		// Mischen der Zahlen
		new Thread() {
			public void run() {

				do {
					for (int i = 0; i < yway; i++) {
						for (int j = 0; j < xway; j++) {
							int zufalli = (int) (yway * Math.random());
							int zufallj = (int) (xway * Math.random());
							int blubb = zahlen[zufalli][zufallj];
							zahlen[zufalli][zufallj] = zahlen[i][j];
							zahlen[i][j] = blubb;
								
						}
					}
					for (int i = 0; i < yway; i++) {
						for (int j = 0; j < xway; j++) {

							tf[i][j].setText(String.valueOf(zahlen[i][j]));
						}
					}

					prüffinal = isMagic(15);
				} while (!prüffinal);
			}
		}.start();
	}

	private boolean isMagic(int summe) {
		boolean magic = true;
		
		for (int x = 0; x < zahlen.length; x++) {
			int[] erg = summen(x);
			if (erg[0] != summe || erg[1] != summe) {
				magic = false;
				break;
			}
		}

		return magic;
	}

	private int[] summen(int j) {
		int summereihe = 0;
		int summespalte = 0;

		for (int i = 0; i < zahlen.length; i++) {
			summereihe += zahlen[i][j];
			summespalte += zahlen[j][i];
		}

		int[] summen = { summereihe, summespalte };
		return summen;
	}


nicht besonders schön, aber schnell und effizient , denke ich.
Um diene Schleife in mischen() habe ich noch einen Thread gelegt (kannst beim mischen zuschauen, und Oberfläche ist nicht blockert...)

Swingworker könnte man noch um Textfeldaktualisierung legen, geht aber auch so.

Gruss
p
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Hilfe bei Endlosschleife Java Basics - Anfänger-Themen 2
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
noah1407 endlosschleife Java Basics - Anfänger-Themen 7
G Endlosschleife keine Rückgabe Java Basics - Anfänger-Themen 36
sserio Endlosschleife ja nein? Java Basics - Anfänger-Themen 13
javapingu Endlosschleife bei User Input mit try Scanner Java Basics - Anfänger-Themen 7
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
O Endlosschleife abbrechen Java Basics - Anfänger-Themen 10
S Endlosschleife beim Ausgeben einer LinkedList Java Basics - Anfänger-Themen 2
S Interpreter-Fehler Endlosschleife zur Laufzeit aber warum? Java Basics - Anfänger-Themen 15
T Erste Schritte Endlosschleife & wozu braucht man /* und */ Java Basics - Anfänger-Themen 19
J Endlosschleife bei Try-Catch? Java Basics - Anfänger-Themen 3
S Endlosschleife - Warum? Java Basics - Anfänger-Themen 1
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
C Collatzfolge endlosschleife. Java Basics - Anfänger-Themen 4
D Array in Endlosschleife überschreibt vorherige Werte Java Basics - Anfänger-Themen 4
E Eulersche Zahl berechnen, Endlosschleife Java Basics - Anfänger-Themen 2
N Endlosschleife... Warum? Java Basics - Anfänger-Themen 12
P Kapselung Problem - Endlosschleife Java Basics - Anfänger-Themen 10
M Endlosschleife bricht durch switch ab Java Basics - Anfänger-Themen 17
D Endlosschleife und ich komme nicht raus! Java Basics - Anfänger-Themen 8
N Erste Schritte Endlosschleife und Exception Java Basics - Anfänger-Themen 5
R Endlosschleife nach InputMismatchException Java Basics - Anfänger-Themen 2
S Endlosschleife? Java Basics - Anfänger-Themen 2
T Endlosschleife Java Basics - Anfänger-Themen 2
Z Endlosschleife Java Basics - Anfänger-Themen 6
T Endlosschleife Java Basics - Anfänger-Themen 12
H Wieso ist das eine Endlosschleife? Java Basics - Anfänger-Themen 8
StupidAttack Endlosschleife, Sockets Java Basics - Anfänger-Themen 2
C ungewollte Abbrüche in einer Endlosschleife Java Basics - Anfänger-Themen 6
E komische endlosschleife Java Basics - Anfänger-Themen 6
7 Endlosschleife pausieren Java Basics - Anfänger-Themen 11
F .readLine() erzeugt endlosschleife Java Basics - Anfänger-Themen 4
R Wieso hänge ich hier in einer Endlosschleife (vermute ich zumindest)? Java Basics - Anfänger-Themen 2
F Falscheingabe abfangen - Endlosschleife Java Basics - Anfänger-Themen 5
R warum endlosschleife? Java Basics - Anfänger-Themen 7
W Fakultät, warum Endlosschleife? Java Basics - Anfänger-Themen 15
S JTable Endlosschleife Java Basics - Anfänger-Themen 5
J Aus endlosschleife kommen Java Basics - Anfänger-Themen 5
R Endlosschleife verhindert das Schließen des Fensters Java Basics - Anfänger-Themen 10
Povlsen84 Endlosschleife Java Basics - Anfänger-Themen 5
V Bubble Sort endet in Endlosschleife Java Basics - Anfänger-Themen 4
J Wartezustand in Endlosschleife - bessere Alternativen Java Basics - Anfänger-Themen 20
H Problem beim Einlesen einer Datei (Endlosschleife ?) Java Basics - Anfänger-Themen 3
N Endlosschleife? Java Basics - Anfänger-Themen 3
V mehrere Threads starten + Endlosschleife Java Basics - Anfänger-Themen 3
I Hilfe wer findet mein Fehler in bei der Endlosschleife Java Basics - Anfänger-Themen 7
G Sound/Endlosschleife/Abbruchproblem Java Basics - Anfänger-Themen 3
G HappyNumbers - Endlosschleife Java Basics - Anfänger-Themen 11
0 Endlosschleife beim Integer Array mischen? Java Basics - Anfänger-Themen 3
M OutputStream funktioniert nur in Endlosschleife ? Java Basics - Anfänger-Themen 4
G Endlosschleife, aber warum? Java Basics - Anfänger-Themen 12
G Endlosschleife beenden Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben