Loop

iman

Aktives Mitglied
hallo ich habe einen Problem bei meinem Code.
ich will Das Programm abfragen,ob Benutzer neustart will oder nicht. kann jemand mir helfen?
Das Fehler befindet sich in 17 linie.
danke schöne

Java:
package test;

import java.util.Scanner;

public class Test {

    public static void main(String[] args) {

        boolean restart = false;

        do {

            Eingeben zahl = new Eingeben();
            zahl.erst(args);
            System.out.println("Möchten Sie nocheinmal spielen? ja/nein ");
            Scanner inp = new Scanner(System.in);
            String user = inp.nextLine();
            if (user == "ja") {
                restart = false;
            } else {
                restart = true;
            }
            inp.close();
        } while (restart);
        System.out.println("Aufwiedersehen");
    }
}
 
Zuletzt bearbeitet von einem Moderator:

temi

Top Contributor
Verwende bitte Code-Tags!

Java:
package test;

import java.util.Scanner;

public class Test {

public static void main(String[] args) {

boolean restart = false;

do {

Eingeben zahl = new Eingeben();
zahl.erst(args);
System.out.println("Möchten Sie nocheinmal spielen? ja/nein ");
Scanner inp = new Scanner(System.in);
String user = inp.nextLine();
if (user == "ja") {
restart = false;
} else {
restart = true;
}
inp.close();
} while (restart);
System.out.println("Aufwiedersehen");
}
}

Strings werden mit "equals()" verglichen!
 

Robat

Top Contributor
Abgesehen davon schließt du mit inp.close() auch den darunterliegenden Inputstream. (In deinem Fall die Standardeingabe). Beim zweiten Durchlauf kannst du dann keine Eingabe mehr tätigen. Leg dir einen Scanner für deine main Methode an und nicht bei jedem Schleifendurchlauf einen neuen. Schließen musst du den Scanner eigentlich nicht. Wenn du es machen willst dann am Ende deiner main Methode.
 

iman

Aktives Mitglied
Abgesehen davon schließt du mit inp.close() auch den darunterliegenden Inputstream. (In deinem Fall die Standardeingabe). Beim zweiten Durchlauf kannst du dann keine Eingabe mehr tätigen. Leg dir einen Scanner für deine main Methode an und nicht bei jedem Schleifendurchlauf einen neuen. Schließen musst du den Scanner eigentlich nicht. Wenn du es machen willst dann am Ende deiner main Methode.


Das war meine erste Frage . Ab nächste schreibe ich meine Code in richtige Platz. mit equals habe ich schon probiert aber nicht geklapt.
 

iman

Aktives Mitglied
Was heißt das genau??
Wie sah Dein Code dazu aus?

Ohne genauere Infos wird das nix ;)

VG Klaus


Es ist eine Lotto Spiel. Das Spiel funktioniert korrekt, ich habe das Spiel in einem eigene Class geschrieben. Am ende in main will ich es fragen, ob die Benutzer nochmal spielen möchtet oder nicht.
Wie kann ich meine Main restarten???
ich habe in beide Class von Scanner schon benutzt. ich glaube es ist die erste meine Fehler.
 

MoxxiManagarm

Top Contributor
Ein paar sachen Sachen, die du dir gleich angewöhnen solltest:
- benenne alles Englisch, nicht so ein Mischmasch
- noch kräftigere Benennungen, 'input' ist besser als 'inp'
- Verkürzung solcher Konstrukte:
Java:
// dein Code
if (user == "ja") {
  restart = false;
} else {
  restart = true;
}

// als Einzeiler und mit equals fix
restart = user.equals("ja");
- Autoclosable
Java:
// dein code
Scanner inp = new Scanner(System.in);
// ...
inp.close();

// Autocloseable
try(Scanner inp = new Scanner(System.in);) {
  // ....
}
 

iman

Aktives Mitglied
Mal ganz abgesehen davon ...
Wenn der User sagt "Ja, ich möchte nochmal spielen", dann würdest Du 'restart' auf FALSE setzen und Deine While-Schleife (und somit das Programm) beenden!! :oops:

VG Klaus

ich möchte
wenn der User sagt "ja" , dann restart auf FALSE setzen und do schleife nochmal wiederholen.
wenn der User sagt "nein", dann restart auf TRUE setzen und while schleife anfangen.

danke für eure Tipps.
 

VfL_Freak

Top Contributor
ich möchte
wenn der User sagt "ja" , dann restart auf FALSE setzen und do schleife nochmal wiederholen.
wenn der User sagt "nein", dann restart auf TRUE setzen und while schleife anfangen.
das verstehe ich nicht ..... :rolleyes:

