TicTacToe Problem mit Win Methode

painting

Neues Mitglied
Hallo Leute,

und zwar habe ich ein Problem mit meiner checkForWin() Methode, da sie direkt sobald ich mein TicTacToe-Feld starte mir ausgibt, dass ich gewonnen habe und zwar bei jedem Button klick den ich mache. Würde mich sehr über Verbesserungsvorschläge und Tipps freuen, komme wirklich nicht weiter und bedanke mich jetzt schon mal.(Problemstelle müsste bei checkForWin() liegen)
Hier der Code:

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class GUI
{
    private JFrame feld;
    private JPanel p;
    private JButton b1;
    private JLabel lab;
    JButton[] b = new JButton[9];
    int turn = 1;
    int v=0;
    public GUI(){
        //Spielfeld wird erstellt+Buttons erzeugt
        feld = new JFrame("TicTacToe");
        feld.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        feld.setSize(600,600);
     
        feld.setVisible(true);
        feld.setLayout(new GridLayout(3,3));
     
        for(int i=0;i<9;i++){
        b[i] = new JButton();
        feld.add(b[i]);
        final int Counts = i;
        b[i].setVisible(true);
        feld.setLocationRelativeTo(null);
        b[i].addActionListener(new ActionListener()
     
        {
            @Override
            public void actionPerformed(ActionEvent e){
             
                Object press = e.getSource();
                for(int k=0;k<9;k++){
                    if(press == b[Counts]){
                        if(turn%2==0){
                            ((JButton)e.getSource()).setText("X");
                            turn++;
                            ((JButton)e.getSource()).setEnabled(false);
                            v++;
        }else{
            ((JButton)e.getSource()).setText("O");
            turn++;
            ((JButton)e.getSource()).setEnabled(false);
            v++;
        }
     
        //Buttons klickbar machen, ersten Schritte für TicTacToe
     
    }
if(k==8 && press == b[8])
JOptionPane.showMessageDialog(null, "Unentschieden");
 
}
checkForWin();
}
});

  

}

}
public boolean checkForWin(){ // DAS PROBLEM LIEGT WAHRSCHEINLICH HIER!
    if(b[0].getText().matches(b[1].getText()) && b[1].getText().matches(b[2].getText())||
            b[0].getText().matches(b[3].getText()) && b[3].getText().matches(b[6].getText())||
            b[0].getText().matches(b[4].getText()) && b[4].getText().matches(b[8].getText())||
            b[1].getText().matches(b[4].getText()) && b[4].getText().matches(b[7].getText())||
            b[3].getText().matches(b[4].getText()) && b[4].getText().matches(b[5].getText())||
            b[6].getText().matches(b[7].getText()) && b[7].getText().matches(b[8].getText())){
            JOptionPane.showMessageDialog(null, "Win");
          
}

return true;
}
}


MfG painting
 

javampir

Bekanntes Mitglied
hi,
iwo ist ein grundsatzfehler. wenn du saubere einrückungen machen würdest, wäre das nicht passiert. du gibst in jedem fall true zurück (ist die letzte anweisung der methode, ist von keinem if umgeben und es gibt auch sinst keine returns davor)
javampir
 

strußi

Top Contributor
wenn du nicht weiter kommst lass dir doch die boolwerte ausgeben, die du bei deinen abfragen erhälst, dabei ist mir aufgefallen,
1. das deine turnvariable nicht linear ansteigt. sonst könntst du in der checkForWin() erst ab dem 5 zug testen ob jemand gewonnen hat, weil vorher jeder nur 2 felder belegt hat.
2. ein returnvalue wird nicht abgefragt oder irgendwie weiterverwendet.

