Variablen If - Else Wiederholungsfehler

MateMalte

Mitglied
Hallo Leute,
ich habe ein ziemlich genaues Problem. Mein Ziel war es ein Spiel mit dem Java Editor zu programmieren, bei dem ich es ein bestimmt Anzahl an Stäbchen gibt und zwei Personen gegen einander spielen. Die Spieler ziehen abwechseln zwischen 1 und 3 Stäbchen. Wer das letzte Stäbchen zieht, der verliert. Kennt man das?
Auf jeden Fall habe ich das ganze mit den Entscheidungsmöglichkeiten eines Single- und Multiplayers erweitert. Um die beiden zu unterscheiden habe ich die Variable "modus" hinzugefügt. Durch zwei einfachen jButtons auf der Startfläche gebe ich der Variable "modus" für den Singleplayer die Zahl 0 und für den Multiplayer die Zahl 1.
Um den Spieler anzugeben der gerade an der Reihe ist gibt es die Variable "spieler". Auch hier habe ich dem ersten Spieler, die Zahl 0 und dem zweiten die Zahl 1.
Wenn also alles eingestellt ist, dann fängt das Spiel an, indem im Singleplayer der erste Spieler seine Stöckchen mit einem jTextField und einem jButton wegnimmt. Mit dem jButton wird die Variable "spieler" auf 1 gesetzt. Jetzt ist der Computer an der Reihe. Mit einem Thread wartet der Computer 3 Sekunden, zieht dann seine Stäbchen ab und die Variable wird wieder auf 0 gesetzt. D.h. das der Spieler wieder am Zug ist. Jetzt nimmt er wieder seine Stäbchen weg, also klick auf den Button. Doch wenn ich erneut wieder drücke, so wird wieder ausgegeben, dass der Spieler immernoch an der Reihe ist.

