背景:设计五子棋游戏背景,
初步猜想:
① 设计一个五子棋小游戏,实现人机对战和双人对战两功能。
② 设计五子棋小游戏,使用Java Swing设计可视化操作界面,并使用GraPhic 2D技术设计图形
③ 使用五元组算法实现人机对战方法
参考博客:五元组评价算法实现简易五子棋【人工智能】_五子棋五元组算法_YouthUpward的博客-CSDN博客
目录
一、团队成员及任务
队长:
高晔川 计科(智能)22-1 202203200035
负责模块: Java Swing界面搭建,Graphic 2D图形绘制,Panel面板搭建,五子棋过程的实现构思
队员:
戚彦良 计科(智能)22-1 202203200029
负责模块: 负责函数算法的编写,使用函数方法体判断哪方获胜,人机对战中如何实现 排行榜功能的实现
吴沅峰 计科(智能)22-1 202203200020
负责模块:鼠标监听器、动作监听器、人机对战自动下棋算法
二、项目简介
功能描述:在Java Swing的界面上
三、.功能架构图
四、运行结果截图
五、项目git地址:
五子棋_final: 此仓库专用于课程设计任务 (gitee.com)
六、个人部分实现过程
〇 我们假设每个数组可以存储对应的五子棋的显色情况,声明存储五子棋存在的二维数组,
① 总体界面如图所示
总体界面搭建我们使用了继承JPanel类的子类,在构造方法中声明Panel面板的信息
总体工作模块如图所示:
JLabel selectLabel = new JLabel("游戏选择:");
JButton doublePerson = new JButton("双人对战");
JButton singleBlack = new JButton("人机持黑");
JButton singleWrite = new JButton("人机持白");
JLabel elseLabel = new JLabel("其他设置:");
JButton regret = new JButton("悔棋");
JButton restart = new JButton("Replay");
JButton forExit = new JButton("GameOver");
JButton surrender = new JButton("投降");
JButton leaderBoard = new JButton("排行榜");
JButton aboutUs = new JButton("About us");
使用Button按钮搭建整体操作平台,并设置事件监听器,方便后续类的开发
ActionListener actionListener = new ActionListener() {
@Override
...
在这里呈现了我们的代码块
public TablePanel() {
setLayout(null);
setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));//设置组件的首选大小
setBackground(Color.yellow); //设置背景颜色
init(); //初始化一些属性
isStart = 0;
addMouseListener(mouseAdapter); //添加鼠标监听
addMouseMotionListener(mouseAdapter);
selectLabel.setFont(font1);
doublePerson.setBounds(50,600,100,30);
doublePerson.setFont(font2);
singleBlack.setBounds(175,600,100,30);
singleBlack.setFont(font2);
singleWrite.setBounds(300,600,100,30);
singleWrite.setFont(font2);
elseLabel.setFont(font1);
regret.setBounds(425,600,100,30);
regret.setFont(font2);
restart.setBounds(550,600,100,30);
restart.setFont(font2);
forExit.setBounds(50,660,100,30);
forExit.setFont(font2);
surrender.setBounds(175,660,100,30);
surrender.setFont(font2);
leaderBoard.setBounds(300,660,100,30);
leaderBoard.setFont(font2);
aboutUs.setBounds(425,660,100,30);
aboutUs.setFont(font2);
titleLabel.setFont(font3);
doublePerson.addActionListener(actionListener);
singleBlack.addActionListener(actionListener);
singleWrite.addActionListener(actionListener);
regret.addActionListener(actionListener);
restart.addActionListener(actionListener);
forExit.addActionListener(actionListener);
surrender.addActionListener(actionListener);
leaderBoard.addActionListener(actionListener);
aboutUs.addActionListener(actionListener);
add(selectLabel);
add(doublePerson);
add(singleBlack);
add(singleWrite);
add(elseLabel);
add(regret);
add(restart);
add(forExit);
add(surrender);
add(leaderBoard);
add(titleLabel);
add(aboutUs);
}
通过上述代码我们可以搭建出基本的操作界面,为后续功能实现创造条件
②使用Graphic绘图
在实现过程中,我们首先考虑了使用棋盘图片作为背景,但图片的质量可能会影响到面板的清晰度和整体的观感,甚至出现锐度低效果失真的情况,遂不考虑使用Icon类方法插入图片。最终我们使用了Graphic类方法创建了五子棋网格,代码如图所示
private void initPaint(Graphics g, Graphics2D gg) {
super.paint(g);
g.setColor(Color.BLACK);
for (int i = 0; i < num; i++) {
int x = Initial_X + SP * i;
int y = Initial_Y + SP * (num - 1);
g.drawLine(x, Initial_Y, x, y);
}
for (int i = 0; i < num; i++) {
int x = Initial_X + SP * (num - 1);
int y = Initial_Y + SP * i;
g.drawLine(Initial_X, y, x, y);
}
int[][] positions = { {3, 3}, {11, 3}, {3, 11}, {11, 11}, {7, 7} };
for (int[] pos : positions) {
int x = Initial_X + SP * pos[0] - RECT_SIZE / 2;
int y = Initial_Y + SP * pos[1] - RECT_SIZE / 2;
g.fillOval(x, y, RECT_SIZE, RECT_SIZE);
}
bs = new BasicStroke(5);
gg.setStroke(bs);
gg.drawRect(Initial_X - 7, Initial_Y - 7, (num - 1) * SP + 14, (num - 1) * SP + 14);
bs = new BasicStroke(3);
gg.setStroke(bs);
for (int i = 1; i < num; i += 4) {
int x = Initial_X + SP * i;
int y = Initial_Y + SP * (num - 1);
gg.drawLine(x, Initial_Y, x, y);
}
for (int i = 1; i < num; i += 4) {
int x = Initial_X + SP * (num - 1);
int y = Initial_Y + SP * i;
gg.drawLine(Initial_X, y, x, y);
}
}
我们首先清除之前绘制的内容,使用前两组for循环创建基本的网格,确定棋盘的基本框架。
position数组存储的是特殊的坐标,用于存储棋盘上key point的位置,第三组循环是用于绘制棋盘上的关键点。之后两组循环是用来加粗边界。
我们创建ovalPaint方法确定了每个棋子的显示状况
private void ovalPaint(Graphics2D gg) {
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
int x = Initial_X + SP * i - cheeseSize / 2;
int y = Initial_Y + SP * j - cheeseSize / 2;
if (table[i][j] == 2) {
gg.setColor(Color.BLACK);
gg.fillOval(x, y, cheeseSize, cheeseSize);
} else if (table[i][j] == 1) {
gg.setColor(Color.WHITE);
gg.fillOval(x, y, cheeseSize, cheeseSize);
} else if (table[i][j] == 3) {
gg.setColor(Color.RED);
gg.drawOval(x, y, cheeseSize, cheeseSize);
}
}
}
if (win) {
select_X = -10;
select_Y = -10;
} else {
bs = new BasicStroke(1); // 画笔宽度为1
gg.setStroke(bs);
//画选择框
gg.setColor(Color.BLACK);
gg.drawOval(Initial_X + SP * select_X - cheeseSize / 2,
Initial_Y + SP * select_Y - cheeseSize / 2,
cheeseSize, cheeseSize);
}
}
这样,我们可以确定基本的操作面板。
③彩蛋 About us按钮实现的过程
else if ("About us".equals(text)) {
JOptionPane.showMessageDialog(null,"制作人:高晔川 戚彦良 吴沅峰");
}