Variable (int) erhöht sich nicht richtig

Schwupsi

Aktives Mitglied
Hi Leute, möchte aus Spaß an der Übung einfach mal ein kleines Quiz erstellen, um so bisschen vertrauter mit dem Coden zu werden. Bin noch ein Anfänger und erst im 2. Semester meines Wirtschaftsinformatik-Studiums.

Also anfangs muss der User die Taste 1 drücken um zu spielen. Tut er das nicht wird das Programm abgebrochen. Jede einzelne Frage habe ich in eine Methode geschrieben, wo die Eingabe des Users (A, B oder C) durch Switch-Case geprüft wird und anschließend ein boolean Wert an die Methode "Punktzahl" übergeben wird. Dort wird (falls true) auf den Int-Wert "Punktzahl" immer 1 addiert. Am Ende gibt die Methode Punktzahl den Int Wert an die Main zurück.

So ist das zumindest geplant, jedoch funktioniert das mit der Punktzahl nicht ganz. Wäre nett wenn sich jemand den Code mal ansieht und mir Tipps gibt oder die entsprechende Stelle verbessert. Freue mich auf eure Antworten!

Java:
import java.util.Scanner;

public class Quiz {

    public static void main(String[] args) {
        System.out
                .println("Herzlich Willkommen zum Quiz! Sie bekommen Fragen gestellt, "
                        + "bei denen es 3 mögliche Antworten gibt, für jede richtige Antwort gibt es einen Punkt. Zum Spielen 1 drücken, viel Spaß!");
        Scanner s = new Scanner(System.in);
        int Eingabe = s.nextInt();
        if (Eingabe == 1) {
            Frage1();

            Frage2();

            Frage3();

            System.out.println("Punktzahl: " + Punktzahl());

        } else {
            System.out.println("Falsche Eingabe! Neu starten!");
        }

    }

    public static void Frage1() {
        System.out.println("Wie heißt die Hauptstadt Spaniens?");
        System.out.println("A: Berlin \t" + "B: Paris \t" + "C: Madrid");
        boolean RichtigFalsch;
        Scanner s = new Scanner(System.in);
        String Antwort = s.next();

        switch (Antwort) {
        case "A":
            System.out.println("Falsch!");
            RichtigFalsch = false;
            Punktzahl(RichtigFalsch);
            break;
        case "B":
            System.out.println("Falsch!");
            RichtigFalsch = false;
            Punktzahl(RichtigFalsch);
            break;
        case "C":
            System.out.println("Richtig!");
            RichtigFalsch = true;
            Punktzahl(RichtigFalsch);
            break;

        }
    }

    public static void Frage2() {
        System.out.println("Wie heißt die Hauptstadt Mexikos?");
        System.out.println("A: Moskau \t" + "B: Belgrad \t" + "C: Mexiko-Stadt");
        boolean RichtigFalsch;
        Scanner s = new Scanner(System.in);
        String Antwort = s.next();

        switch (Antwort) {
        case "C":
            System.out.println("Falsch!");
            RichtigFalsch = false;
            Punktzahl(RichtigFalsch);
            break;
        case "A":
            System.out.println("Falsch!");
            RichtigFalsch = false;
            Punktzahl(RichtigFalsch);
            break;
        case "B":
            System.out.println("Richtig!");
            RichtigFalsch = true;
            Punktzahl(RichtigFalsch);
            break;
        }
    }

    public static void Frage3() {
        System.out.println("Wie heißt die Hauptstadt der USA?");
        System.out.println("A: Casablanca \t" + "B: Washington \t" + "C: New York");
        boolean RichtigFalsch;
        Scanner s = new Scanner(System.in);
        String Antwort = s.next();

        switch (Antwort) {
        case "C":
            System.out.println("Falsch!");
            RichtigFalsch = false;
            Punktzahl(RichtigFalsch);
            break;
        case "B":
            System.out.println("Falsch!");
            RichtigFalsch = false;
            Punktzahl(RichtigFalsch);
            break;
        case "A":
            System.out.println("Richtig!");
            RichtigFalsch = true;
            Punktzahl(RichtigFalsch);
            break;
        }

    }

    public static int Punktzahl(boolean RichtigFalsch) {

        int Punktzahl = 0;
        if (RichtigFalsch == true) {
            Punktzahl = Punktzahl+1;
        }

        return Punktzahl;

    }

}
 