Java:
public void jButton9_ActionPerformed(ActionEvent evt) {
    if (Integer.parseInt(jTextField5.getText()) == 1 || Integer.parseInt(jTextField5.getText()) == 2 || Integer.parseInt(jTextField5.getText()) == 3){    
      zahl = zahl - Integer.parseInt(jTextField5.getText());
      jLabel6.setText("Es liegen noch " + zahl + " Stäbchen.");
      jTextField5.setText("");
      if (modus == 0) {
        if (spieler == 1) {
          jButton9.setEnabled(false);   
          jLabel7.setText(jTextField6.getText() + " ist am Zug.");
          try{
            Thread.sleep(3000);
           }catch(InterruptedException e){}
          zahl = zahl -3;
          jLabel6.setText("Es liegen noch " + zahl + " Stäbchen.");
          spieler = spieler - 1;   
          jLabel7.setText(jTextField1.getText() + " ist am Zug." + spieler);
          jButton9.setEnabled(true);
        } else {
          jButton9.setEnabled(true);  
          if (spieler == 0) {
            spieler = spieler + 1;
            jLabel7.setText(jTextField1.getText() + " ist am Zug." + spieler);
          } // end of if        
        }                                                        
      }

Der nächste Klick bringt wieder alles in Ordnung. Der Computer ist dran und macht seinen gewohnten Ablauf. Ich habe wirklich viel ausprobiert. Ich habe mir auch die Variable "spieler" während des Spieles angeschaut, aber mit der ist alles in Ordnung. Habt ihr noch irgendwelche Idee?
 

Javinner

Top Contributor
@MateMalte
Ich finde, dein Code gehört richtig aufgeräumt. Als Beispiel:
Java:
if (Integer.parseInt(jTextField5.getText()) == 1 || Integer.parseInt(jTextField5.getText()) == 2 || Integer.parseInt(jTextField5.getText()) == 3)
Fürs Erste wären hier Grenzen als finale Klassenvariablen nicht verkehrt.
Ebenso würde ich für die Bedingung einen passenden Namen aussuchen und diese in eine Methode auslagern.
Java:
package beispiel;
public class Beispiel {

    final static int UPPER_LIMIT = 3;
    final static int LOWER_LIMIT = 1;
    public static void main(String[] args) {

      //For example you input was 3
      int inputValue = 3;
      if(condition(inputValue))
      {
          //Code for Event
      }
    }
    static boolean condition(int value)
    {
        return value >= LOWER_LIMIT && value <= UPPER_LIMIT;
    }
}

Dann die Namensgebung: jLabel6, jButton9, jTextField1 usw. Wähle doch die Namen nach der Funktion der jeweiligen Objekte.
 

MoxxiManagarm

Top Contributor
Wenn du den Code richtig einrücken würdest würdest du es vielleicht sehen. Das else bezieht sich auf das falsche if würde ich meinen. Es ist aktuell ein else zu spieler == 1, es sollte aber vermutlich ein else zu modus == 0 sein.

Der Code ist aber generell voll verquer. Wie ich finde.

Hier ein Verbesserungsvorschlag:
Java:
public void jButton9_ActionPerformed(ActionEvent evt) {
    int auswahl = parseEingabe();

    // gültige Auswahl
    if(auswahl >= LOWER_LIMIT && auswahl <= UPPER_LIMIT) {
        // dekrementiert zahl inkl. Ausgabe
        entferneStaebchen(auswahl);
      
        loescheEingabe();

        // wechselt spieler incl. Ausgabe wer am zug ist
        togglePlayer();
      
        // nur dann zieht der Computer
        if(modus == SINGLE_PLAYER && spieler == PLAYER_TWO) {
            toggleButton();
          
            think();
          
            // oder irgendeine Logik für Anzahl
            entferneStaebchen(3);
          
            toggleButton();
            togglePlayer();
        }
    }
  
    // ungültige Auswahl
    else {
        //...
    }
}

Du musst die Methoden nicht übernehmen. Ich meinem Beispiel sollten sie nur sprechend sein und die Struktur wiederspiegeln. Bitte vergib sprechend Namen für die JComponents sowie die einzelnen Zustände
 

MateMalte

Mitglied
@Javinner
Erstmal Danke ... Mit so viel Hilfe hatte ich nicht gerechnet. Ich schaue mir gerne genauer an was du mir vorachlägst, weil so tief bin ich noch nicht in der Materie das ich alles verstehe was du schreibst.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Mehrfache if-else-Abfrage zusammenfassen Allgemeine Java-Themen 51
ReinerCoder Case statt if else Abfragen?! Allgemeine Java-Themen 8
L Vererbung If-Else ersetzen durch was? Allgemeine Java-Themen 20
O Darstellung von else if anweisung im struktogramm? Allgemeine Java-Themen 1
R Wie schaffe ich es, dass java zB 100 zählt ohne ständig "else if" hinschreiben zu müssen? Allgemeine Java-Themen 7
J if else Anweisung macht nicht was es soll. Wieso? Allgemeine Java-Themen 10
K Eclipse Alternativkonstrukte (Verzweigungen: if, switch,else..) Allgemeine Java-Themen 4
D if - else Baum vereinfachen Allgemeine Java-Themen 4
S Else-Anweisung Problem Allgemeine Java-Themen 17
B Berechnung von Punkten/ If-else Strategie?! Allgemeine Java-Themen 51
M if - else Abfrage beenden Allgemeine Java-Themen 4
M if, else, etc. als Membervariablen? Allgemeine Java-Themen 14
P if(a) else if (b) else if (c) . Frage Allgemeine Java-Themen 2
G die mittlere von 5 Zahlen nur mit if und else finden Allgemeine Java-Themen 48
U Kompilieren einer großen Datei if-else = StackOverflowError Allgemeine Java-Themen 4
W kompliziertes Konstrukt von Schleifen/If/else. Rekursion? Allgemeine Java-Themen 22
G switch case VS. if.else if Allgemeine Java-Themen 2
H if - else if-else bessere Lösung gesucht Allgemeine Java-Themen 4
H If anweisungen zu verschachtelt? else without if Allgemeine Java-Themen 8
D Performancefrage zu "else if" und "||" Allgemeine Java-Themen 10
G if . else ? Allgemeine Java-Themen 36
C Unendlich Wiederholungsfehler bei try catch - Block Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben