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:
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!
 
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.
 
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.
 
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.
 
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);) {
  // ....
}
 
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!! 😳

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.
 
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 ..... 🙄

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
 
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();
    }
}
 
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!
 
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 🙂
 
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:");
 
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.
 
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 .
 
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.
 
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.
 

Neue Themen


Zurück
Oben