TikTakToe funktioniert nicht

stormyark

Mitglied
Hallo,
Ich bin im moment dabei ein TikTakToe zu programmieren und hänge seit Stunden an einem Fehler

Vielleich kann sich mal jemand den code angucken und mir helfen:

Java:
import java.util.Scanner;

public class TikTakToe {
  public static int PlayerY;
  public static int PlayerX;
  public static String PlayerK;
  public static String stein;
  public static String stein2;
  public static String PlayerSel;
  public static int steinzahl = 0;
  public static String win="";
  public static Boolean winquest = false;
  public static String[][] spielfeld={
  {".",".","."},
  {".",".","."},
  {".",".","."}
  };
 
  public static void main(String[] args){
    System.out.println("\n"+
    "████████ ██ ██   ██  ████████  █████  ██   ██  ████████  ██████  ███████ "+"\n"+
    "   ██    ██ ██  ██      ██    ██   ██ ██  ██      ██    ██    ██ ██      "+"\n"+
    "   ██    ██ █████       ██    ███████ █████       ██    ██    ██ █████   "+"\n"+
    "   ██    ██ ██  ██      ██    ██   ██ ██  ██      ██    ██    ██ ██      "+"\n"+
    "   ██    ██ ██   ██     ██    ██   ██ ██   ██     ██     ██████  ███████ "+"\n");
    
    Scanner myObj = new Scanner(System.in);
    System.out.println("1: O" + "\n" + "2: X " + "\n" +  "Bitte waehle dein Zeichen: ");
    String PlayerSel = myObj.nextLine();
    
    if (PlayerSel.equals("1") ) {
      stein = "O";
      stein2 = "X";
    } else {
      stein = "X";
      stein2 = "O"; 
    }
    System.out.println("============================");
    System.out.println("Spieler 1: " + stein + "\n" + "Spieler 2: " + stein2 + "\n" + "============================");
    System.out.println("So sieht das Spielfeld aus:");
    
    String[][] spielfeldshow={
    {"7","8","9"},
    {"4","5","6"},
    {"1","2","3"}
    };
    
    for (int y=0;y<spielfeldshow.length ;y++ ) {
      for (int x=0;x<spielfeldshow[y].length ;x++ ) {
        System.out.print(spielfeldshow[y][x]);   
      }
      System.out.print("\n");
    }
    
    System.out.println("============================");
    
    do {
      if (stein == "X") {
        System.out.println("| X ist dran");
      } else if (stein == "O") {
          System.out.println("| O ist dran");
        }
      
      Scanner MyObj = new Scanner(System.in);
      System.out.println("Bitte geben Sie eine Koordinate (1 - 9) ein: ");
      String PlayerK = MyObj.nextLine();
            
      //Matrix
      
      if (PlayerK.equals("7")) {
        PlayerK = spielfeld[0][0];
      }
      if (PlayerK.equals("8")) {
        PlayerK = spielfeld[0][1];
      }
      if (PlayerK.equals("9")) {
        PlayerK = spielfeld[0][2];
      }
      if (PlayerK.equals("4")) {
        PlayerK = spielfeld[1][0];
      }
      if (PlayerK.equals("5")) {
        PlayerK = spielfeld[1][1];
      } 
      if (PlayerK.equals("6")) {
        PlayerK = spielfeld[1][2];
      } 
      if (PlayerK.equals("1")) {
        PlayerK = spielfeld[2][0];
      } 
      if (PlayerK.equals("2")) {
        PlayerK = spielfeld[2][1];
      } 
      if (PlayerK.equals("3")) {
        PlayerK = spielfeld[2][2];
      }
      
      if (PlayerK == ".") {
        PlayerK = stein;
        if (PlayerK == "X") {
          steinzahl++;
          stein = "O";
        } else if (PlayerK == "O") {
            steinzahl++;
            stein = "X";
          }
      } else {
        System.out.println("Bitte waehle eine andere Position.");
        if (stein == "X") {
          stein = "X";
        } else if (stein == "O") {
            stein = "O";
          }
      }
      
      //Spielfeld printen
      
      for (int y=0;y<spielfeld.length ;y++ ) {
        for (int x=0;x<spielfeld[y].length ;x++ ) {
          System.out.print(spielfeld[y][x]);   
        }
        System.out.print("\n");
      }
      
      //wincases
      
      for (int r=0; r<8 ;r++ ) {
        switch (r) {               
          case 1 :
            win = spielfeld[0][0] + spielfeld[1][0] + spielfeld[2][0];         
            break;
          case 2 :
            win = spielfeld[0][1] + spielfeld[1][1] + spielfeld[2][1];
            break;
          case 3:
            win = spielfeld[0][2] + spielfeld[1][2] + spielfeld[2][2];   
            break;
          case 4:
            win = spielfeld[0][0] + spielfeld[0][1] + spielfeld[0][2];
            break;
          case 5:
            win = spielfeld[1][0] + spielfeld[1][1] + spielfeld[1][2];
            break;
          case 6:
            win = spielfeld[2][0] + spielfeld[2][1] + spielfeld[2][2];
            break;
          case 7:
            win = spielfeld[0][0] + spielfeld[1][1] + spielfeld[2][2];
            break;
          case 8:
            win = spielfeld[2][0] + spielfeld[1][1] + spielfeld[0][2]; 
            break;
          default:
        }
        
        if (win.equals("XXX")) {
          System.out.println("X hat gewonnen!");
          winquest = true;
        }
        
        if (win.equals("OOO")) {
          System.out.println("O hat gewonnen");
          winquest = true;
        }
        
        if (r == 9){
          System.out.println("Gleichstand!");
          winquest = true;
        }
      }
      
      if (winquest == true) {
        System.out.println("Danke fürs Spielen :)");
        System.out.println("Von Amy und Noah.");
        break;
      }
      
    } while (steinzahl < 9);
    
  }
}

