我正在使用改进的JButton进行Tic Tac Toe游戏。现在我一直坚持确定是否有人赢了。解决方案看似简单:检查连续三个图标是否相同。当我点击(在游戏中转弯)时,JButton会设置正确的图像(X或O)。但是,当我稍后调用相应按钮的getIcon()来检查是否有赢家时,它会返回" null,"不是我之前设置的图标,即使游戏中的图像看起来很好。我认为问题在于程序处理/运行的顺序;不过,我可能完全错了。感谢任何帮助,谢谢!
代码:
主类:
import javax.swing.*;
public class ticTacToeMain{
public static void main(String[]args){
boolean winner = false;
ticTacToeBoard theBoard = new ticTacToeBoard();
theBoard.setTitle("Tic Tac Toe");
theBoard.setSize(theBoard.getWidth(),theBoard.getHeight());
theBoard.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
theBoard.setVisible(true);
winner = theBoard.checkWinner(theBoard.buttons);
if(winner == true)
System.exit(0); //I have this only temporarily so that I know if it actually works
}
}
董事会成员:
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridLayout;
public class ticTacToeBoard extends JFrame{
int w = 600;
int h = 600;
int turn = 0;
JPanel panel = new JPanel();
TTTButton buttons[]=new TTTButton[9];
public ticTacToeBoard(){
panel.setLayout(new GridLayout(3,3));
for(int i=0; i<9; i++){
buttons[i]=new TTTButton();
panel.add(buttons[i]);
}
add(panel);
panel.setVisible(true);
}
public int getWidth(){
return w;
}
public int getHeight(){
return h;
}
public boolean checkWinner(TTTButton[]buttonArray){
if (buttonArray[0].getIcon() == buttonArray[1].getIcon() && buttonArray[0] == buttonArray[2].getIcon() && buttonArray[0] != null)
return true;
else if (buttonArray[3].getIcon() == buttonArray[4].getIcon() && buttonArray[3] == buttonArray[5].getIcon() && buttonArray[3] != null)
return true;
else if (buttonArray[6].getIcon() == buttonArray[7].getIcon() && buttonArray[6] == buttonArray[8].getIcon() && buttonArray[6] != null)
return true;
else if (buttonArray[0].getIcon() == buttonArray[3].getIcon() && buttonArray[0] == buttonArray[6].getIcon() && buttonArray[0] != null)
return true;
else if (buttonArray[1].getIcon() == buttonArray[4].getIcon() && buttonArray[0] == buttonArray[7].getIcon() && buttonArray[1] != null)
return true;
else if (buttonArray[2].getIcon() == buttonArray[5].getIcon() && buttonArray[0] == buttonArray[8].getIcon() && buttonArray[2] != null)
return true;
else if (buttonArray[0].getIcon() == buttonArray[4].getIcon() && buttonArray[0] == buttonArray[8].getIcon() && buttonArray[0] != null)
return true;
else if (buttonArray[2].getIcon() == buttonArray[4].getIcon() && buttonArray[0] == buttonArray[6].getIcon() && buttonArray[0] != null)
return true;
else
return false;
}
}
按钮类:
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
public class TTTButton extends JButton implements ActionListener{
static boolean winner = false;
static int turn = 0;
ImageIcon iconX;
ImageIcon iconO;
public TTTButton(){
iconX = new ImageIcon("C:\\Users\\Aaron\\Pictures\\Logo_stx.png");
iconO = new ImageIcon("C:\\Users\\Aaron\\Pictures\\ohiostateO.jpg");
this.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
if (turn == 0){
setIcon(iconX);
turn+=1;
}
else if (turn == 1){
setIcon(iconO);
turn-=1;
}
}
}
答案 0 :(得分:2)
您没有在任何事件监听器中调用checkWinner(...)
,而是在程序创建时只调用一次:
public static void main(String[]args){
boolean winner = false;
ticTacToeBoard theBoard = new ticTacToeBoard();
theBoard.setTitle("Tic Tac Toe");
theBoard.setSize(theBoard.getWidth(),theBoard.getHeight());
theBoard.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
theBoard.setVisible(true);
winner = theBoard.checkWinner(theBoard.buttons); // **** here ****
}
在此位置所有图标实际上都保证为空 - 它们必须是因为还没有按下任何按钮。
解决方案很简单 - 不要在程序启动时调用此方法,而只是在按钮的ActionListener中调用它。
请注意,尝试沿着M-V-C(模型 - 视图 - 控制器)线构建该程序是一个很好的程序,以尝试将程序逻辑与GUI分离。在学习和减少代码圈复杂度方面,这将是一项值得的练习。