Wenn der User sagt "Ja, ich möchte nochmal spielen", dann musst Du 'restart' auf TRUE setzen, damit Deine While-Schleife (und somit das Programm) weiter durchlaufen wird!! Du setzt 'restart' aber auf FALSE, somit werden Schleife und Programm beendet!

VG Klaus
 

iman

Aktives Mitglied
Hier ist meine Eingeben Class und die erste Code ist mein Main.
Wie kann ich am ende Programm von der User Frage ob möchtet noch einmal Spielen?
wenn ja wiederholt den Programm wenn nein beendet die Programm.


Java:
package test;

import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Random;

public class Eingeben {
    
    private Scanner scannerVariable;

    public void erst(String[] args) {

        int token = 1;
        int counter = 0;
        int userzahl = 0;
        int[] benutzer = new int[6];
        Random random = new Random();
        List<Integer> candidates = new ArrayList<Integer>();
        
        for (int i = 1; i < 50; i++) {
            candidates.add(i);
        }
        int[] numbers = new int[6];
        for (int i = 0; i < numbers.length; i++) {
            int candidateIndex = random.nextInt(candidates.size());
            numbers[i] = (int) candidates.get(candidateIndex);
            candidates.remove(candidateIndex);
        }
        // System.out.println(Arrays.toString(numbers));
        System.out.println("Bitte geben Sie sechs Zahlen ein.");
        Scanner scannerVariable = new Scanner(System.in);
        while (userzahl < 6) {
            boolean found = false;
            boolean dezimal = false;

            if (token == 1) {
                System.out.println("Bitte geben Sie die erste Zahl ein:");
            } else if (token == 2) {
                System.out.println("Bitte geben Sie die zweite Zahl ein:");
            } else if (token == 3) {
                System.out.println("Bitte geben Sie die dritte Zahl ein:");
            } else if (token == 4) {
                System.out.println("Bitte geben Sie die vierte Zahl ein:");
            } else if (token == 5) {
                System.out.println("Bitte geben Sie die fünfte Zahl ein:");
            } else if (token == 6) {
                System.out.println("Bitte geben Sie die sechste Zahl ein:");
            }

            try {
                String input = scannerVariable.next();
                benutzer[userzahl] = Integer.parseInt(input);

            } catch (NumberFormatException e) {
                dezimal = true;
            }
            for (int i = 0; i < userzahl; i++) {
                if (benutzer[userzahl] == benutzer[i]) {
                    found = true;
                    break;
                }
            }

            if (dezimal) {
                System.out.println("Die Zahl passt nicht, weil sie eine Dezimalzahl ist.");
            } else if (benutzer[userzahl] > 49) {
                System.out.println("Die Zahl passt nicht,weil sie größer als 49 ist.");
            } else if (benutzer[userzahl] <= 0) {
                System.out.println("Die Zahl passt nicht, weil sie kleiner als 1 ist.");
            } else if (found) {
                System.out.println("Sie haben diese Zahl schon gewählt.");
            } else {
                userzahl++;
                token++;
            }
        }

        for (int i = 0; i < benutzer.length; i++) {
            for (int j = 0; j < numbers.length; j++) {
                if (benutzer[i] == numbers[j]) {
                    counter++;
                }
            }
        }
        if (counter < 3) {
            System.out.println("Sie haben " + counter + " korrekte Zahl. Sie haben nichts gewonnen.");
        } else if (counter == 3) {
            System.out.println("Sie haben " + counter + " korrekte Zahl. Sie haben 1000 € gewonnen.");
        } else if (counter == 4) {
            System.out.println("Sie haben " + counter + " korrekte Zahl. Sie haben 3000 € gewonnen.");
        } else if (counter == 5) {
            System.out.println("Sie haben " + counter + " korrekte Zahl. Sie haben 5000 € gewonnen.");
        } else {
            System.out.println("Sie haben " + counter + " korrekte Zahl. Sie haben 10000 € gewonnen.");
        }
        System.out.println(Arrays.toString(numbers));
        scannerVariable.close();
    }
}
 

VfL_Freak

Top Contributor
Nochmal: das Wiederholen macht die While-Schleife!!
Und Du hast das grundlegend schon richtig drin, nur der Vergleich ist falsch (siehe oben) und ebenso wird 'restart' stets der falsche Wert zugewiesen!

Wenn der User sagt "Ja, ich möchte nochmal spielen", dann musst Du 'restart' auf TRUE setzen, damit Deine While-Schleife (und somit das Programm) weiter durchlaufen wird!! Du setzt 'restart' aber auf FALSE, somit werden Schleife und Programm beendet!
Sorry, noch deutlicher kann ich es nicht ausdrücken!
 

