在java上用GUI界面做Tic Tac Toe游戏,加入新方法后面临运行时错误
因此,我正在制作一个具有用户友好GUI界面的井字游戏。我几乎完成了游戏,但我的checkWin功能似乎有问题。到目前为止,一切正常,直到我添加了checkWin函数及其相关参数。在我实现checkWin功能之前,你会按下一个按钮,它会被标记为X,然后会有一个自动的计算机移动,会在没有X的板上随机放置一个O。下面是代码。当我运行代码时,您按下一个按钮,小程序就会冻结,您甚至无法在没有结束任务、ctrl-alt-del。。。同样,在使用checkWin函数之前,一切正常,现在我面临一个运行时错误在java上用GUI界面做Tic Tac Toe游戏,加入新方法后面临运行时错误,java,runtime,infinite-sequence,Java,Runtime,Infinite Sequence,因此,我正在制作一个具有用户友好GUI界面的井字游戏。我几乎完成了游戏,但我的checkWin功能似乎有问题。到目前为止,一切正常,直到我添加了checkWin函数及其相关参数。在我实现checkWin功能之前,你会按下一个按钮,它会被标记为X,然后会有一个自动的计算机移动,会在没有X的板上随机放置一个O。下面是代码。当我运行代码时,您按下一个按钮,小程序就会冻结,您甚至无法在没有结束任务、ctrl-alt-del。。。同样,在使用checkWin函数之前,一切正常,现在我面临一个运行时错误 i
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class TicGUI extends JFrame
{
JFrame frame = new JFrame("TicTacToe"); //Global frame and grid button variables
JButton[][] buttons = new JButton[3][3];
JButton start = new JButton("Start"); //Create start/reset buttons for game
JButton reset = new JButton("Reset");
JOptionPane turn;
int moveCounter = 9;
boolean gameWon = false;
public TicGUI() //Tic tac default constructor which adds and dimensions Jframe
{
super();
frame.setSize(350, 450);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE); //Setting dimension of Jframe and setting parameters
frame.setVisible(true);
frame.setResizable(false);
}
private void checkWin(int row, int col)
{
if(buttons[row][0].getText()==buttons[row][1].getText()&& buttons[row][1].getText()==buttons[row][2].getText())
{
gameWon = true;
System.out.println(buttons[row][0].getText()+ " wins!!!");
}
else if(buttons[0][col].getText()==buttons[1][col].getText()&& buttons[1][col].getText()==buttons[2][col].getText())
{
gameWon = true;
System.out.println(buttons[row][0].getText()+ " wins!!!");
}
}
private void compTurn(int count)
{
int randomMove=count;
Random num = new Random();
randomMove = num.nextInt(randomMove)+1;
while(gameWon ==false)
{
for(int i = 0; i < 3; i++) //Create grid of buttons for tic tac toe game
{
for(int j = 0; j < 3; j++)
{
if(buttons[i][j].isEnabled()==true)
{
randomMove--;
if(randomMove==0 )
{
buttons[i][j].setText("O");
buttons[i][j].setEnabled(false);
moveCounter--;
checkWin(i, j);
}
}
}
}
}
}
private void initialize() //Initialize tic tac toe game board
{
JPanel mainPanel = new JPanel(new BorderLayout()); //create main panel container to put layer others on top
JPanel menu = new JPanel(new BorderLayout());
JPanel game = new JPanel(new GridLayout(3,3)); //Create two more panels with layouts for buttons
frame.add(mainPanel); //add main container panel to frame
mainPanel.setPreferredSize(new Dimension(325,425));
menu.setPreferredSize(new Dimension(300,50)); //Setting dimensions of panels
game.setPreferredSize(new Dimension(300,300));
mainPanel.add(menu, BorderLayout.NORTH); //Add two panels to the main container panel
mainPanel.add(game, BorderLayout.SOUTH);
menu.add(start, BorderLayout.WEST); //Add both start/reset buttons to menu container panel
menu.add(reset, BorderLayout.EAST);
start.addActionListener(new myActionListener());
reset.addActionListener(new myActionListener());
for(int i = 0; i < 3; i++) //Create grid of buttons for tic tac toe game
{
for(int j = 0; j < 3; j++)
{
buttons[i][j] = new JButton(); //Instantiating buttons
buttons[i][j].setText("");
buttons[i][j].setVisible(true);
game.add(buttons[i][j]);
buttons[i][j].addActionListener(new myActionListener()); //Adding response event to buttons
}
}
}
private class myActionListener implements ActionListener
{ //Implementing action listener for buttons
public void actionPerformed(ActionEvent a)
{
//Display X's or O's on the buttons
if(a.getSource() == buttons[0][0]) //Checking which button is pressed
{
buttons[0][0].setText("X");
buttons[0][0].setEnabled(false);
moveCounter--;
compTurn(moveCounter);
checkWin(0,0);
}
else if(a.getSource() == buttons[0][1])
{
buttons[0][1].setText("X");
buttons[0][1].setEnabled(false);
moveCounter--;
compTurn(moveCounter);
checkWin(0,1);
}
else if(a.getSource() == buttons[1][0])
{
buttons[1][0].setText("X");
buttons[1][0].setEnabled(false);
moveCounter--;
compTurn(moveCounter);
checkWin(1,0);
}
else if(a.getSource() == buttons[1][1])
{
buttons[1][1].setText("X");
buttons[1][1].setEnabled(false);
moveCounter--;
compTurn(moveCounter);
checkWin(1,1);
}
else if(a.getSource() == buttons[1][2])
{
buttons[1][2].setText("X");
buttons[1][2].setEnabled(false);
moveCounter--;
compTurn(moveCounter);
checkWin(1,2);
}
else if(a.getSource() == buttons[2][2])
{
buttons[2][2].setText("X");
buttons[2][2].setEnabled(false);
moveCounter--;
compTurn(moveCounter);
checkWin(2,2);
}
else if(a.getSource() == buttons[0][2])
{
buttons[0][2].setText("X");
buttons[0][2].setEnabled(false);
moveCounter--;
compTurn(moveCounter);
checkWin(0,2);
}
else if(a.getSource() == buttons[2][1])
{
buttons[2][1].setText("X");
buttons[2][1].setEnabled(false);
moveCounter--;
compTurn(moveCounter);
checkWin(2,1);
}
else if(a.getSource() == buttons[2][0])
{
buttons[2][0].setText("X");
buttons[2][0].setEnabled(false);
moveCounter--;
compTurn(moveCounter);
checkWin(2,0);
}
else if(a.getSource() == start)
{
turn = new JOptionPane("Do you want to go first?\n",JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION);
start.setEnabled(false);
}
else if(a.getSource() == reset)
{
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
buttons[i][j].setText("");
buttons[i][j].setEnabled(true);
gameWon = false;
}
}
}
}
}
public static void main(String[] args)
{
TicGUI game = new TicGUI(); //main method and instantiating tic tac object and calling initialize function
game.initialize();
}
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
导入java.util.*;
公共类TicGUI扩展了JFrame
{
JFrame frame=newjframe(“TicTacToe”);//全局帧和网格按钮变量
JButton[][]按钮=新JButton[3][3];
JButton start=newjbutton(“start”);//为游戏创建开始/重置按钮
JButton reset=新JButton(“reset”);
JOptionPane-turn;
int moveCounter=9;
布尔gameWon=false;
public TicGUI()//Tic tac默认构造函数,用于添加和标注Jframe
{
超级();
框架。设置尺寸(350450);
frame.setDefaultCloseOperation(在关闭时退出);//设置Jframe的维度和设置参数
frame.setVisible(true);
frame.setresizeable(false);
}
私有void checkWin(整数行,整数列)
{
如果(按钮[行][0]。getText()==按钮[行][1]。getText()&&按钮[行][1]。getText()==按钮[行][2]。getText())
{
gameWon=true;
System.out.println(按钮[行][0].getText()+“wins!!!”;
}
else if(按钮[0][col].getText()==按钮[1][col].getText()&&buttons[1][col].getText()==按钮[2][col].getText())
{
gameWon=true;
System.out.println(按钮[行][0].getText()+“wins!!!”;
}
}
私用空密码(整数计数)
{
int随机移动=计数;
随机数=新随机数();
随机移动=num.nextInt(随机移动)+1;
while(gameWon==false)
{
for(inti=0;i<3;i++)//为井字游戏创建按钮网格
{
对于(int j=0;j<3;j++)
{
如果(按钮[i][j].isEnabled()==true)
{
随机移动--;
如果(随机移动==0)
{
按钮[i][j].setText(“O”);
按钮[i][j].setEnabled(假);
移动计数器--;
checkWin(i,j);
}
}
}
}
}
}
私有void initialize()//初始化tic tac toe游戏板
{
JPanel mainPanel=new JPanel(new BorderLayout());//创建主面板容器以将其他层放在顶部
JPanel菜单=新建JPanel(新建边框布局());
JPanel game=newjpanel(newgridlayout(3,3));//再创建两个带有按钮布局的面板
frame.add(mainPanel);//将主容器面板添加到frame
主面板。设置首选尺寸(新尺寸(325425));
menu.setPreferredSize(新尺寸(300,50));//设置面板尺寸
game.setPreferredSize(新维度(300300));
mainPanel.add(menu,BorderLayout.NORTH);//向主容器面板添加两个面板
主面板。添加(游戏,边界布局。南);
menu.add(start,BorderLayout.WEST);//将两个开始/重置按钮添加到菜单容器面板
菜单。添加(重置,边界布局。东);
start.addActionListener(新的myActionListener());
reset.addActionListener(新的myActionListener());
for(inti=0;i<3;i++)//为井字游戏创建按钮网格
{
对于(int j=0;j<3;j++)
{
按钮[i][j]=新的JButton();//实例化按钮
按钮[i][j].setText(“”);
按钮[i][j]。设置可见(真);
添加(按钮[i][j]);
按钮[i][j].addActionListener(新的myActionListener());//向按钮添加响应事件
}
}
}
私有类myActionListener实现ActionListener
{//实现按钮的操作侦听器
已执行的公共无效操作(操作事件a)
{
//在按钮上显示X或O
if(a.getSource()==按钮[0][0])//检查按下了哪个按钮
{
按钮[0][0].setText(“X”);
按钮[0][0]。设置已启用(false);
移动计数器--;
compTurn(移动计数器);
checkWin(0,0);
}
else if(a.getSource()==按钮[0][1])
{
按钮[0][1].setText(“X”);
按钮[0][1]。设置已启用(false);
移动计数器--;
compTurn(移动计数器);
checkWin(0,1);
}
else if(a.getSource()==按钮[1][0])
{
按钮[1][0].setText(“X”);
按钮[1][0]。设置已启用(false);
移动计数器--;
compTurn(移动计数器);
checkWin(1,0);
}
else if(a.getSource()==按钮[1][1])
{
按钮[1][1].setText(“X”);
按钮[1][1]。设置启用(false);
移动计数器--;
compTurn(移动计数器);
checkWin(1,1);
}
else if(a.getSource()==按钮[1][2])
{
按钮[1][2].setText(“X”);
按钮[1][2]。设置启用(false);
移动计数器--;
compTurn(移动计数器);
checkWin(1,2);
}
其他的
buttons[row][0].getText().equals(buttons[row][1].getText())
buttons[row][0].getText()==buttons[row][1].getText()
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.JOptionPane;
class TicGUI extends JFrame
{
JButton[][] buttons = new JButton[3][3];
JFrame frame = new JFrame("TicTacToe"); //Global frame and grid button variables
JButton reset = new JButton("Reset"); //Create reset button for game
JOptionPane turn;
int moveCounter = 9;
boolean gameWon = false;
int WhoseTurn = 1;
public TicGUI() //Tic tac default constructor which adds and dimensions Jframe
{
super();
frame.setSize(350, 355);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE); //Setting dimension of Jframe and setting parameters
frame.setVisible(true);
frame.setResizable(false);
JButton[][] buttons = new JButton[3][3];
JFrame frame = new JFrame("TicTacToe"); //Global frame and grid button variables
JButton reset = new JButton("Reset"); //Create reset button for game
JOptionPane turn;
}
private void checkWin(int row, int col)
{
try {
if (buttons[0][2].getText()==buttons[1][2].getText()&& buttons[1][2].getText()==buttons[2][2].getText()&& buttons[2][2].getText()==buttons[0][2].getText()&& buttons[1][2].getText()!="")
{
gameWon = true;
WhoseTurn = 0;
System.out.println(buttons[1][2].getText()+ " wins!!!");
JOptionPane.showMessageDialog(frame, buttons[1][2].getText()+ " wins!!!");
}
if (buttons[0][1].getText()==buttons[1][1].getText()&& buttons[1][1].getText()==buttons[2][1].getText()&& buttons[2][1].getText()==buttons[0][1].getText()&& buttons[1][1].getText()!="")
{
gameWon = true;
WhoseTurn = 0;
System.out.println(buttons[1][1].getText()+ " wins!!!");
JOptionPane.showMessageDialog(frame, buttons[1][1].getText()+ " wins!!!");
}
if (buttons[0][0].getText()==buttons[1][0].getText()&& buttons[1][0].getText()==buttons[2][0].getText()&& buttons[2][0].getText()==buttons[0][0].getText()&& buttons[1][0].getText()!="")
{
gameWon = true;
WhoseTurn = 0;
System.out.println(buttons[1][0].getText()+ " wins!!!");
JOptionPane.showMessageDialog(frame, buttons[1][0].getText()+ " wins!!!");
}
if (buttons[2][0].getText()==buttons[2][1].getText()&& buttons[2][1].getText()==buttons[2][2].getText()&& buttons[2][2].getText()==buttons[2][0].getText()&& buttons[2][1].getText()!="")
{
gameWon = true;
WhoseTurn = 0;
System.out.println(buttons[2][1].getText()+ " wins!!!");
JOptionPane.showMessageDialog(frame, buttons[2][1].getText()+ " wins!!!");
}
if (buttons[1][0].getText()==buttons[1][1].getText()&& buttons[1][1].getText()==buttons[1][2].getText()&& buttons[1][2].getText()==buttons[1][0].getText()&& buttons[1][1].getText()!="")
{
gameWon = true;
WhoseTurn = 0;
System.out.println(buttons[1][1].getText()+ " wins!!!");
JOptionPane.showMessageDialog(frame, buttons[1][1].getText()+ " wins!!!");
}
if (buttons[0][0].getText()==buttons[0][1].getText()&& buttons[0][1].getText()==buttons[0][2].getText()&& buttons[0][2].getText()==buttons[0][0].getText()&& buttons[0][1].getText()!="")
{
gameWon = true;
WhoseTurn = 0;
System.out.println(buttons[0][1].getText()+ " wins!!!");
JOptionPane.showMessageDialog(frame, buttons[0][1].getText()+ " wins!!!");
}
if (buttons[0][0].getText()==buttons[1][1].getText()&& buttons[1][1].getText()==buttons[2][2].getText()&& buttons[2][2].getText()==buttons[0][0].getText()&& buttons[1][1].getText()!="")
{
gameWon = true;
WhoseTurn = 0;
System.out.println(buttons[1][1].getText()+ " wins!!!");
JOptionPane.showMessageDialog(frame, buttons[1][1].getText()+ " wins!!!");
}
if (buttons[0][2].getText()==buttons[1][1].getText()&& buttons[1][1].getText()==buttons[2][0].getText()&& buttons[2][0].getText()==buttons[0][2].getText()&& buttons[1][1].getText()!="")
{
gameWon = true;
WhoseTurn = 0;
System.out.println(buttons[1][1].getText()+ " wins!!!");
JOptionPane.showMessageDialog(frame, buttons[1][1].getText()+ " wins!!!");
}
}catch(Exception e) {
gameWon = true;
WhoseTurn = 0;
System.out.println("Stalemate");
JOptionPane.showMessageDialog(frame, "Stalemate");
}
}
private void compTurn(int count)
{
int randomMove=count;
Random num = new Random();
randomMove = num.nextInt(randomMove)+1;
while(gameWon ==false & WhoseTurn ==2)
{
for(int i = 0; i < 3; i++) //Create grid of buttons for tic tac toe game
{
for(int j = 0; j < 3; j++)
{
if(buttons[i][j].isEnabled()==true)
{
randomMove--;
if(randomMove==0 )
{
buttons[i][j].setText("O");
buttons[i][j].setEnabled(false);
moveCounter--;
checkWin(i, j);
WhoseTurn = 1;
}
}
}
}
}
}
private void initialize() //Initialize tic tac toe game board
{
JPanel mainPanel = new JPanel(new BorderLayout()); //create main panel container to put layer others on top
JPanel menu = new JPanel(new BorderLayout());
JPanel game = new JPanel(new GridLayout(3,3)); //Create two more panels with layouts for buttons
frame.add(mainPanel); //add main container panel to frame
mainPanel.setPreferredSize(new Dimension(325,425));
menu.setPreferredSize(new Dimension(300,50)); //Setting dimensions of panels
game.setPreferredSize(new Dimension(300,300));
mainPanel.add(menu, BorderLayout.NORTH); //Add two panels to the main container panel
mainPanel.add(game, BorderLayout.SOUTH);
//Add both start/reset buttons to menu container panel
menu.add(reset, BorderLayout.NORTH);
reset.addActionListener(new myActionListener());
for(int i = 0; i < 3; i++) //Create grid of buttons for tic tac toe game
{
for(int j = 0; j < 3; j++)
{
buttons[i][j] = new JButton(); //Instantiating buttons
buttons[i][j].setText("");
buttons[i][j].setVisible(true);
game.add(buttons[i][j]);
buttons[i][j].addActionListener(new myActionListener()); //Adding response event to buttons
}
}
}
private class myActionListener implements ActionListener
{ //Implementing action listener for buttons
public void actionPerformed(ActionEvent a)
{
//Display X's or O's on the buttons
if(gameWon == false)
{
if(a.getSource() == buttons[0][0]) //Checking which button is pressed
{
buttons[0][0].setText("X");
buttons[0][0].setEnabled(false);
WhoseTurn = 2;
moveCounter--;
compTurn(moveCounter);
checkWin(0,0);
}
else if(a.getSource() == buttons[0][1])
{
buttons[0][1].setText("X");
buttons[0][1].setEnabled(false);
WhoseTurn = 2;
moveCounter--;
compTurn(moveCounter);
checkWin(0,1);
}
else if(a.getSource() == buttons[1][0])
{
buttons[1][0].setText("X");
buttons[1][0].setEnabled(false);
WhoseTurn = 2;
moveCounter--;
compTurn(moveCounter);
checkWin(1,0);
}
else if(a.getSource() == buttons[1][1])
{
buttons[1][1].setText("X");
buttons[1][1].setEnabled(false);
WhoseTurn = 2;
moveCounter--;
compTurn(moveCounter);
checkWin(1,1);
}
else if(a.getSource() == buttons[1][2])
{
buttons[1][2].setText("X");
buttons[1][2].setEnabled(false);
WhoseTurn = 2;
moveCounter--;
compTurn(moveCounter);
checkWin(1,2);
}
else if(a.getSource() == buttons[2][2])
{
buttons[2][2].setText("X");
buttons[2][2].setEnabled(false);
WhoseTurn = 2;
moveCounter--;
compTurn(moveCounter);
checkWin(2,2);
}
else if(a.getSource() == buttons[0][2])
{
buttons[0][2].setText("X");
buttons[0][2].setEnabled(false);
WhoseTurn = 2;
moveCounter--;
compTurn(moveCounter);
checkWin(0,2);
}
else if(a.getSource() == buttons[2][1])
{
buttons[2][1].setText("X");
buttons[2][1].setEnabled(false);
WhoseTurn = 2;
moveCounter--;
compTurn(moveCounter);
checkWin(2,1);
}
else if(a.getSource() == buttons[2][0])
{
buttons[2][0].setText("X");
buttons[2][0].setEnabled(false);
WhoseTurn = 2;
moveCounter--;
compTurn(moveCounter);
checkWin(2,0);
}
}
if(a.getSource() == reset)
{
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
gameWon = false;
buttons[i][j].setText("");
buttons[i][j].setEnabled(true);
moveCounter = 9;
WhoseTurn = 1;
}
}
}
}
}
public static void main(String[] args)
{
TicGUI game = new TicGUI(); //main method and instantiating tic tac object and calling initialize function
game.initialize();
}
}