2017-06-19 3 views
-2

Programm nicht Erkennung:TicTacToe Swing Spiel Sieger

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class TicTacToe implements ActionListener { 
    JFrame window = new JFrame("Tic Tac Toe"); 
    JButton b[] = new JButton[9]; 

    String letter = ""; 
    ImageIcon X; 
    ImageIcon O; 
    ImageIcon ltr; 
    int value = 0; 
    boolean win = false; 

    public TicTacToe() { 
     // Assign images 
     X = new ImageIcon(getClass().getResource("X.png")); 
     O = new ImageIcon(getClass().getResource("O.png")); 
     // Create the Window 
     window.setSize(500,500); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setLayout(new GridLayout(3,3)); 

     // Add Buttons 
     for (int i = 0; i < 9; i++) { 
      b[i] = new JButton(); 
      window.add(b[i]); 
     } 

     // Add ActionListener 
     for (int i = 0; i < 9; i++) { 
      b[i].addActionListener(this); 
     } 

     window.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent a) { 
     value++; 
     // Who's Turn 
     if (value % 2 == 1) { 
      ltr = X; 
      letter = "X"; 
     } 
     if (value % 2 == 0) { 
      ltr = O; 
      letter = "O"; 
     } 

     String[] letters = new String[9]; 
     for (int i = 0; i < 9; i++) { 
      letters[i] = ""; 
     } 

     // Display Letters 
     for (int i = 0; i < 9; i++) { 
      if (a.getSource() == b[i]) { 
       b[i].setIcon(ltr); 
       b[i].setDisabledIcon(ltr); 
       b[i].setEnabled(false); 
       letters[i] = letter; 
       // Check what is printing 
       System.out.println(i + letters[i]); 
      } 
     } 

     // Who Won 

     // Horizontal 
     if (letters[0].equals(letters[1]) && letters[1].equals(letters[2]) && !letters[0].equals("")) { 
      win = true; 
     } else if (letters[3].equals(letters[4]) && letters[4].equals(letters[5]) && !letters[3].equals("")) { 
      win = true; 
     } else if (letters[6].equals(letters[7]) && letters[7].equals(letters[8]) && !letters[6].equals("")) { 
      win = true; 
     } 

     // Vertical 
     if (letters[0].equals(letters[3]) && letters[3].equals(letters[6]) && !letters[0].equals("")) { 
      win = true; 
     } else if (letters[1].equals(letters[4]) && letters[4].equals(letters[7]) && !letters[1].equals("")) { 
      win = true; 
     } else if (letters[2].equals(letters[5]) && letters[5].equals(letters[8]) && !letters[2].equals("")) { 
      win = true; 
     } 

     // Diagonal 
     if (letters[0].equals(letters[4]) && letters[4].equals(letters[8]) && !letters[0].equals("")) { 
      win = true; 
     } else if (letters[2].equals(letters[4]) && letters[4].equals(letters[6]) && !letters[2].equals("")) { 
      win = true; 
     } 

     if (win) { 
      JOptionPane.showMessageDialog(null, "Player " + letter + " wins!"); 
      for (JButton i : b) { 
       i.setEnabled(false); 
      } 
     } else if (!win && value == 9) { 
      JOptionPane.showMessageDialog(null, "The game ended in a tie."); 
     } 
    } 

    public static void main(String[] args) { 
     new TicTacToe(); 
    } 
} 

ich es ursprünglich hatte Buchstaben angezeigt werden, aber ich wollte es Bilder anzuzeigen. Um es zu überprüfen, habe ich ein String-Array erstellt. Ich habe die Icons in der for-Schleife angezeigt, während ich auch die Buchstaben zum String-Array hinzugefügt habe, damit ich sie vergleichen kann.

Es ist nicht zu erkennen, ein Gewinner, wenn es sollte, so dass es aussieht win wird nicht wahr. Es wird erkannt, wenn alle Tasten gedrückt werden.

System.out.println(i + letters[i]); 

soll überprüfen, was die Werte sind, und ich bekomme

0X 
1O 
2X 
3O 
4X 
5O 
6X 
7O 
8X 

so offensichtlich die Buchstaben in der Anordnung sind. Die if-Bedingungen werden nicht korrekt verglichen. Irgendwelche Hilfe, bitte?

+2