sauber gestallteter code
Java:
import javax.swing.*;
[LIST=1]
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class GUI{
  public static void main( String[] args){
  GUI gui=new GUI();
  }
  private final JFrame feld;
  JButton[] b = new JButton[9];
  int turn = 1;
  int v=0;
  public GUI(){
  //Spielfeld wird erstellt+Buttons erzeugt
  feld = new JFrame("TicTacToe");
  feld.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  feld.setSize(600,600);
 
  feld.setVisible(true);
  feld.setLayout(new GridLayout(3,3));
 
  for(int i=0;i<9;i++){
  b[i] = new JButton();
  feld.add(b[i]);
  final int Counts = i;
  b[i].setVisible(true);
  feld.setLocationRelativeTo(null);
  b[i].addActionListener(new ActionListener(){
  @Override
  public void actionPerformed(ActionEvent e){
  Object press = e.getSource();
  for(int k=0;k<9;k++){
  if(press == b[Counts]){
  if(turn%2==0){
  ((JButton)e.getSource()).setText("X");
  turn++;
  ((JButton)e.getSource()).setEnabled(false);
  v++;
  }else{
  ((JButton)e.getSource()).setText("O");
  turn++;
  ((JButton)e.getSource()).setEnabled(false);
  v++;
  }
  }
  }
  checkForWin();
  }
  });
  }
  }
  public boolean checkForWin(){ // DAS PROBLEM LIEGT WAHRSCHEINLICH HIER!
  System.out.println( turn);
  if( turn >=6){
  System.out.println("0/0 mit 1/0" + b[0].getText().matches(b[1].getText()));
  System.out.println("1/0 mit 2/0" + b[1].getText().matches(b[2].getText()));
   
  if( b[0].getText().matches(b[1].getText()) && b[1].getText().matches(b[2].getText())|
  b[0].getText().matches(b[3].getText()) && b[3].getText().matches(b[6].getText())|
  b[0].getText().matches(b[4].getText()) && b[4].getText().matches(b[8].getText())|
  b[1].getText().matches(b[4].getText()) && b[4].getText().matches(b[7].getText())|
  b[3].getText().matches(b[4].getText()) && b[4].getText().matches(b[5].getText())|
  b[6].getText().matches(b[7].getText()) && b[7].getText().matches(b[8].getText())){
  JOptionPane.showMessageDialog(null, "Win");   
  } else if( true){ //unentschieden
  JOptionPane.showMessageDialog(null, "Unentschieden");
  } //else keine meldung
  }
  return true;
  }
}
[/LIST]
 

painting

Neues Mitglied
Hallo,

leider hilft mir deine Aussage gar nichts javampir, weil du nur sagt, dass ich es anders machen soll, aber mir nicht helfen kannst und ich nicht weiß wie ich das ganze neu anordnen soll, bin halt leider noch ein Einsteiger.

Bezüglich strußi, tut mir Leid, aber das ist ja gar nicht das Problem, sondern das Problem besteht darin, dass er mir bei jedem Button klick "Gewonnen" anzeigt und durch dich jetzt "Untentschieden" :). Das Problem dabei ist nicht, dass er erst nach 5 Zügen testen soll, weil er ja trotzdem jedes mal nachguckt und theoretisch selbst nach einer bestimmten Anzahl von turns und des ausführen der checkForWin() z.B. die letzten drei auf dem Text "" haben könnte.

Ich weiß, das return sowie boolean unnötig sind, aber das ist wiederum ja eigentlich egal in diesem Fall ob void, boolean oder irgendwas, es geht ja nur darum ob er die Methode richtig ausführt.

MfG
 

strußi

Top Contributor
die ausgabe für unentschieden musst du natürlich noch anpassen, die arbeit habe ich mir jetzt nicht gemacht.

dein Problem mit der ausgabe ist, dass sobald du deinen ersten button klickst, er testet ob irgendwo eine dreierkobo ist, darunter fallen auch "", und deshalb erhälst du ein win schon ab dem ersten klick.

hab das ganze jetzt soweit angepasst, das du spielen kannst, ohne gleich eine Meldung zu bekommen
Java:
public class GUI{
 
