1
我即將完成我的tictactoe遊戲,但我無法弄清楚如何讓我的重置按鈕啓動遊戲結束。我也希望比賽在有人獲勝或有平局時重置。任何幫助將不勝感激。TicTacToe GUI應用程序重置按鈕
這裏是我的代碼(遺憾的是,有這麼多的話):
package tictactoe;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
public class TicTacToe
{
public static void main(String[] args)
{
JFrame ticTacToe = new TicTacToeFrame();
ticTacToe.setTitle("Phantom TicTacToe Game!");
ticTacToe.setSize(600, 600);
ticTacToe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ticTacToe.setLocationRelativeTo(null);
ticTacToe.setVisible(true);
}
}
class TicTacToeFrame extends JFrame implements ActionListener
{
private char whoseTurn = 'X';
private boolean gameOver = false;
private Cell[][] cells = new Cell[3][3];
JLabel jlblStatus = new JLabel("X's turn to play");
public TicTacToeFrame()
{
JButton btn = new JButton("Reset");
JPanel panel = new JPanel(new GridLayout(3, 3, 0, 0));
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
panel.add(cells[i][j] = new Cell());
add(btn, BorderLayout.SOUTH);
add(panel, BorderLayout.CENTER);
add(jlblStatus, BorderLayout.NORTH);
jlblStatus.setOpaque(true);
jlblStatus.setBackground(Color.YELLOW);
}
public boolean isFull()
{
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
if (cells[i][j].getToken() == ' ')
return false;
return true;
}
public boolean isWon(char token)
{
for (int i = 0; i < 3; i++)
if ((cells[i][0].getToken() == token)
&& (cells[i][1].getToken() == token)
&& (cells[i][2].getToken() == token))
{
return true;
}
for (int j = 0; j < 3; j++)
if ((cells[0][j].getToken() == token)
&& (cells[1][j].getToken() == token)
&& (cells[2][j].getToken() == token))
{
return true;
}
if ((cells[0][0].getToken() == token)
&& (cells[1][1].getToken() == token)
&& (cells[2][2].getToken() == token))
{
return true;
}
if ((cells[0][2].getToken() == token)
&& (cells[1][1].getToken() == token)
&& (cells[2][0].getToken() == token))
{
return true;
}
return false;
}
@Override
public void actionPerformed(ActionEvent e)
{
JButton bttn = (JButton) e.getSource();
if(bttn == btn)
{
}
}
public class Cell extends JPanel
{
private char token = ' ';
public Cell()
{
setBorder(new LineBorder(Color.black, 1));
addMouseListener(new MyMouseListener());
}
public char getToken()
{
return token;
}
public void setToken(char c)
{
token = c;
repaint();
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
if (token == 'X')
{
g.drawLine(10, 10, getWidth() - 10, getHeight() - 10);
g.drawLine(getWidth() - 10, 10, 10, getHeight() - 10);
}
else if (token == 'O')
{
g.drawOval(10, 10, getWidth() - 20, getHeight() - 20);
}
}
private class MyMouseListener extends MouseAdapter
{
@Override
public void mouseClicked(MouseEvent e)
{
if (gameOver)
return;
if (token == ' ' && whoseTurn != ' ')
setToken(whoseTurn);
if (isWon(whoseTurn))
{
jlblStatus.setText(whoseTurn + " won! Game over!");
whoseTurn = ' ';
gameOver = true;
}
else if (isFull())
{
jlblStatus.setText("Tie game! Game over!");
whoseTurn = ' ';
gameOver = true;
}
else
{
whoseTurn = (whoseTurn == 'X') ? 'O' : 'X';
jlblStatus.setText(whoseTurn + "'s turn.");
}
}
}
}
}
重用你的'換loop's從你的構造函數...?也許把它包裝在一個方法中,你可以更容易地重新使用 – MadProgrammer
把它放到一個叫做'reset()'的方法中。 –
你應該首次初始化遊戲,就像遊戲第一次開始時一樣,將這個功能包裝在@MadProgrammer所說的方法中。 – charliebrownie