mihe7

Top Contributor
ich bin Anfänger. tut mir leid dass ich nicht verstehe :(:(:(:(.
Wenn Du dran bleibst, kommt das schon noch.

Fangen wir mal ganz einfach an, wir wollen ein Spiel haben:
Java:
public class Spiel {
}

Wie soll das Spiel ablaufen?
1. Der Spieler spielt eine Runde
2. So lange der Spiele eine neue Runde spielen möchte, beginnen wir wieder von vorne.

Java:
public void spiele() {
    do {
        spieleRunde();
    } while (weiterSpielen());
}

weiterSpielen() entscheidet, ob weitergespielt wird (falls weiterSpielen() true liefert) oder nicht. D. h. in weiterSpielen() fragen wir einfach mal den Benutzer:

Java:
boolean weiterSpielen() {
    String antwort = frageBenutzer("Noch eine Runde (j/n)? ");
    return "j".equals(antwort);
}

Gut, frageBenutzer soll eine Meldung ausgeben, eine Eingabe vom Benutzer einlesen und diese als Antwort zurückgeben. Zum Einlesen verwenden wir einen Scanner, das entsprechende Feld "scanner" legen wir uns in der Spiel-Klasse an und fügen außerdem die Methode hinzu:
Java:
String frageBenutzer(String frage) {
    System.out.print(frage);
    return scanner.nextLine();   
}

Was macht spieleRunde()? Naja, das, was Du bereits hast: eine Runde Lotto spielen. Das könnte man aber auch etwas anders darstellen. Wenn wir uns mal an der Realität orientieren, dann gibt der Benutzer ja seinen Tipp vor der Ziehung ab, also etwa

1. Frage Benutzer nach 6 Zahlen
2. Ermittle zufällig 6 aus 49
3. Werte das Ergebnis aus

Java:
void spieleRunde() {
    int[] tipp = liesLottoschein();
    int[] ziehung = ermittleGewinnzahlen();
    werteAus(tipp, ziehung);    
}

int[] liesLottoschein() {
    int[] tipp = new int[6];
    for (int i = 0; i < tipp.length; i++) {
        tipp[i] = frageNachTipp(i);
    }
    return tipp;
}

Java:
private static final String[] REIHE = {
    "erste", "zweite", "dritte", "vierte", "fünfte", "sechste"
};

int frageNachTipp(int n) {
    System.out.printf("Bitte geben Sie die %s Zahl ein: ", REIHE[n]);
    int tipp = 0;
    do {
        try {
             tipp = scanner.nextInt();
        } catch (NumberFormatException ex) {
             // Ignorieren
        }
       if (tipp < 1 || tipp > 49) {
             System.out.println("Bitte nur ganze Zahlen zwischen 1 und 49 eingeben.");
       }
    } while (tipp < 1 || tipp > 49);
    return tipp;    
}
Natürlich kannst Du die Antworten schöner ausgestalten.

Den Rest überlasse ich Dir :)
 

MoxxiManagarm

Top Contributor
Kleiner Tipp von mir, ich mag viele if's nicht ;-)

Java:
// could be a constant somewhere
TreeMap<Integer, String> priceTable = new TreeMap<>();
priceTable.put(0, "nichts");
priceTable.put(3, "1000 €");
priceTable.put(4, "3000 €");
priceTable.put(5, "5000 €");
priceTable.put(6, "10000 €");

System.out.println("Sie haben " + counter + " korrekte Zahl. Sie haben " + priceTable.floorEntry(counter).getValue() + " gewonnen.");

// und zuvor falls das ausgeschriebene Zahlwort nicht notwendig ist:
System.out.println("Bitte geben Sie die " + token + ". Zahl ein:");
 

iman

Aktives Mitglied
Kleiner Tipp von mir, ich mag viele if's nicht ;-)

Java:
// could be a constant somewhere
TreeMap<Integer, String> priceTable = new TreeMap<>();
priceTable.put(0, "nichts");
priceTable.put(3, "1000 €");
priceTable.put(4, "3000 €");
priceTable.put(5, "5000 €");
priceTable.put(6, "10000 €");

System.out.println("Sie haben " + counter + " korrekte Zahl. Sie haben " + priceTable.floorEntry(counter).getValue() + " gewonnen.");

// und zuvor falls das ausgeschriebene Zahlwort nicht notwendig ist:
System.out.println("Bitte geben Sie die " + token + ". Zahl ein:");


danke , Ja es ist besser glaube ich. ich habe bis jetzt Treemap nicht gesehen. Heute habe ich etwas zu recherchieren.
 

iman

Aktives Mitglied
Wenn Du dran bleibst, kommt das schon noch.

Fangen wir mal ganz einfach an, wir wollen ein Spiel haben:
Java:
public class Spiel {
}

Wie soll das Spiel ablaufen?
1. Der Spieler spielt eine Runde
2. So lange der Spiele eine neue Runde spielen möchte, beginnen wir wieder von vorne.

Java:
public void spiele() {
    do {
        spieleRunde();
    } while (weiterSpielen());
}

weiterSpielen() entscheidet, ob weitergespielt wird (falls weiterSpielen() true liefert) oder nicht. D. h. in weiterSpielen() fragen wir einfach mal den Benutzer:

Java:
boolean weiterSpielen() {
    String antwort = frageBenutzer("Noch eine Runde (j/n)? ");
    return "j".equals(antwort);
}

Gut, frageBenutzer soll eine Meldung ausgeben, eine Eingabe vom Benutzer einlesen und diese als Antwort zurückgeben. Zum Einlesen verwenden wir einen Scanner, das entsprechende Feld "scanner" legen wir uns in der Spiel-Klasse an und fügen außerdem die Methode hinzu:
Java:
String frageBenutzer(String frage) {
    System.out.print(frage);
    return scanner.nextLine();  
}

Was macht spieleRunde()? Naja, das, was Du bereits hast: eine Runde Lotto spielen. Das könnte man aber auch etwas anders darstellen. Wenn wir uns mal an der Realität orientieren, dann gibt der Benutzer ja seinen Tipp vor der Ziehung ab, also etwa

1. Frage Benutzer nach 6 Zahlen
2. Ermittle zufällig 6 aus 49
3. Werte das Ergebnis aus

Java:
void spieleRunde() {
    int[] tipp = liesLottoschein();
    int[] ziehung = ermittleGewinnzahlen();
    werteAus(tipp, ziehung);   
}

int[] liesLottoschein() {
    int[] tipp = new int[6];
    for (int i = 0; i < tipp.length; i++) {
        tipp[i] = frageNachTipp(i);
    }
    return tipp;
}

Java:
private static final String[] REIHE = {
    "erste", "zweite", "dritte", "vierte", "fünfte", "sechste"
};

int frageNachTipp(int n) {
    System.out.printf("Bitte geben Sie die %s Zahl ein: ", REIHE[n]);
    int tipp = 0;
    do {
        try {
             tipp = scanner.nextInt();
        } catch (NumberFormatException ex) {
             // Ignorieren
        }
       if (tipp < 1 || tipp > 49) {
             System.out.println("Bitte nur ganze Zahlen zwischen 1 und 49 eingeben.");
       }
    } while (tipp < 1 || tipp > 49);
    return tipp;   
}
Natürlich kannst Du die Antworten schöner ausgestalten.

Den Rest überlasse ich Dir :)


danke ich versuche es zu machen .
 

iman

Aktives Mitglied
Wenn Du dran bleibst, kommt das schon noch.

Fangen wir mal ganz einfach an, wir wollen ein Spiel haben:
Java:
public class Spiel {
}

Wie soll das Spiel ablaufen?
1. Der Spieler spielt eine Runde
2. So lange der Spiele eine neue Runde spielen möchte, beginnen wir wieder von vorne.

Java:
public void spiele() {
    do {
        spieleRunde();
    } while (weiterSpielen());
}

weiterSpielen() entscheidet, ob weitergespielt wird (falls weiterSpielen() true liefert) oder nicht. D. h. in weiterSpielen() fragen wir einfach mal den Benutzer:

Java:
boolean weiterSpielen() {
    String antwort = frageBenutzer("Noch eine Runde (j/n)? ");
    return "j".equals(antwort);
}

Gut, frageBenutzer soll eine Meldung ausgeben, eine Eingabe vom Benutzer einlesen und diese als Antwort zurückgeben. Zum Einlesen verwenden wir einen Scanner, das entsprechende Feld "scanner" legen wir uns in der Spiel-Klasse an und fügen außerdem die Methode hinzu:
Java:
String frageBenutzer(String frage) {
    System.out.print(frage);
    return scanner.nextLine();  
}

Was macht spieleRunde()? Naja, das, was Du bereits hast: eine Runde Lotto spielen. Das könnte man aber auch etwas anders darstellen. Wenn wir uns mal an der Realität orientieren, dann gibt der Benutzer ja seinen Tipp vor der Ziehung ab, also etwa

1. Frage Benutzer nach 6 Zahlen
2. Ermittle zufällig 6 aus 49
3. Werte das Ergebnis aus

Java:
void spieleRunde() {
    int[] tipp = liesLottoschein();
    int[] ziehung = ermittleGewinnzahlen();
    werteAus(tipp, ziehung);   
}

int[] liesLottoschein() {
    int[] tipp = new int[6];
    for (int i = 0; i < tipp.length; i++) {
        tipp[i] = frageNachTipp(i);
    }
    return tipp;
}

Java:
private static final String[] REIHE = {
    "erste", "zweite", "dritte", "vierte", "fünfte", "sechste"
};

int frageNachTipp(int n) {
    System.out.printf("Bitte geben Sie die %s Zahl ein: ", REIHE[n]);
    int tipp = 0;
    do {
        try {
             tipp = scanner.nextInt();
        } catch (NumberFormatException ex) {
             // Ignorieren
        }
       if (tipp < 1 || tipp > 49) {
             System.out.println("Bitte nur ganze Zahlen zwischen 1 und 49 eingeben.");
       }
    } while (tipp < 1 || tipp > 49);
    return tipp;   
}
Natürlich kannst Du die Antworten schöner ausgestalten.

Den Rest überlasse ich Dir :)


Endlich habe ich den Lotto Spiel fertig gemacht. Danke für eure Hilfe.
 

iman

Aktives Mitglied
Nochmal: das Wiederholen macht die While-Schleife!!
Und Du hast das grundlegend schon richtig drin, nur der Vergleich ist falsch (siehe oben) und ebenso wird 'restart' stets der falsche Wert zugewiesen!


Sorry, noch deutlicher kann ich es nicht ausdrücken!

Endlich habe ich den Lotto Spiel fertig gemacht. Danke für eure Hilfe.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ranger229 Endless loop in while Schleife Java Basics - Anfänger-Themen 3
P Best Practice While loop schleife Java Basics - Anfänger-Themen 5
I Scanner Loop Java Basics - Anfänger-Themen 1
J Erste Schritte Unendlichen Loop stoppen Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
L loop für Namen Java Basics - Anfänger-Themen 11
D NullPointerException in foreach loop Java Basics - Anfänger-Themen 1
CT9288 Permanent laufender loop mit Eingabefunktion gesucht Java Basics - Anfänger-Themen 1
P for-loop Java Basics - Anfänger-Themen 10
B Verwirrender Game Loop Java Basics - Anfänger-Themen 6
W While-Loop unterbrechen Java Basics - Anfänger-Themen 4
I TextField Array mit for Loop erzeugen Java Basics - Anfänger-Themen 4
D Was ist Loop: ? Java Basics - Anfänger-Themen 13
Zeekay Development Erste Schritte Spitzen via For-Loop Java Basics - Anfänger-Themen 4
E Wenn i (for-Loop) bestimmter Wert, dann neue Zeile eines Buttons Java Basics - Anfänger-Themen 7
K Loop ohne Schleifen Java Basics - Anfänger-Themen 2
M bufferedreader loop stoppen Java Basics - Anfänger-Themen 2
R window-Klasse, main-loop und unausschaltbares anti-aliasing Java Basics - Anfänger-Themen 0
S clip.loop(Clip.LOOP_CONTINUOUSLY); stoppen klappt nicht! Java Basics - Anfänger-Themen 11
S Warum erlaubt ein while-Loop keine Variablen-Declaration wie der for-Loop..? Java Basics - Anfänger-Themen 6
S Printstream für einen Hashmap Loop Java Basics - Anfänger-Themen 1
E Integer oder Strings spiegeln (in while loop) Java Basics - Anfänger-Themen 6
G Game Loop Problem Java Basics - Anfänger-Themen 9
P Interpreter-Fehler Im for loop funkzioniert repaint nicht :( Java Basics - Anfänger-Themen 4
D Loop Funktion für Robot Klasse Java Basics - Anfänger-Themen 5
Devil0s while loop, Button action Java Basics - Anfänger-Themen 8
V Schon wieder ein kleines problem...dieses mal mit do-while loop Java Basics - Anfänger-Themen 9
L Mit ChangeListener JSpinner Loop erstellen Java Basics - Anfänger-Themen 2
N Problem mit Loop Java Basics - Anfänger-Themen 2
A For each loop Java Basics - Anfänger-Themen 3
A Vectors in for-loop Java Basics - Anfänger-Themen 6
S For-Each Loop Java Basics - Anfänger-Themen 16
G Loop blockt alle Events Java Basics - Anfänger-Themen 7
G Loop funktion Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben