TicTacToe: Spieler kann nicht gewinnen



  • Das ist immer noch nicht, was ich meinte. Kannst du mal den Code zeigen, den du für die Ausgabe benutzt?



  • import javax.swing.*;
    
    public class Player {
    
      void hasWon(String player){
        for(int i=1; i <= Spielfeld.playerOnField.length/3; i+=3){
          System.out.println(i+"\n"+
                             i+3+"\n"+
                             i+6);
          if(Spielfeld.playerOnField[i].equals(Main.circel) &&
             Spielfeld.playerOnField[i+3].equals(Main.circel) &&
             Spielfeld.playerOnField[i+6].equals(Main.circel)){
            JOptionPane.showMessageDialog(Main.frame, player + " hat gewonnen");
          }
        }
    
        for(int i=0; i < Spielfeld.playerOnField.length/3; i+=3){
          if(Spielfeld.playerOnField[i].equals(Main.circel) &&
             Spielfeld.playerOnField[i+1].equals(Main.circel) &&
             Spielfeld.playerOnField[i+2].equals(Main.circel)){
            JOptionPane.showMessageDialog(Main.frame, player + " hat gewonnen");
          }
        }
      }
    }
    

    Ich habe übrigens den kompletten Quellcode weiter oben gepostet, den du kompilieren kannst.

    Liebe Grüße
    Real



  • Ändere das mal in

    Real schrieb:

    System.out.println(i+"\n"+
                             (i+3)+"\n"+
                             (i+6));
    

    Eigentlich solltest du 036, 147 und 258 testen. Du testest nur 147.



  • Von was redest du? 😕
    036, 147 und 258 😕



  • Bitte hasWon() durch folgedes ersetzen:

    void hasWon(String player, String playerName){
    
        for(int i=1; i <= Spielfeld.playerOnField.length/3; i+=3){
          System.out.println(i+"\n"+
                             i+3+"\n"+
                             i+6);
          if(Spielfeld.playerOnField[i].equals(player) &&
             Spielfeld.playerOnField[i+3].equals(player) &&
             Spielfeld.playerOnField[i+6].equals(player)){
            JOptionPane.showMessageDialog(Main.frame, playerName + " hat gewonnen");
          }
        }
    
        for(int i=0; i < Spielfeld.playerOnField.length/3; i+=3){
          if(Spielfeld.playerOnField[i].equals(player) &&
             Spielfeld.playerOnField[i+1].equals(player) &&
             Spielfeld.playerOnField[i+2].equals(player)){
            JOptionPane.showMessageDialog(Main.frame, playerName + " hat gewonnen");
          }
        }
      }
    

    drawToken durch das:

    void drawToken(Graphics g, int pos_x, int pos_y, String token){
    
        if(placeX(pos_x) && placeY(pos_y)){  // Wenn in ein gültiges Feld geklickt wurde...
          if (token.equals(Main.cross)) {
            drawCross(g);
            playedToken = Main.cross;
            playerOnField[lastPlaced] = Main.cross;
            playerCross.hasWon(Main.cross, "Kreuz");
          }
    
          else if(token.equals(Main.circel)){
            drawCircel(g);
            playedToken = Main.circel;
            playerOnField[lastPlaced] = Main.circel;
            playerCircel.hasWon(Main.circel, "Kreis");
          }
        }
      }
    

    Jetzt kann auch Kreuz ab und zu gewinnen. 😃 Ansonsten ist das Problem gleich. Man kann nicht immer gewinnen.

    Wenn ich die Schleifen in hasWon() durch explizite if-Anweisungen ersetze, dann klappt das Bestens!

    if(Spielfeld.playerOnField[3].equals(player) 
           && Spielfeld.playerOnField[4].equals(player)
           && Spielfeld.playerOnField[5].equals(player)){
          JOptionPane.showMessageDialog(Main.frame, playerName + " hat gewonnen");
        }
    
        if(Spielfeld.playerOnField[6].equals(player) 
           && Spielfeld.playerOnField[7].equals(player)
           && Spielfeld.playerOnField[8].equals(player)){
          JOptionPane.showMessageDialog(Main.frame, playerName + " hat gewonnen");
        }
    

    Es muss also an der Schleife etwas falsch sein.

    Liebe Grüße
    Real



  • Real schrieb:

    Es muss also an der Schleife etwas falsch sein.

    Darauf will ich die ganze Zeit hinaus. 🙄

    Wenn du die Ausgabe so machst, wie ich es geschrieben habe, siehst du auch die tatsächlichen Indices.

    Real schrieb:

    Von was redest du? 😕
    036, 147 und 258 😕

    Die erste Schleife in hasWon hat die Aufgabe, die Spalten zu prüfen, oder etwa nicht? Also zuerst die Felder 0, 3 und 6, dann 1, 4 und 7, und schließlich 2, 5 und 8, denn die liegen jeweils untereinander.

    Du hast erkannt, dass du das mit i, i+3 und i+6 erreichen kannst. Aber aus irgendeinem Grund fängt deine Schleife bei 1 an (sie müsste bei 0 anfangen) und zählt i immer um 3 hoch (richtig wäre 1).



  • Hey, danke!
    Vertikal geht das jetzt wunderbar, nur horinzotal geht die letzte Zeile nicht!

    for(int i=0; i <= 3; i+=3){
          System.out.println(i+"\n"+
                       (i+1)+"\n"+
                       (i+2));
          if(Spielfeld.playerOnField[i].equals(player) &&
             Spielfeld.playerOnField[(i+1)].equals(player) &&
             Spielfeld.playerOnField[(i+2)].equals(player)){
            JOptionPane.showMessageDialog(Main.frame, playerName + " hat gewonnen");
          }
        }
    

    Ausgabe:

    0
    1
    2

    3
    4
    5

    Selbst wenn ich i <= 4 hinschreibe, macht es nur 2 Durchgänge bzw. gibt dasselbe aus. 😕

    Liebe Grüße
    Real



  • So muss es heißen:

    void hasWon(String player, String playerName){
      if(Spielfeld.playerOnField[0].equals(player)
         && Spielfeld.playerOnField[4].equals(player)
         && Spielfeld.playerOnField[8].equals(player)){
        JOptionPane.showMessageDialog(Main.frame, playerName + " hat gewonnen");
      }
    
      else if(Spielfeld.playerOnField[2].equals(player)
              && Spielfeld.playerOnField[4].equals(player)
              && Spielfeld.playerOnField[6].equals(player)){
        JOptionPane.showMessageDialog(Main.frame, playerName + " hat gewonnen");
      }
    
        for(int i=0; i <= Spielfeld.playerOnField.length/3; i++){
          if(Spielfeld.playerOnField[i].equals(player) &&
             Spielfeld.playerOnField[(i+3)].equals(player) &&
             Spielfeld.playerOnField[(i+6)].equals(player)){
            JOptionPane.showMessageDialog(Main.frame, playerName + " hat gewonnen");
          }
        }
    
        for(int i=0; i < Spielfeld.playerOnField.length; i+=3){
          System.out.println(i+"\n"+
                       (i+1)+"\n"+
                       (i+2));
          if(Spielfeld.playerOnField[i].equals(player) &&
             Spielfeld.playerOnField[(i+1)].equals(player) &&
             Spielfeld.playerOnField[(i+2)].equals(player)){
            JOptionPane.showMessageDialog(Main.frame, playerName + " hat gewonnen");
          }
        }
      }
    

    Jedoch bekomme ich einen Stackoverflow, wenn ich das hier spiele:

    http://mitglied.lycos.de/masterchan/Stackoverflow.PNG

    Grund: Es können beide Spieler in dieser Situation gewinnen, aber normalerweise dürften nicht beide Player-Instanzen "gleichzeitig" aufgerufen werden, da eine if-Anweisung dies verhindern (müsste).

    void drawToken(Graphics g, int pos_x, int pos_y, String token){
    
        if(placeX(pos_x) && placeY(pos_y)){  // Wenn in ein gültiges Feld geklickt wurde...
          if (token.equals(Main.cross)) {
            drawCross(g);
            playedToken = Main.cross;
            playerOnField[lastPlaced] = Main.cross;
            playerCross.hasWon(Main.cross, "Kreuz"); //Hat Kreuz gewonnen?
          }
    
          else if(token.equals(Main.circel)){
            drawCircel(g);
            playedToken = Main.circel;
            playerOnField[lastPlaced] = Main.circel;
            playerCircel.hasWon(Main.circel, "Kreis"); //Hat Kreis gewonnen?
          }
        }
      }
    

    Liebe Grüße
    Real



  • Hast du ein wenig mehr Informationen zu dem Stapelüberlauf? Funktion? Stacktrace?



  • Öhm, hat sich irgendwie erledigt.

    Liebe Grüße
    Real


Anmelden zum Antworten