Hi also deinen Fehler hab ich nicht gefunden. Hab aber auch nicht danach gesucht XD
Was du auf jeden Fall machen solltest, ist die Methode Frage1,2,3 zu Methode Frage zu verallgemeinern. Ersetzte die Frage selbst, sowie die Antworten durch Variablen, die du beim aufrufen der Methoden angibst oder aus einer Datei lädst. Dann musst auch nicht bei allen Fragen immer in den Code schreiben ;D
 
Das mit der Punktzahl klappt nicht, weil du die Variable Punktzahl lokal in der Methode Punktzahl deklarierst; sie bleibt nur so lange bestehen, wie die methode Punktzahl abläuft.
Du musst die Variable statisch auf der klasse deklarieren.
 
So ist das zumindest geplant, jedoch funktioniert das mit der Punktzahl nicht ganz. Wäre nett wenn sich jemand den Code mal ansieht und mir Tipps gibt oder die entsprechende Stelle verbessert. Freue mich auf eure Antworten!

Die Lösung haben dir ja schon die Vorposter gezeigt 🙂

Von mir nur kleine Tipps zu deinem Code:
Java:
    public static void Frage1() {
        System.out.println("Wie heißt die Hauptstadt Spaniens?");
        System.out.println("A: Berlin \t" + "B: Paris \t" + "C: Madrid");
        boolean RichtigFalsch;
        Scanner s = new Scanner(System.in);
        String Antwort = s.next();

        switch (Antwort) {
        case "A":
            System.out.println("Falsch!");
            RichtigFalsch = false;
            Punktzahl(RichtigFalsch);
            break;
        case "B":
            System.out.println("Falsch!");
            RichtigFalsch = false;
            Punktzahl(RichtigFalsch);
            break;
        case "C":
            System.out.println("Richtig!");
            RichtigFalsch = true;
            Punktzahl(RichtigFalsch);
            break;

        }
    }

Du verwendest hier "switch". Bei Fall "A" bzw. "B" hast du identischen Code stehen. Dies kann man vereinfachen:
Code:
switch(Antwort) {
   case "A":
   case "B":
       // dein Code
}

Dadurch ersparst du dir Code und hast auch weniger Zeilen zu ändern wenn du falsche Antworten mal anderes behandeln willst.

Java:
    public static int Punktzahl(boolean RichtigFalsch) {

        int Punktzahl = 0;
        if (RichtigFalsch == true) {
            Punktzahl = Punktzahl+1;
        }

        return Punktzahl;

    }

Die if-Bedingung kann man vereinfachen. Fürs if wird eine boolscher Ausdruck benötigt, "RichtigFalsch" selbst ist schon so ein Ausdruck.
Folgende Vereinfache wäre daher möglich:
Java:
if(RichtigFalsch) {
    // dein code
}

Allgemein zu deinem Code: lokale Variablen sollten in "lowerCamelCase" geschrieben werden nicht in "UpperCamelCase". (gleiches gilt auch für die Parameter von Methoden und Methoden selber).
In "UpperCamelCase" werden normalerweise nur Klassennamen geschrieben
 
Zuletzt bearbeitet:
Außerdem ist der code deiner verschiedenen Fragen zu 90% identisch ,daher wäre es sinnvoller einfach eine allgemeine Frage Methode zu schreiben. Außerdem solltest du den Scanner nicht immer neu erzeugen, es reicht ihn einmal in der main zu erstellen und statisch zu speichern
Ganz grob kann das z.b. so aussehen:
Java:
public static void frage(String text, String richtigeAntwort) {
  System.out.println(text);
  String antwort = scanner.next();
  punktzahl(richtigeAntwort.equals(antwort));
}

Verwenden kannst du es dann so:
Java:
frage("Wie heißt die Hauptstadt Spaniens?\nA: Berlin \tB: Paris \tC: Madrid", "C");
 
Außerdem ist der code deiner verschiedenen Fragen zu 90% identisch ,daher wäre es sinnvoller einfach eine allgemeine Frage Methode zu schreiben. Außerdem solltest du den Scanner nicht immer neu erzeugen, es reicht ihn einmal in der main zu erstellen und statisch zu speichern
Ganz grob kann das z.b. so aussehen:
Java:
public static void frage(String text, String richtigeAntwort) {
  System.out.println(text);
  String antwort = scanner.next();
  punktzahl(richtigeAntwort.equals(antwort));
}

Verwenden kannst du es dann so:
Java:
frage("Wie heißt die Hauptstadt Spaniens?\nA: Berlin \tB: Paris \tC: Madrid", "C");
Das hab ich schon als erstes geschrieben gehabt ... XD
 
