用java写一个五子棋游戏GUI
时间: 2023-07-01 20:16:05 浏览: 118
使用java编写的五子棋游戏
好的,下面是一个简单的五子棋游戏GUI的Java代码示例:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Gobang extends JFrame implements ActionListener, MouseListener {
private static final long serialVersionUID = 1L;
private JPanel chessBoard; // 棋盘面板
private JButton startGame; // 开始游戏按钮
private JButton regret; // 悔棋按钮
private JButton quitGame; // 退出游戏按钮
private JLabel message; // 状态信息标签
private int[][] chessData; // 存储棋子信息的数组
private int currentPlayer; // 当前下棋方
private boolean gameOver; // 游戏是否结束
// 构造函数
public Gobang() {
super("五子棋游戏");
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// 添加按钮和标签
startGame = new JButton("开始游戏");
regret = new JButton("悔棋");
quitGame = new JButton("退出游戏");
message = new JLabel("请点击开始游戏按钮开始游戏。");
JPanel buttonPanel = new JPanel();
buttonPanel.add(startGame);
buttonPanel.add(regret);
buttonPanel.add(quitGame);
add(buttonPanel, BorderLayout.NORTH);
add(message, BorderLayout.SOUTH);
// 添加棋盘面板
chessBoard = new JPanel();
chessBoard.setLayout(new GridLayout(15, 15));
chessData = new int[15][15];
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
JButton button = new JButton();
button.setBackground(Color.WHITE);
button.addMouseListener(this);
chessBoard.add(button);
}
}
add(chessBoard, BorderLayout.CENTER);
// 添加按钮事件监听器
startGame.addActionListener(this);
regret.addActionListener(this);
quitGame.addActionListener(this);
}
// 重置游戏
private void resetGame() {
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
chessData[i][j] = 0;
JButton button = (JButton) chessBoard.getComponent(i * 15 + j);
button.setBackground(Color.WHITE);
button.setEnabled(true);
}
}
currentPlayer = 1;
gameOver = false;
message.setText("请黑方落子。");
}
// 下棋
private void placeChess(int x, int y) {
if (chessData[x][y] != 0) {
return;
}
JButton button = (JButton) chessBoard.getComponent(x * 15 + y);
if (currentPlayer == 1) {
button.setBackground(Color.BLACK);
chessData[x][y] = 1;
message.setText("请白方落子。");
} else if (currentPlayer == 2) {
button.setBackground(Color.WHITE);
chessData[x][y] = 2;
message.setText("请黑方落子。");
}
button.setEnabled(false);
if (checkWin(x, y)) {
gameOver = true;
message.setText((currentPlayer == 1 ? "黑方" : "白方") + "获胜!");
} else {
currentPlayer = 3 - currentPlayer;
}
}
// 判断是否胜利
private boolean checkWin(int x, int y) {
int count = 1;
for (int i = x - 1; i >= 0 && chessData[i][y] == chessData[x][y]; i--) {
count++;
}
for (int i = x + 1; i < 15 && chessData[i][y] == chessData[x][y]; i++) {
count++;
}
if (count >= 5) {
return true;
}
count = 1;
for (int j = y - 1; j >= 0 && chessData[x][j] == chessData[x][y]; j--) {
count++;
}
for (int j = y + 1; j < 15 && chessData[x][j] == chessData[x][y]; j++) {
count++;
}
if (count >= 5) {
return true;
}
count = 1;
for (int i = x - 1, j = y - 1; i >= 0 && j >= 0 && chessData[i][j] == chessData[x][y]; i--, j--) {
count++;
}
for (int i = x + 1, j = y + 1; i < 15 && j < 15 && chessData[i][j] == chessData[x][y]; i++, j++) {
count++;
}
if (count >= 5) {
return true;
}
count = 1;
for (int i = x - 1, j = y + 1; i >= 0 && j < 15 && chessData[i][j] == chessData[x][y]; i--, j++) {
count++;
}
for (int i = x + 1, j = y - 1; i < 15 && j >= 0 && chessData[i][j] == chessData[x][y]; i++, j--) {
count++;
}
if (count >= 5) {
return true;
}
return false;
}
// 实现 ActionListener 接口
public void actionPerformed(ActionEvent e) {
if (e.getSource() == startGame) {
resetGame();
} else if (e.getSource() == regret) {
// 悔棋功能留给读者自己实现
message.setText("悔棋功能留给读者自己实现。");
} else if (e.getSource() == quitGame) {
System.exit(0);
}
}
// 实现 MouseListener 接口
public void mouseClicked(MouseEvent e) {
if (gameOver) {
return;
}
JButton button = (JButton) e.getSource();
int x = (button.getY() - chessBoard.getY()) / button.getHeight();
int y = (button.getX() - chessBoard.getX()) / button.getWidth();
placeChess(x, y);
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
// 主函数
public static void main(String[] args) {
Gobang game = new Gobang();
game.setVisible(true);
}
}
```
这个程序中,使用了 Java Swing 库来实现界面。程序在创建窗口时,先设定了窗口的标题、大小和关闭操作。然后,将窗口的布局方式设置为 BorderLayout,以便在里面添加按钮、标签和棋盘面板。按钮和标签都是 JPanel 中的组件,而棋盘面板是一个由 225 个 JButton 组成的 GridLayout。
在棋盘面板上,使用一个二维数组 chessData 来存储棋子的信息。每个数组元素的值表示该位置上的棋子颜色,0 表示没有棋子,1 表示黑子,2 表示白子。当玩家点击一个按钮时,程序会根据按钮的坐标计算出该位置在数组中的下标,然后调用 placeChess() 方法下棋。如果当前下棋方获胜,或者棋盘已满,游戏结束。此时,将 gameOver 标志设为 true,并显示胜利信息。
程序中还实现了悔棋和退出游戏的功能,这里留给读者自己实现。
阅读全文