一个带有天元的五子棋界面,javas
时间: 2023-11-28 13:47:48 浏览: 58
这是一个基于Java Swing的五子棋界面,包含天元和落子功能。代码如下:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Gobang extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private JPanel jp1, jp2;
private JButton jb1, jb2, jb3;
private JLabel jl1, jl2, jl3, jl4;
private JTextField jt1, jt2;
private int[][] chessboard = new int[15][15];// 二维数组存储棋盘信息
private int player = 1;// 玩家1为黑方,玩家2为白方
private boolean isOver = false;// 判断游戏是否结束,false表示未结束,true表示结束
private int x = -1, y = -1;// 记录玩家当前落子的坐标
public Gobang() {
super("五子棋游戏");// 设置窗体标题
setSize(600, 600);// 设置窗体大小
setLocationRelativeTo(null);// 将窗体放置到屏幕中央
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗体关闭方式
setLayout(new BorderLayout());// 设置窗体布局为BorderLayout
// 创建顶部面板
jp1 = new JPanel();
jl1 = new JLabel("玩家1:");
jt1 = new JTextField(10);
jl2 = new JLabel("玩家2:");
jt2 = new JTextField(10);
jp1.add(jl1);
jp1.add(jt1);
jp1.add(jl2);
jp1.add(jt2);
add(jp1, BorderLayout.NORTH);
// 创建中心面板
jp2 = new JPanel(new GridLayout(15, 15));
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
JButton jb = new JButton();
jb.setPreferredSize(new Dimension(30, 30));// 设置按钮大小
jb.addActionListener(this);// 添加按钮事件监听器
jp2.add(jb);
}
}
add(jp2, BorderLayout.CENTER);
// 创建底部面板
jb1 = new JButton("开始游戏");
jb1.addActionListener(this);
jb2 = new JButton("重新开始");
jb2.setEnabled(false);
jb2.addActionListener(this);
jb3 = new JButton("退出游戏");
jb3.addActionListener(this);
jl3 = new JLabel("当前玩家:黑方");
jl4 = new JLabel("天元:");
JPanel jp3 = new JPanel();
jp3.add(jb1);
jp3.add(jb2);
jp3.add(jb3);
jp3.add(jl3);
jp3.add(jl4);
add(jp3, BorderLayout.SOUTH);
setVisible(true);// 显示窗体
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jb1) {// 点击开始游戏按钮
String name1 = jt1.getText().trim();
String name2 = jt2.getText().trim();
if (name1.equals("") || name2.equals("")) {
JOptionPane.showMessageDialog(this, "玩家名称不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
return;
}
jl3.setText("当前玩家:黑方");
jt1.setEditable(false);
jt2.setEditable(false);
jb1.setEnabled(false);
jb2.setEnabled(true);
isOver = false;
} else if (e.getSource() == jb2) {// 点击重新开始按钮
int result = JOptionPane.showConfirmDialog(this, "确定要重新开始吗?", "提示", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
reset();
}
} else if (e.getSource() == jb3) {// 点击退出游戏按钮
int result = JOptionPane.showConfirmDialog(this, "确定要退出游戏吗?", "提示", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
System.exit(0);
}
} else {// 点击棋盘按钮
JButton jb = (JButton) e.getSource();
int index = jp2.getComponentZOrder(jb);// 获取按钮在面板中的索引
x = index / 15;// 计算按钮在棋盘中的行坐标
y = index % 15;// 计算按钮在棋盘中的列坐标
if (isOver) {// 游戏已结束,不能再落子
JOptionPane.showMessageDialog(this, "游戏已结束,请重新开始!", "提示", JOptionPane.INFORMATION_MESSAGE);
return;
}
if (chessboard[x][y] != 0) {// 该位置已有棋子,不能再落子
JOptionPane.showMessageDialog(this, "该位置已有棋子,请重新选择!", "提示", JOptionPane.INFORMATION_MESSAGE);
return;
}
if (player == 1) {
jb.setIcon(new ImageIcon("images/black.png"));// 设置按钮图标为黑子
chessboard[x][y] = 1;// 该位置值设为1,表示黑子
jl3.setText("当前玩家:白方");
player = 2;
} else {
jb.setIcon(new ImageIcon("images/white.png"));// 设置按钮图标为白子
chessboard[x][y] = 2;// 该位置值设为2,表示白子
jl3.setText("当前玩家:黑方");
player = 1;
}
if (checkWin()) {// 检测是否有一方胜利
if (player == 1) {
JOptionPane.showMessageDialog(this, jt2.getText().trim() + " 获胜!", "游戏结束", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(this, jt1.getText().trim() + " 获胜!", "游戏结束", JOptionPane.INFORMATION_MESSAGE);
}
isOver = true;
}
}
}
// 重置游戏
private void reset() {
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
JButton jb = (JButton) jp2.getComponent(i * 15 + j);
jb.setIcon(null);// 清空按钮图标
chessboard[i][j] = 0;// 清空棋盘信息
}
}
jt1.setText("");
jt2.setText("");
jt1.setEditable(true);
jt2.setEditable(true);
jl3.setText("当前玩家:黑方");
jb1.setEnabled(true);
jb2.setEnabled(false);
isOver = false;
player = 1;
x = -1;
y = -1;
}
// 检测是否有一方胜利
private boolean checkWin() {
int count = 1;// 记录连续相同颜色的棋子数
int color = chessboard[x][y];// 当前落子颜色
// 横向检测
for (int i = y - 1; i >= 0; i--) {// 向左检测
if (chessboard[x][i] == color) {
count++;
} else {
break;
}
}
for (int i = y + 1; i < 15; i++) {// 向右检测
if (chessboard[x][i] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
// 纵向检测
count = 1;
for (int i = x - 1; i >= 0; i--) {// 向上检测
if (chessboard[i][y] == color) {
count++;
} else {
break;
}
}
for (int i = x + 1; i < 15; i++) {// 向下检测
if (chessboard[i][y] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
// 左上到右下斜向检测
count = 1;
for (int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) {// 向左上检测
if (chessboard[i][j] == color) {
count++;
} else {
break;
}
}
for (int i = x + 1, j = y + 1; i < 15 && j < 15; i++, j++) {// 向右下检测
if (chessboard[i][j] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
// 左下到右上斜向检测
count = 1;
for (int i = x + 1, j = y - 1; i < 15 && j >= 0; i++, j--) {// 向左下检测
if (chessboard[i][j] == color) {
count++;
} else {
break;
}
}
for (int i = x - 1, j = y + 1; i >= 0 && j < 15; i--, j++) {// 向右上检测
if (chessboard[i][j] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
return false;
}
public static void main(String[] args) {
new Gobang();
}
}
```
需要注意的是,代码中用到了黑子和白子的图片,可以根据自己的需求修改为其他图片,或者直接使用文字表示棋子。图片文件需要放在与代码文件同一目录下。
阅读全文