Während [dieses Beispiel] (https://stackoverflow.com/questions/32770321/connect-4-check-for-a-win-algorithm/32771401#32771401) für Verbindung vier ist, ist die Grundidee die gleiche – MadProgrammer

+0

Haben Sie im Debugger Ihren Code durchgegangen, um zu sehen, was die Werte sind und wie die Bedingungen bewertet werden? Bitte tu das zumindest vor dem Posten. –

+1

Sie initialisieren Ihr 'letters' Array auf jedem' actionPerformed'. Für jeden Klick gibt es also nur einen Wert im Array. Versuchen Sie, Ihr Array in den Klassenbereich zu verschieben –

Antwort

2

Sie sind auf jeder actionPerformed Ihre letters Array initialisiert.

String[] letters = new String[9]; 
for (int i = 0; i < 9; i++) { 
    letters[i] = ""; 
} 

Also für jeden Klick dort eigentlich nur ein Wert im Array ist und Sie drucken nur die aktuelle wiederum Auswahl, die Ihnen die Illusion gibt, dass Sie die Bewegungen gespeichert haben.

Um dies zu überprüfen Sie

System.out.println("Current moves: " + Arrays.toString(letters)); 

Hinzufügen versuchen könnte Und Sie werden das Problem mehr visuell sehen.

Um dieses Jahr zu beheben, verschieben Sie Ihr Array in den Klassenbereich, und Sie können es im Konstruktor initialisieren.

1

Sie speichern letters nicht. Jedes Mal, wenn Sie auf eine Schaltfläche klicken, enthält das Array "" in jeder Zelle mit Ausnahme der Zelle, auf die Sie geklickt haben. Um dieses Problem zu vermeiden, können Sie einfach letters als eine Eigenschaft Ihrer Klasse festlegen und im Konstruktor mit "" initialisieren Es würde wie folgt aussehen:

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class TicTacToe implements ActionListener { 
    JFrame window = new JFrame("Tic Tac Toe"); 
    JButton b[] = new JButton[9]; 

    String[] letters = new String[9]; 
    String letter = ""; 
    ImageIcon X; 
    ImageIcon O; 
    ImageIcon ltr; 
    int value = 0; 
    boolean win = false; 

    public TicTacToe() { 
     // Assign images 
     X = new ImageIcon(getClass().getResource("X.png")); 
     O = new ImageIcon(getClass().getResource("O.png")); 
     // Create the Window 
     window.setSize(500,500); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setLayout(new GridLayout(3,3)); 

     // Initialize letters 
     for (int i = 0; i < 9; i++) { 
      letters[i] = ""; 
     } 

     // Add Buttons 
     for (int i = 0; i < 9; i++) { 
      b[i] = new JButton(); 
      window.add(b[i]); 
     } 

     // Add ActionListener 
     for (int i = 0; i < 9; i++) { 
      b[i].addActionListener(this); 
     } 

     window.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent a) { 
     value++; 
     // Who's Turn 
     if (value % 2 == 1) { 
      ltr = X; 
      letter = "X"; 
     } 
     if (value % 2 == 0) { 
      ltr = O; 
      letter = "O"; 
     } 

     // Display Letters 
     for (int i = 0; i < 9; i++) { 
      if (a.getSource() == b[i]) { 
       b[i].setIcon(ltr); 
       b[i].setDisabledIcon(ltr); 
       b[i].setEnabled(false); 
       letters[i] = letter; 
       // Check what is printing 
       System.out.println(i + letters[i]); 
      } 
     } 

     // Who Won 

     // Horizontal 
     if (letters[0].equals(letters[1]) && letters[1].equals(letters[2]) && !letters[0].equals("")) { 
      win = true; 
     } else if (letters[3].equals(letters[4]) && letters[4].equals(letters[5]) && !letters[3].equals("")) { 
      win = true; 
     } else if (letters[6].equals(letters[7]) && letters[7].equals(letters[8]) && !letters[6].equals("")) { 
      win = true; 
     } 

     // Vertical 
     if (letters[0].equals(letters[3]) && letters[3].equals(letters[6]) && !letters[0].equals("")) { 
      win = true; 
     } else if (letters[1].equals(letters[4]) && letters[4].equals(letters[7]) && !letters[1].equals("")) { 
      win = true; 
     } else if (letters[2].equals(letters[5]) && letters[5].equals(letters[8]) && !letters[2].equals("")) { 
      win = true; 
     } 

     // Diagonal 
     if (letters[0].equals(letters[4]) && letters[4].equals(letters[8]) && !letters[0].equals("")) { 
      win = true; 
     } else if (letters[2].equals(letters[4]) && letters[4].equals(letters[6]) && !letters[2].equals("")) { 
      win = true; 
     } 

     if (win) { 
      JOptionPane.showMessageDialog(null, "Player " + letter + " wins!"); 
      for (JButton i : b) { 
       i.setEnabled(false); 
      } 
     } else if (!win && value == 9) { 
      JOptionPane.showMessageDialog(null, "The game ended in a tie."); 
     } 
    } 

    public static void main(String[] args) { 
     new TicTacToe(); 
    } 
} 
Verwandte Themen