    public static void main( String[] args){
        GUI gui=new GUI();
    }
    private final JFrame feld;
    JButton[] b = new JButton[9];
    int turn = 1;
 
    public GUI(){
        //Spielfeld wird erstellt+Buttons erzeugt
        feld = new JFrame("TicTacToe");
        feld.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        feld.setSize(600,600);
  
        feld.setVisible(true);
        feld.setLayout(new GridLayout(3,3));
  
        for(int i=0;i<9;i++){
            b[i] = new JButton();
            feld.add(b[i]);
            final int Counts = i;
            b[i].setVisible(true);
            feld.setLocationRelativeTo(null);
            b[i].addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e){
                    Object press = e.getSource();
                    String currendPlayer=null;
                    for(int k=0;k<9;k++){
                        if(press == b[Counts]){
                            if(turn%2==0){
                                ((JButton)e.getSource()).setText("X");
                                ((JButton)e.getSource()).setEnabled(false);
                                currendPlayer ="X";
                            }else{
                                ((JButton)e.getSource()).setText("O");
                                ((JButton)e.getSource()).setEnabled(false);
                                currendPlayer ="O";
                            }
                        }
                    }
                    turn++;
                    if( checkForWin( currendPlayer)){
                        for( JButton bi :b){
                            bi.setEnabled( false);
                        }
                    }
                }
            });
        }
    }
 
    public boolean checkForWin( String player){ // DAS PROBLEM LIEGT WAHRSCHEINLICH HIER!
        if( turn >=4){
            //erste Zeile
            System.out.println("Zeile 1");
            System.out.println("0/0 mit 1/0" +b[0].getText().matches(b[1].getText()));
            System.out.println("1/0 mit 2/0" +b[1].getText().matches(b[2].getText()));
            //zweite Zeile
            System.out.println("Zeile 2");
            System.out.println("1/0 mit 1/1" +b[3].getText().matches(b[4].getText()));
            System.out.println("1/1 mit 1/2" +b[4].getText().matches(b[5].getText()));
            //dritte Zeile
            System.out.println("Zeile 3");
            System.out.println("2/0 mit 2/1" +b[6].getText().matches(b[7].getText()));
            System.out.println("2/1 mit 2/2" +b[7].getText().matches(b[8].getText()));
         
            //erste Spalte
            System.out.println("Spalte 1");
            System.out.println("0/0 mit 0/1" +b[0].getText().matches(b[3].getText()));
            System.out.println("0/1 mit 0/2" +b[3].getText().matches(b[6].getText()));
            //zweite Spalte
            System.out.println("Spalte 2");
            System.out.println("1/0 mit 1/1" +b[1].getText().matches(b[4].getText()));
            System.out.println("1/1 mit 1/2" +b[4].getText().matches(b[7].getText()));
            //dritte Spalte
            System.out.println("Spalte 3");
            System.out.println("2/0 mit 2/1" +b[2].getText().matches(b[5].getText()));
            System.out.println("2/1 mit 2/2" +b[5].getText().matches(b[8].getText()));
         
            //links oben ->rechts unten
            System.out.println("Diagonale 1");
            System.out.println("0/0 mit 1/1" +b[0].getText().matches(b[4].getText()));
            System.out.println("1/1 mit 2/2" +b[4].getText().matches(b[8].getText()));
            //links unten ->rechts oben
            System.out.println("Diagonale 2");
            System.out.println("2/0 mit 1/1" +b[6].getText().matches(b[4].getText()));
            System.out.println("1/1 mit 0/2" +b[4].getText().matches(b[2].getText()));
                 
            if( b[0].getText().matches(b[1].getText()) && b[1].getText().matches(b[2].getText())||
                b[0].getText().matches(b[3].getText()) && b[3].getText().matches(b[6].getText())||
                b[0].getText().matches(b[4].getText()) && b[4].getText().matches(b[8].getText())||
                b[1].getText().matches(b[4].getText()) && b[4].getText().matches(b[7].getText())||
                b[3].getText().matches(b[4].getText()) && b[4].getText().matches(b[5].getText())||
                b[6].getText().matches(b[7].getText()) && b[7].getText().matches(b[8].getText())){
                JOptionPane.showMessageDialog(null, "Win for" +player);
                return true;
            } else if( turn ==8){ //unentschieden
                JOptionPane.showMessageDialog(null, "Unentschieden");
                return false;
            } //else keine meldung
        }
        return false;
    }

