Java五子棋游戏代码实现 - AI 逻辑部分
public void AI() {
JFrame jf = new JFrame();//创建窗口
jf.setSize(200, 200);//设置窗口大小
jf.setLocationRelativeTo(null);//居中显示
//设置流动布局
jf.setLayout(new FlowLayout());
JButton jb1 = new JButton('先手');
JButton jb2 = new JButton('后手');
jf.add(jb1);
jf.add(jb2);
jf.setVisible(true);
jb1.addActionListener(new ActionListener() {//先手
public void actionPerformed(ActionEvent e) {
jf.dispose();//关闭窗口
clean();// 清空棋盘
count = 0;//计数器清零
start = true;// 允许开始
int x = 7,y = 7;//电脑先下中心点
for(int i=0;i<50;i++) {// 添加动画效果
color = new Color(5 * i, 5 * i, 5 * i);// 3d效果
g.setColor(color);// 设置画笔颜色
g.fillOval(x * size + x0 + i / 2 - 25, y * size + y0 + i / 2 - 25, 50 - i, 50 - i);
chessArr[y][x] = 1;// 记录棋盘上每颗棋子的颜色(实际是记入1、-1)
}
ChessR chess = new ChessR(x,y,color);//创建棋子对象存入棋子数值
chessB[count] = chess;//以count为下标存入棋子对象
count++;//每下完一颗棋,计数器加1
while(true) {// 无限循环
//人类下一步棋
while(true) {
if (start == true) {
if (chessArr[y1][x1] == 0) {
for (int i = 0; i < 50; i++) {
if (count % 2 == 0) {
color = new Color(5 * i, 5 * i, 5 * i);// 3d效果
g.setColor(color);// 设置画笔颜色
g.fillOval(x1 * size + x0 + i / 2 - 25, y1 * size + y0 + i / 2 - 25, 50 - i, 50 - i);
chessArr[y1][x1] = 1;// 记录棋盘上每颗棋子的颜色(实际是记入1、-1)
} else {
color = new Color(155 + 2 * i, 155 + 2 * i, 155 + 2 * i);
g.setColor(color);
g.fillOval(x1 * size + x0 + i / 2 - 25, y1 * size + y0 + i / 2 - 25, 50 - i, 50 - i);
chessArr[y1][x1] = -1;
}
}
ChessR chess1 = new ChessR(x1,y1,color);
chessB[count] = chess1;
count++;
checkwin();// 判断输赢
break;
}
}
}
//电脑下一步棋
int[] res = new int[2];//存储最优下棋位置
res = max(chessArr);//调用max方法
x = res[0];//取出最优下棋位置
y = res[1];
for(int i=0;i<50;i++) {// 添加动画效果
color = new Color(155 + 2 * i, 155 + 2 * i, 155 + 2 * i);
g.setColor(color);// 设置画笔颜色
g.fillOval(x * size + x0 + i / 2 - 25, y * size + y0 + i / 2 - 25, 50 - i, 50 - i);
chessArr[y][x] = -1;// 记录棋盘上每颗棋子的颜色(实际是记入1、-1)
}
ChessR chess2 = new ChessR(x,y,color);// 创建棋子对象
chessB[count] = chess2;
count++;// 每下完一颗棋,计数器加1
checkwin();// 判断输赢
}
}
});
jb2.addActionListener(new ActionListener() {//后手
public void actionPerformed(ActionEvent e) {
jf.dispose();//关闭窗口
clean();// 清空棋盘
count = 0;//计数器清零
start = true;// 允许开始
while(true) {// 无限循环
//人类下一步棋
while(true) {
if (start == true) {
if (chessArr[y1][x1] == 0) {
for (int i = 0; i < 50; i++) {
if (count % 2 == 0) {
color = new Color(5 * i, 5 * i, 5 * i);// 3d效果
g.setColor(color);// 设置画笔颜色
g.fillOval(x1 * size + x0 + i / 2 - 25, y1 * size + y0 + i / 2 - 25, 50 - i, 50 - i);
chessArr[y1][x1] = 1;// 记录棋盘上每颗棋子的颜色(实际是记入1、-1)
} else {
color = new Color(155 + 2 * i, 155 + 2 * i, 155 + 2 * i);
g.setColor(color);
g.fillOval(x1 * size + x0 + i / 2 - 25, y1 * size + y0 + i / 2 - 25, 50 - i, 50 - i);
chessArr[y1][x1] = -1;
}
}
ChessR chess1 = new ChessR(x1,y1,color);// 创建棋子对象
chessB[count] = chess1;// 以count为下标存入棋子对象
count++;//每下完一颗棋,计数器加1
checkwin();// 判断输赢
break;
}
}
}
//电脑下一步棋
int[] res = new int[2];//存储最优下棋位置
res = max(chessArr);//调用max方法
x = res[0];//取出最优下棋位置
y = res[1];
for(int i=0;i<50;i++) {// 添加动画效果
color = new Color(155 + 2 * i, 155 + 2 * i, 155 + 2 * i);
g.setColor(color);// 设置画笔颜色
g.fillOval(x * size + x0 + i / 2 - 25, y * size + y0 + i / 2 - 25, 50 - i, 50 - i);
chessArr[y][x] = -1;// 记录棋盘上每颗棋子的颜色(实际是记入1、-1)
}
ChessR chess2 = new ChessR(x,y,color);// 创建棋子对象
chessB[count] = chess2;// 以count为下标存入棋子对象
count++;// 每下完一颗棋,计数器加1
checkwin();// 判断输赢
}
}
});
}
其中max方法还没有写,需要自己根据题目要求完成。
说明:
- 该代码展示了五子棋游戏中的 AI 逻辑部分,包括先手、后手、下棋动画效果、判断输赢等功能。
max方法需要根据实际需求进行编写,用于计算电脑的最优下棋位置。- 代码中的
chessArr数组用于记录棋盘上每颗棋子的颜色,chessB数组用于存储棋子对象。 count变量用于记录棋子的数量,start变量用于控制游戏是否开始。checkwin方法用于判断游戏是否结束。- 代码中使用了 Swing 库来创建游戏界面,并使用 ActionListener 来监听按钮点击事件。
提示:
- 可以参考一些五子棋 AI 算法,如 Minimax 算法、Alpha-Beta 剪枝算法等,来实现
max方法。 - 可以根据自己的需求调整代码中的参数,例如棋盘大小、动画效果等。
- 可以使用其他 GUI 库来创建游戏界面,例如 JavaFX。
原文地址: https://www.cveoy.top/t/topic/oRHZ 著作权归作者所有。请勿转载和采集!