Das mit der Punktzahl klappt nicht, weil du die Variable Punktzahl lokal in der Methode Punktzahl deklarierst; sie bleibt nur so lange bestehen, wie die methode Punktzahl abläuft.
Du musst die Variable statisch auf der klasse deklarieren.

Danke! Jetzt funktioniert es mit der Punktzahl. Habe die Variable in der Klasse als "static int Punktzahl;" deklariert.

Und die Methode Punktzahl wäre dann void ...

Soweit ich weiß ist das falsch? Wenn die Methode einen int-Wert zurückliefert dann muss sie vom Typ int sein und nicht vom Typ void oder? Also mit int funktioniert es..



Letzte Frage 😀 Wie erstellt man einen statischen Scanner der dann für alle Methoden gilt ohne ihn innerhalb der Methoden nochmal erstellen zu müssen?
 
Zuletzt bearbeitet:
Soweit ich weiß ist das falsch? Wenn die Methode einen int-Wert zurückliefert dann muss sie vom Typ int sein und nicht vom Typ void oder? Also mit int funktioniert es..
da du den zurückgegeben int aber überhaupt nicht verwendest, kannst du das return auch weg lassen und die methode in eine void umwandeln.

Und bezüglich RichtigFalsch, entweder solltest du sie Richtig oder Falsch nennen.
Denn was bedeutet RichtigFalsch=true? wurde die Frage Richtig beantwortet oder Falsch?
Wenn du die Variable nur Richtig genannt hättest wäre dies sofort ersichtlich
 
Habe mir mal eure Tipps zu Herzen genommen und den Code überarbeitet.
Danke nochmal für die schnellen und hilfreichen Antworten.

Java:
import java.util.Scanner;

public class Quiz {

    static int Punktzahl;
    static Scanner s = new Scanner (System.in);

    public static void main(String[] args) {
        System.out
                .println("Herzlich Willkommen zum Quiz! Sie bekommen Fragen gestellt, "
                        + "bei denen es 3 mögliche Antworten gibt, für jede richtige Antwort gibt es einen Punkt. Zum Spielen 1 drücken, viel Spaß!");
       
        int Eingabe = s.nextInt();

        if (Eingabe == 1) {
            Frage("Wie heißt die Hauptstadt Spaniens?\n A: Berlin \tB: Paris \tC: Madrid",
                    "C");
            Frage("Wie heißt die Hauptstadt Portugals?\n A: Marokko \tB: Lissabon \tC: Moskau", "B");
           
            Frage("Wie hoch ist der Mount Everest?\n A: 7540m \tB: 8342m \tC: 1200m", "B");

            System.out.println("Punktzahl: " + Punktzahl);

        } else {
            System.out.println("Falsche Eingabe! Neu starten!");
        }

    }

    public static void Frage(String Frage, String RichtigeAntwort) {
        System.out.println(Frage);
        boolean RichtigFalsch;
        String Antwort = s.next();
        if (Antwort.equals(RichtigeAntwort)) {
            System.out.println("Richtige Antwort!");
            RichtigFalsch = true;
            Punktzahl(RichtigFalsch);
        } else {
            System.out.println("Falsche Antwort!");
            RichtigFalsch = false;
            Punktzahl(RichtigFalsch);
        }

    }

    public static int Punktzahl(boolean RichtigFalsch) {

        if (RichtigFalsch) {
            Punktzahl = Punktzahl + 1;
        }

        return Punktzahl;

    }

}
 
da du den zurückgegeben int aber überhaupt nicht verwendest, kannst du das return auch weg lassen und die methode in eine void umwandeln.

Und bezüglich RichtigFalsch, entweder solltest du sie Richtig oder Falsch nennen.
Denn was bedeutet RichtigFalsch=true? wurde die Frage Richtig beantwortet oder Falsch?
Wenn du die Variable nur Richtig genannt hättest wäre dies sofort ersichtlich

Ich verstehe was du meinst. Habe sie "RichtigFalsch" genannt, da ich mir nicht sicher bin ob eine boolean am Anfang schon einen Wert hat, und wenn ja, welchen? Diesen Wert "True oder false" weise ich ihr ja dann erst zu, abhängig davon ob die Antwort richtig oder falsch ist.
 
außerdem brauchst du diese variable überhaupt nicht.
Es wäre viel einfacher und übersichtlicher, wenn du direkt
Java:
Punktzahl(true);
//bzw
Punktzahl(false);
aufrufst.

p.s.
da Punktzahl bei false eh nichts macht. Kannst du den aufruf auch einfach weglassen.
 

Neue Themen


Zurück
Oben