2016-09-08 28 views
0

我想尝试评估游戏以下井字游戏中的获胜状态。评估井字游戏的获胜状态

所以我最终会做通常试图使用上的按钮getText()方法在for循环和评估,例如,如果cells[0][i].getText()等于cells[0][1]cells[0][2]
然后我看看cells[0][2]是不是空白(所以不等于" "),那么这将完成第一行。
问题是,这是行不通的,如果有人为我提供了一种更好的替代方法,如果有的话,我将不胜感激。

package tictactoe; 

import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 

import javax.swing.JFrame; 

public class TicTacToe implements ActionListener 
{ 
    JFrame window; 
    static JButton[][]cells=new JButton[3][3]; 
    boolean playing; 
    char turn='X'; 
     public TicTacToe() 
     { 
      //SETS UP THE WINDOW 
      window=new JFrame("TicTacToe"); 
      window.setSize(new Dimension(400,400)); 
      window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      window.setResizable(false); 
      //**********************// 
      createCells(); 

      window.setVisible(true); 
     } 
public static void main(String[] args) 
{ 
    new TicTacToe(); 
} 
private void createCells() 
{ 
    window.setLayout(new GridLayout(3,3)); 
    for(int i=0;i<cells.length;i++) 
    { 
     for(int j=0;j<cells.length;j++) 
     { 
      cells[i][j]=new JButton(); 
      cells[i][j].addActionListener(this); 
      window.add(cells[i][j]); 
     } 
    } 
} 

@Override 
public void actionPerformed(ActionEvent e) 
{ 
    playing=true; 
    JButton _buttonPressed=(JButton)e.getSource(); 
     while(playing) 
     { 
      if(turn=='X') 
      { 
      _buttonPressed.setText("X"); 
      _buttonPressed.setEnabled(false); 
      turn='O'; 
      } 
      else 
      { 
       _buttonPressed.setText("O"); 
       _buttonPressed.setEnabled(false); 
      } 
    } 

} 
} 
+0

你试过步骤虽然使用调试器程序? –

回答

2

我没有看到你在评估获胜状态,但尝试从点击监听器中删除无限循环。

@Override 
public void actionPerformed(ActionEvent e) { 
    JButton _buttonPressed = (JButton) e.getSource(); 

    _buttonPressed.setText("" + turn); 
    _buttonPressed.setEnabled(false); 
    if (turn == 'X') { 
     turn = 'O'; 
    } else { 
     turn = 'X'; 
    } 
} 

而这些大多是建议,可以随意忽略这一点,如果你想。

使TicTacToe类成为JFrame本身 - 无需实例化。

public class TicTacToe extends JFrame implements ActionListener { 
    private JButton[][] cells = new JButton[3][3]; 
    private char turn = 'X'; 
    private boolean playing; 

    public TicTacToe() { 
     setTitle("TicTacToe"); 
     setSize(new Dimension(400, 400)); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 
     createCells(); 
     pack(); 
    } 

其次,启动Swing应用程序推荐的方式,是在自己的线程,像这样

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      TicTacToe ttt = new TicTacToe(); 
      ttt.setVisible(true); 
     } 
    }); 
} 
+0

谢谢你好先生我意识到我没有发布游戏状态方法,但当我删除循环,并再次尝试它的工作,所以谢谢你! – Twoshock

0

好方法寻找井字棋的赢家:

你只需要检查用户的最后一招是否导致棋盘进入获胜状态。您还知道用户在位置板[x] [y]处放置了X或O.

它会是这个样子:

public bool gameOver(cells, x, y) 
    if cells[0,y] == cells[1,y] == cells[2,y] 
     //win on vertical line 
    if cells[x,0] == cells[x,1] == cells[x,2] 
     //win on horizontal line 
    if x == y and cells[0,0] == cells[1,1] == cells[2,2] 
     //win on diagonal 
    if x == y and cells[0,2] == cells[1,1] == cells[2,0] 
     //win on other diagonal 
    return false