das einzige was noch nicht ganz funktioniert is das mit dem unentschieden. aber das bekommst du sicher auch noch raus
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
C Problem TicTacToe Java Basics - Anfänger-Themen 6
0 TicTacToe, Problem mit den Checkbox-Aktionen Java Basics - Anfänger-Themen 6
kulturfenster Problem bei TicTacToe Java Basics - Anfänger-Themen 11
K TicTacToe belegtes feld nicht neu besetzbar Java Basics - Anfänger-Themen 1
K TicTacToe belegtes Feld nicht neu besetzbar Java Basics - Anfänger-Themen 3
enesss tictactoe spiel Java Basics - Anfänger-Themen 5
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
TicTacToe Java Basics - Anfänger-Themen 6
C TicTacToe Java Basics - Anfänger-Themen 2
A Überprüfung für unentschieden in TicTacToe Java Basics - Anfänger-Themen 10
A Überprüfung in TicTacToe Java Basics - Anfänger-Themen 5
A TicTacToe Java Basics - Anfänger-Themen 8
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
K Fehler beim Programmieren von TicTacToe Java Basics - Anfänger-Themen 12
J TicTacToe Java Basics - Anfänger-Themen 2
A TicTacToe funktioniert bis auf "schiefer" Sieg Java Basics - Anfänger-Themen 6
shiroX Input/Output TicTacToe-Savegame Java Basics - Anfänger-Themen 1
shiroX Methoden Mögliche Spielstände bei TicTacToe Java Basics - Anfänger-Themen 14
M Array und Objektorientierung? - TicTacToe Spiel Java Basics - Anfänger-Themen 43
Z TicTacToe mit Array Java Basics - Anfänger-Themen 6
T TicTacToe Spielfeld Java Basics - Anfänger-Themen 7
B TicTacToe Java Basics - Anfänger-Themen 2
S TicTacToe Java Basics - Anfänger-Themen 4
I TicTacToe blöde KI Java Basics - Anfänger-Themen 2
I Fehler bei TicTacToe Java Basics - Anfänger-Themen 108
G TicTacToe KI Java Basics - Anfänger-Themen 15
P 3D TicTacToe - Unentschieden Java Basics - Anfänger-Themen 5
G Tictactoe Java Basics - Anfänger-Themen 9
B TicTacToe Programmieren Java Basics - Anfänger-Themen 2
M Einfaches TicTacToe Programm Java Basics - Anfänger-Themen 19
H TicTacToe Fehler beim Compilieren Java Basics - Anfänger-Themen 7
cizzo TicTacToe Java Basics - Anfänger-Themen 6
W TicTacToe - Porblem mit dem Code.. Java Basics - Anfänger-Themen 5
H Hilfe bei TicTacToe mit jEdit Java Basics - Anfänger-Themen 7
N brauche hilfe zu tictactoe Java Basics - Anfänger-Themen 2
P Ein einfaches Spiel: TicTacToe. Fehler und Vorschläge Java Basics - Anfänger-Themen 3
H TicTacToe: Zeit zwischen Zügen lassen Java Basics - Anfänger-Themen 9
M TicTacToe Java Basics - Anfänger-Themen 7
H TicTacToe-geeignete Klassenhierarchie Java Basics - Anfänger-Themen 3
G Hilfe bei TicTacToe Java Basics - Anfänger-Themen 2
R Best Practice Problem mit (einfacher) Doppelt-Schleife Java Basics - Anfänger-Themen 53
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19

Ähnliche Java Themen

Neue Themen


Oben