Beim nächsten Print wird das X nicht gesetzt.
Warum??
 
Ich habe die Fehlerbeschreibung nicht ganz verstanden, daher ist es schwer, den Fehler zu lokalisieren.

Was auffällt: Du hast immer noch einige String Vergleiche mit == in Deinem Code. Teilweise werden die funktionieren, da Du nur String Literale miteinander vergleichst und da ist die Referenz auch gleich. Aber generell solltest Du Strings immer mit equals vergleichen - wie es Du es ja auch schon teilweise gemacht hast.

Das würde ich zuerst anpassen. Und wenn das den Fehler nicht behoben haben sollte kannst Du ggf. noch genauer den Fehler beschreiben.
 
Tipp
ich sehe nichts in deinem Spiel wo du deinem Spielfeld Array eine Zuweisung machst .

also wo der Stein ( 0, X ) in das Array eingetragen wird .

zB spielfeld[0][0] = "X";
 
Ich habe die Fehlerbeschreibung nicht ganz verstanden, daher ist es schwer, den Fehler zu lokalisieren.

Was auffällt: Du hast immer noch einige String Vergleiche mit == in Deinem Code. Teilweise werden die funktionieren, da Du nur String Literale miteinander vergleichst und da ist die Referenz auch gleich. Aber generell solltest Du Strings immer mit equals vergleichen - wie es Du es ja auch schon teilweise gemacht hast.

Das würde ich zuerst anpassen. Und wenn das den Fehler nicht behoben haben sollte kannst Du ggf. noch genauer den Fehler beschreiben.

So sieht das Programm aus wenn ich es ausführe

Bild 1

Allerdings sollte es so aussehen:

Bild 2

Das ist ein Screenshot aus einem etwas älterem Programm und da wird das X gesetzt

Alter Code:
Java:
import Prog1Tools.*;
import java.util.Scanner;

public class TikTakToeTest {
  public static int PlayerY;
  public static int PlayerX;
  public static String stein;
  public static String stein2;
  public static String PlayerSel;
  public static int steinzahl = 0;
  public static String win="";
  public static Boolean winquest = false;
  public static String[][] spielfeld={
  {".",".","."},
  {".",".","."},
  {".",".","."}
  };
 
  public static void main(String[] args){
    System.out.println("TikTakToe");
    PlayerSel=IOTools.readString("1: O" + "\n" + "2: X " + "\n" +  "Bitte waehle dein Zeichen: ");
    if (PlayerSel.equals("1") ) {
      stein = "O";
      stein2 = "X";
    } else {
      stein = "X";
      stein2 = "O";
    }
    System.out.println("============================");
    System.out.println("Spieler 1: " + stein + "\n" + "Spieler 2: " + stein2 + "\n" + "============================");
    System.out.println("So sieht das Spielfeld aus:");
   
    for (int y=0;y<spielfeld.length ;y++ ) {
      for (int x=0;x<spielfeld[y].length ;x++ ) {
        System.out.print(spielfeld[y][x]);  
      }
      System.out.print("\n");
    }
   
    System.out.println("============================");
   
    do {
      if (stein == "X") {
        System.out.println("| X ist dran");
      } else if (stein == "O") {
          System.out.println("| O ist dran");
        }
     
      PlayerY = IOTools.readInteger("Bitte geben Sie die Y-Koordinate (0, 1 oder 2) ein: ");
      PlayerX = IOTools.readInteger("Bitte geben Sie die X-Koordinate (0, 1 oder 2) ein: ");
     
      if (spielfeld[PlayerY][PlayerX] == ".") {
        spielfeld[PlayerY][PlayerX] = stein;
        if (spielfeld[PlayerY][PlayerX] == "X") {
          steinzahl++;
          stein = "O";
        } else if (spielfeld[PlayerY][PlayerX] == "O") {
            steinzahl++;
            stein = "X";
          }
      } else {
        System.out.println("Bitte waehle eine andere Position.");
        if (stein == "X") {
          stein = "X";
        } else if (stein == "O") {
            stein = "O";
          }
      }
     
      for (int y=0;y<spielfeld.length ;y++ ) {
        for (int x=0;x<spielfeld[y].length ;x++ ) {
          System.out.print(spielfeld[y][x]);  
        }
        System.out.print("\n");
      }
     
      for (int r=0; r<8 ;r++ ) {
       
        switch (r) {              
          case 1 :
            win = spielfeld[0][0] + spielfeld[1][0] + spielfeld[2][0];        
            break;
          case 2 :
            win = spielfeld[0][1] + spielfeld[1][1] + spielfeld[2][1];
            break;
          case 3:
            win = spielfeld[0][2] + spielfeld[1][2] + spielfeld[2][2];  
            break;
          case 4:
            win = spielfeld[0][0] + spielfeld[0][1] + spielfeld[0][2];
            break;
          case 5:
            win = spielfeld[1][0] + spielfeld[1][1] + spielfeld[1][2];
            break;
          case 6:
            win = spielfeld[2][0] + spielfeld[2][1] + spielfeld[2][2];
            break;
          case 7:
            win = spielfeld[0][0] + spielfeld[1][1] + spielfeld[2][2];
            break;
          case 8:
            win = spielfeld[2][0] + spielfeld[1][1] + spielfeld[0][2];
            break;
          default:
        }
       
        if (win.equals("XXX")) {
          System.out.println("X hat gewonnen!");
          winquest = true;
        }
       
        if (win.equals("OOO")) {
          System.out.println("O hat gewonnen");
          winquest = true;
        }
       
        if (r == 9){
          System.out.println("Gleichstand!");
          winquest = true;
        }
      }
     
      if (winquest == true) {
        System.out.println("Danke fürs Spielen :)");
        break;
      } // end of if
     
    } while (steinzahl < 9);
   
  }
}
 

Anhänge

  • 1650817839706.png
    1650817839706.png
    15,3 KB · Aufrufe: 2
  • 1650817902431.png
    1650817902431.png
    15 KB · Aufrufe: 2
Java:
if (PlayerK == ".") {
                PlayerK = stein;
                if (PlayerK == "X") {
                    steinzahl++;
                    stein = "O";
                } else if (PlayerK == "O") {
                    steinzahl++;
                    stein = "X";
                }
            } else {
in diesem Bereich musst du den Stein auch in das Array setzen das tust du nicht.
 
in deinem alten code wird hier der Stein in das Array gesetzt
Code:
 if (spielfeld[PlayerY][PlayerX] == ".") {
        spielfeld[PlayerY][PlayerX] = stein;
Zeile 55
 
Java:
if (PlayerK == ".") {
                PlayerK = stein;
                if (PlayerK == "X") {
                    steinzahl++;
                    stein = "O";
                } else if (PlayerK == "O") {
                    steinzahl++;
                    stein = "X";
                }
            } else {
in diesem Bereich musst du den Stein auch in das Array setzen das tust du nicht.
Java:
String ergebnis = PlayerK;
      
      if (PlayerK.equals(".")) {
        PlayerK = stein;
        if (PlayerK.equals("X")) {
          steinzahl++;
          PlayerK = ergebnis;
          stein = "O";
        
        } else if (PlayerK.equals("O")) {
            steinzahl++;
            PlayerK = ergebnis;
            stein = "X";
            
          }
      } else {


Quasi so??
 
nein
du willst es in das Array schreiben und dazu brauchst du auch die X und Y pos die du hier nicht hast.

schaue deinen alten code nochmal an. wo und wie das da gemacht wird.
 
in deinem alten code wird hier der Stein in das Array gesetzt
Code:
 if (spielfeld[PlayerY][PlayerX] == ".") {
        spielfeld[PlayerY][PlayerX] = stein;
Zeile 55
Java:
if (PlayerK.equals("3")) {
        PlayerK = spielfeld[2][2];
      }
      
      String ergebnis = PlayerK;
      
      if (PlayerK.equals(".")) {
        ergebnis = stein;
        PlayerK = stein;
        if (PlayerK.equals("X")) {
          steinzahl++;
          stein = "O";
        } else if (PlayerK.equals("O")) {
            steinzahl++;
            stein = "X";
          }
      } else {
 
PlayerK = stein;
ist nicht das was du willst.

wenn dann
spielfeld[x][y]=stein;

Das geht aber nicht da du die Position von X u Y hier an der Stelle nicht hast.


 
Ein paar Anmerkungen:

a) String Vergleiche bitte nicht mit == sondern mit equals. Das ist wichtig und sollte von Dir beherzigt werden.

b) Strukturiere Deinen Code - das ist so extrem unleserlich. Als ein paar Vorschläge:

Vorschlag 1: Berechnung der Indices des Arrays
Du hast die Eingabe einer Zahl (1-9) um daraus dann das Feld zu ermitteln Es ist möglich, aus der Eingabe direkt die x und y Koordinate zu bekommen. Dazu musst Du den String in eine Zahl parsen um dann mittels % und / zu den Elementen zu kommen.

7 -> [0][0] ==> (9 - 7) / 3 = 0; 2 - (9-7) % 3 = 0
8 -> [0][1] ==> (9 - 8) / 3 = 0; 2 - (9-8) % 3 = 1
9 -> [0][2] ==> (9 - 9) / 3 = 0; 2 - (9-9) % 3 = 2
4 -> [1][0] ==> (9 - 4) / 3 = 1; 2 - (9-4) % 3 = 0
...

Also wäre die Berechnung der Indices: [(9-zahl)/3][2-(9-zahl)%3]

==> Damit kannst Du dann darauf verzichten, das Element in eine andere Variable zu speichern und damit kannst Du dann auch direkt das Feld setzen - so wie es in dem anderen Code gezeigt wurde!

Vorschlag 2: Pack diverse Dinge in Methoden - dann wird der Code auch lesbar und besser testbar, weil Du einzelne Methoden testen kannst!

Vorschlag 3: Die Prüfung, ob ein Spieler gewonnen hat oder nicht kannst Du deutlich leserlicher machen:

Zeile / Reihe würde ich einfach in einer Schleife prüfen.
Eine Methode, die z.B. den Gewinner ermittelt:

- Schleife von 0-2 und in der Schleife:
--- Wenn die drei Elemente der Reihe i oder die drei Elemente der Spalte i gleich sind, dann gibt das Element aus Spalte i / Reihe i zurück.
- sind die drei Felder der einen Diagonalen gleich oder die Element der anderen Diagonalen gleich, dann gib das Element in der Mitte zurück.
- gib das Zeichen für keiner hat gewonnen zurück.

==> Du hast nicht mehr die Schleife mit der Switch Anweisung und auch nicht die nachfolgenden if Prüfungen.

Generell sollte man immer auf lesbaren Code achten. Unleserlicher Code macht es Dir - wie Du hoffentlich gemerkt hast - sehr schwer da selbst durch zu steigen, so dass Du selbst Probleme hast, den Fehler zu erkennen, wenn er Dir mitgeteilt wird. Daher wäre das mit der wichtigste Punkt, an dem du arbeiten solltest.
 

Neue Themen


Zurück
Oben