Java+Swing实现五子棋游戏
Posted 水坚石青
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java+Swing实现五子棋游戏相关的知识,希望对你有一定的参考价值。
目录
一、系统介绍
1.开发环境
开发工具:Eclipse2021
JDK版本:jdk1.8
mysql版本:8.0.13
2.技术选型
Java+Swing
3.系统功能
实现五子棋游戏,开始游戏,悔棋,认输,退出功能。
二、系统展示
1.首页
2.黑棋走
3.白棋走
三、部分代码
AI.java
package com.sjsq;
import java.util.HashMap;
public class AI implements Gobang
static HashMap<String, Integer> map = new HashMap<String, Integer>();
static
/**
* 权值
*/
// 防守权值
// 活1连
map.put("010", 20); //map.put(key,value) key=键 value=值
map.put("0-10", 10);
// 眠1连
map.put("-110", 1);
map.put("1-10", 1);
// 活2连
map.put("0110", 200);
map.put("0-1-10", 100);
// 眠2连
map.put("-1110", 20);
map.put("1-1-10", 10);
// 活3连
map.put("01110", 7000);
map.put("0-1-1-10", 5000);
// 眠3连
map.put("-11110", 50);
map.put("1-1-1-10", 30);
// 活4连
map.put("011110", 10000);
map.put("0-1-1-1-10", 10000);
// 眠4连
map.put("-111110", 10000);
map.put("1-1-1-1-10", 10000);
// 碰壁眠4连
map.put("11110", 10000);
map.put("-1-1-1-10", 10000);
//进攻权值
//活1连
map.put("010",10);
map.put("0-10",20);
//眠1连
map.put("-110",1);
map.put("1-10",1);
//活2连
map.put("0110", 100);
map.put("0-1-10",200);
//眠2连
map.put("-1110",10);
map.put("1-1-10",20);
//活3连
map.put("01110", 5000);
map.put("0-1-1-10",7000);
//眠3连
map.put("-11110",30);
map.put("1-1-1-10",50);
//活4连
map.put("011110", 10000);
map.put("0-1-1-1-10",10000);
//眠4连
map.put("-111110",10000);
map.put("1-1-1-1-10",10000);
//碰壁眠4连
map.put("11110", 10000);
map.put("-1-1-1-10", 15000);
static String code;
static Integer weight;
public static void Quan()
for (int r = 0; r < array1.length; r++)
for (int c = 0; c < array1[r].length; c++)
if (array1[r][c] == 0) // 如果该位置没有棋子则开始统计
code = countHL(r, c);// 调用水平向左统计的方法
weight = map.get(code);// 根据棋子相连情况获取对应的权值
if (weight != null) // 判断是否有该种棋子相连的情况
weightArray[r][c] += weight;// 累加权值
// 把另外七个方向统计完毕后,就完成权值统计
code = countHR(r, c);// 调用水平向右统计的方法
weight = map.get(code);// 根据棋子相连情况获取对应的权值
if (weight != null) // 判断是否有该种棋子相连的情况
weightArray[r][c] += weight;// 累加权值
code = countHT(r, c);// 调用水平向左统计的方法
weight = map.get(code);// 根据棋子相连情况获取对应的权值
if (weight != null) // 判断是否有该种棋子相连的情况
weightArray[r][c] += weight;// 累加权值
code = countHB(r, c);// 调用水平向左统计的方法
weight = map.get(code);// 根据棋子相连情况获取对应的权值
if (weight != null) // 判断是否有该种棋子相连的情况
weightArray[r][c] += weight;// 累加权值
code = countHZXS(r, c);// 调用水平向左统计的方法
weight = map.get(code);// 根据棋子相连情况获取对应的权值
if (weight != null) // 判断是否有该种棋子相连的情况
weightArray[r][c] += weight;// 累加权值
code = countHYXS(r, c);// 调用水平向左统计的方法
weight = map.get(code);// 根据棋子相连情况获取对应的权值
if (weight != null) // 判断是否有该种棋子相连的情况
weightArray[r][c] += weight;// 累加权值
code = countHZXX(r, c);// 调用水平向左统计的方法
weight = map.get(code);// 根据棋子相连情况获取对应的权值
if (weight != null) // 判断是否有该种棋子相连的情况
weightArray[r][c] += weight;// 累加权值
code = countHYXX(r, c);// 调用水平向左统计的方法
weight = map.get(code);// 根据棋子相连情况获取对应的权值
if (weight != null) // 判断是否有该种棋子相连的情况
weightArray[r][c] += weight;// 累加权值
// 针对每种情况都进行权值分析,保证五子棋规则的完善
// 判断两个2连在一条直线但中间有一个空位的情况
if ((countHL(r, c) + countHR(r, c) == "01100110")
|| (countHL(r, c) + countHR(r, c) == "0-1-100-1-10")
|| (countHL(r, c) + countHR(r, c) == "-11100110")
|| (countHL(r, c) + countHR(r, c) == "1-1-100-1-10")
|| (countHL(r, c) + countHR(r, c) == "0110-1110")
|| (countHL(r, c) + countHR(r, c) == "0-1-101-1-10")
|| (countHL(r, c) + countHR(r, c) == "-1110-1110")
|| (countHL(r, c) + countHR(r, c) == "1-1-101-1-10"))
weightArray[r][c] = weightArray[r][c] + 5000;
if ((countHT(r, c) + countHB(r, c) == "01100110")
|| (countHT(r, c) + countHB(r, c) == "0-1-100-1-10")
|| (countHT(r, c) + countHB(r, c) == "-11100110")
|| (countHT(r, c) + countHB(r, c) == "1-1-100-1-10")
|| (countHT(r, c) + countHB(r, c) == "0110-1110")
|| (countHT(r, c) + countHB(r, c) == "0-1-101-1-10")
|| (countHT(r, c) + countHB(r, c) == "-1110-1110")
|| (countHT(r, c) + countHB(r, c) == "1-1-101-1-10"))
weightArray[r][c] = weightArray[r][c] + 5000;
if ((countHZXS(r, c) + countHYXX(r, c) == "01100110")
|| (countHZXS(r, c) + countHYXX(r, c) == "0-1-100-1-10")
|| (countHZXS(r, c) + countHYXX(r, c) == "-11100110")
|| (countHZXS(r, c) + countHYXX(r, c) == "1-1-100-1-10")
|| (countHZXS(r, c) + countHYXX(r, c) == "0110-1110")
|| (countHZXS(r, c) + countHYXX(r, c) == "0-1-101-1-10")
|| (countHZXS(r, c) + countHYXX(r, c) == "-1110-1110")
|| (countHZXS(r, c) + countHYXX(r, c) == "1-1-101-1-10"))
weightArray[r][c] = weightArray[r][c] + 5000;
if ((countHYXS(r, c) + countHZXX(r, c) == "01100110")
|| (countHYXS(r, c) + countHZXX(r, c) == "0-1-100-1-10")
|| (countHYXS(r, c) + countHZXX(r, c) == "-11100110")
|| (countHYXS(r, c) + countHZXX(r, c) == "1-1-100-1-10")
|| (countHYXS(r, c) + countHZXX(r, c) == "0110-1110")
|| (countHYXS(r, c) + countHZXX(r, c) == "0-1-101-1-10")
|| (countHYXS(r, c) + countHZXX(r, c) == "-1110-1110")
|| (countHYXS(r, c) + countHZXX(r, c) == "1-1-101-1-10"))
weightArray[r][c] = weightArray[r][c] + 5000;
// 判断一个活2连和一个活1连在一条直线上但中间有一个空位的情况
if ((countHL(r, c) + countHR(r, c) == "0100110") || (countHL(r, c) + countHR(r, c) == "0-100-1-10")
|| (countHL(r, c) + countHR(r, c) == "0110010")
|| (countHL(r, c) + countHR(r, c) == "0-1-100-10"))
weightArray[r][c] = weightArray[r][c] + 3000;
if ((countHT(r, c) + countHB(r, c) == "0100110") || (countHT(r, c) + countHB(r, c) == "0-100-1-10")
|| (countHT(r, c) + countHB(r, c) == "0110010")
|| (countHT(r, c) + countHB(r, c) == "0-1-100-10"))
weightArray[r][c] = weightArray[r][c] + 3000;
if ((countHZXS(r, c) + countHYXX(r, c) == "0100110")
|| (countHZXS(r, c) + countHYXX(r, c) == "0-100-1-10")
|| (countHZXS(r, c) + countHYXX(r, c) == "0110010")
|| (countHZXS(r, c) + countHYXX(r, c) == "0-1-100-10"))
weightArray[r][c] = weightArray[r][c] + 3000;
if ((countHYXS(r, c) + countHZXX(r, c) == "0100110")
|| (countHYXS(r, c) + countHZXX(r, c) == "0-100-1-10")
|| (countHYXS(r, c) + countHZXX(r, c) == "0110010")
|| (countHYXS(r, c) + countHZXX(r, c) == "0-1-100-10"))
weightArray[r][c] = weightArray[r][c] + 3000;
// 眠3连的一端被堵了
// "1-1-1-10"&"010" "0-1-1-10"&"010"
if ((countHL(r, c) + countHR(r, c) == "1-1-1-10010")
|| (countHL(r, c) + countHR(r, c) == "0101-1-1-10")
|| (countHL(r, c) + countHR(r, c) == "1-1-1-100")
|| (countHL(r, c) + countHR(r, c) == "01-1-1-10")
|| (countHL(r, c) + countHR(r, c) == "1-1-1-100110")
|| (countHL(r, c) + countHR(r, c) == "01101-1-1-10"))
weightArray[r][c] = 1;
if ((countHT(r, c) + countHB(r, c) == "1-1-1-10010")
|| (countHT(r, c) + countHB(r, c) == "0101-1-1-10")
|| (countHT(r, c) + countHB(r, c) == "1-1-1-100")
|| (countHT(r, c) + countHB(r, c) == "01-1-1-10")
|| (countHT(r, c) + countHB(r, c) == "1-1-1-100110")
|| (countHT(r, c) + countHB(r, c) == "01101-1-1-10"))
weightArray[r][c] = 1;
;
if ((countHZXS(r, c) + countHYXX(r, c) == "1-1-1-10010")
|| (countHZXS(r, c) + countHYXX(r, c) == "0101-1-1-10")
|| (countHZXS(r, c) + countHYXX(r, c) == "1-1-1-100")
|| (countHZXS(r, c) + countHYXX(r, c) == "01-1-1-10")
|| (countHZXS(r, c) + countHYXX(r, c) == "1-1-1-100110")
|| (countHZXS(r, c) + countHYXX(r, c) == "01101-1-1-10"))
weightArray[r][c] = 1;
if ((countHYXS(r, c) + countHZXX(r, c) == "1-1-1-10010")
|| (countHYXS(r, c) + countHZXX(r, c) == "0101-1-1-10")
|| (countHYXS(r, c) + countHZXX(r, c) == "1-1-1-100")
|| (countHYXS(r, c) + countHZXX(r, c) == "01-1-1-10")
|| (countHYXS(r, c) + countHZXX(r, c) == "1-1-1-100110")
|| (countHYXS(r, c) + countHZXX(r, c) == "01101-1-1-10"))
weightArray[r][c] = 1;
// 3连和1连在一条线上差一个棋位
if ((countHL(r, c) + countHR(r, c) == "0-1-1-100-10")
|| (countHL(r, c) + countHR(r, c) == "0-101-1-1-10")
|| (countHL(r, c) + countHR(r, c) == "01110010")
|| (countHL(r, c) + countHR(r, c) == "010-11110")
|| (countHL(r, c) + countHR(r, c) == "0-100-1-1-10")
|| (countHL(r, c) + countHR(r, c) == "1-1-1-100-10")
|| (countHL(r, c) + countHR(r, c) == "01001110")
|| (countHL(r, c) + countHR(r, c) == "-11110010"))
weightArray[r][c] = weightArray[r][c] + 4000;
if ((countHT(r, c) + countHB(r, c) == "0-1-1-100-10")
|| (countHT(r, c) + countHB(r, c) == "0-101-1-1-10")
|| (countHT(r, c) + countHB(r, c) == "01110010")
|| (countHT(r, c) + countHB(r, c) == "010-11110")
|| (countHT(r, c) + countHB(r, c) == "0-100-1-1-10")
|| (countHT(r, c) + countHB(r, c) == "1-1-1-100-10")
|| (countHT(r, c) + countHB(r, c) == "01001110")
|| (countHT(r, c) + countHB(r, c) == "-11110010"))
weightArray[r][c] = weightArray[r][c] + 4000;
if ((countHZXS(r, c) + countHYXX(r, c) == "0-1-1-100-10")
|| (countHZXS(r, c) + countHYXX(r, c) == "0-101-1-1-10")
|| (countHZXS(r, c) + countHYXX(r, c) == "01110010")
|| (countHZXS(r, c) + countHYXX(r, c) == "010-11110")
|| (countHZXS(r, c) + countHYXX(r, c) == "0-100-1-1-10")
|| (countHZXS(r, c) + countHYXX(r, c) == "1-1-1-100-10")
|| (countHZXS(r, c) + countHYXX(r, c) == "01001110")
|| (countHZXS(r, c) + countHYXX(r, c) == "-11110010"))
weightArray[r][c] = weightArray[r][c] + 4000;
if ((countHYXS(r, c) + countHZXX(r, c) == "0-1-1-100-10")
|| (countHYXS(r, c) + countHZXX(r, c) == "0-101-1-1-10")
|| (countHYXS(r, c) + countHZXX(r, c) == "01110010")
|| (countHYXS(r, c) + countHZXX(r, c) == "010-11110")
|| (countHYXS(r, c) + countHZXX(r, c) == "0-100-1-1-10")
|| (countHYXS(r, c) + countHZXX(r, c) == "1-1-1-100-10")
|| (countHYXS(r, c) + countHZXX(r, c) == "01001110")
|| (countHYXS(r, c) + countHZXX(r, c) == "-11110010"))
weightArray[r][c] = weightArray[r][c] + 4000;
// 水平向左统计的方法
public static String countHL(int r, int c)
String code = "0";
int chess = 0;// 存储第一颗出现的棋子
// 循环遍历
for (int r1 = r - 1; r1 >= 0; r1--)
if (array1[r1][c] == 0) // 表示空位沒有棋子
if (r1 + 1 == r) // 相邻
break;
else
code = array1[r1][c] + code;// 记录棋子相连情况
break;
else // 表示该位置有棋子
if (chess == 0) // 第一次出现棋子
chess = array1[r1][c];// 记录棋子
code = array1[r1][c] + code;// 记录棋子相连情况
else if (chess == array1[r1][c])
code = array1[r1][c] + code;// 记录棋子相连情况
else
code = array1[r1][c] + code;// 记录棋子相连情况
break;
return code;
// 水平向右统计的方法
public static String countHR(int r, int c)
String code = "0";
int chess = 0;// 存储第一颗出现的棋子
// 循环遍历
for (int r1 = r + 1; r1 < coloum; r1++)
if (array1[r1][c] == 0) // 表示空位沒有棋子
if (r1 - 1 == r) // 相邻
break;
else
code = array1[r1][c] + code;// 记录棋子相连情况
break;
else // 表示该位置有棋子
if (chess == 0) // 第一次出现棋子
chess = array1[r1][c];// 记录棋子
code = array1[r1][c] + code;// 记录棋子相连情况
else if (chess == array1[r1][c])
code = array1[r1][c] + code;// 记录棋子相连情况
else
code = array1[r1][c] + code;// 记录棋子相连情况
break;
return code;
// 竖直向上统计的方法
public static String countHT(int r, int c)
String code = "0";
int chess = 0;// 存储第一颗出现的棋子
// 循环遍历
for (int c1 = c - 1; c1 >= 0; c1--)
if (array1[r][c1] == 0) // 表示空位沒有棋子
if (c1 + 1 == r) // 相邻
break;
else
code = array1[r][c1] + code;// 记录棋子相连情况
break;
else // 表示该位置有棋子
if (chess == 0) // 第一次出现棋子
chess = array1[r][c1];// 记录棋子
code = array1[r][c1] + code;// 记录棋子相连情况
else if (chess == array1[r][c1])
code = array1[r][c1] + code;// 记录棋子相连情况
else
code = array1[r][c1] + code;// 记录棋子相连情况
break;
return code;
// 竖直向下统计的方法
public static String countHB(int r, int c)
String code = "0";
int chess = 0;// 存储第一颗出现的棋子
// 循环遍历
for (int c1 = c + 1; c1 < row; c1++)
if (array1[r][c1] == 0) // 表示空位沒没有棋子
if (c1 - 1 == c) // 相邻
break;
else
code = array1[r][c1] + code;// 记录棋子相连情况
break;
else // 表示该位置有棋子
if (chess == 0) // 第一次出现棋子
chess = array1[r][c1];// 记录棋子
code = array1[r][c1] + code;// 记录棋子相连情况
else if (chess == array1[r][c1])
code = array1[r][c1] + code;// 记录棋子相连情况
else
code = array1[r][c1] + code;// 记录棋子相连情况
break;
return code;
// 左斜向上统计的方法
public static String countHZXS(int r, int c)
String code = "0";
int chess = 0;// 存储第一颗出现的棋子
// 循环遍历
for (int r1 = r - 1, c1 = c - 1; r1 >= 0 && c1 >= 0; r1--, c1--)
if (array1[r1][c1] == 0) // 表示空位沒有棋子
if (c1 + 1 == c && r1 + 1 == r) // 相邻
break;
else
code = array1[r1][c1] + code;// 记录棋子相连情况
break;
else // 表示该位置有棋子
if (chess == 0) // 第一次出现棋子
chess = array1[r1][c1];// 记录棋子
code = array1[r1][c1] + code;// 记录棋子相连情况
else if (chess == array1[r1][c1])
code = array1[r1][c1] + code;// 记录棋子相连情况
else
code = array1[r1][c1] + code;// 记录棋子相连情况
break;
return code;
// 右斜向上统计的方法
public static String countHYXS(int r, int c)
String code = "0";
int chess = 0;// 存储第一颗出现的棋子
// 循环遍历
for (int r1 = r + 1, c1 = c - 1; c1 >= 0 && r1 < coloum; r1++, c1--)
if (array1[r1][c1] == 0) // 表示空位沒有棋子
if (r1 - 1 == r && c1 + 1 == c) // 相邻
break;
else
code = array1[r1][c1] + code;// 记录棋子相连情况
break;
else // 表示该位置有棋子
if (chess == 0) // 第一次出现棋子
chess = array1[r1][c1];// 记录棋子
code = array1[r1][c1] + code;// 记录棋子相连情况
else if (chess == array1[r1][c1])
code = array1[r1][c1] + code;// 记录棋子相连情况
else
code = array1[r1][c1] + code;// 记录棋子相连情况
break;
return code;
// 左斜向下统计的方法
public static String countHZXX(int r, int c)
String code = "0";
int chess = 0;// 存储第一颗出现的棋子
// 循环遍历
for (int r1 = r - 1, c1 = c + 1; c1 < row && r1 >= 0; c1++, r1--)
if (array1[r1][c1] == 0) // 表示空位沒有棋子
if (c1 - 1 == c && r1 + 1 == r) // 相邻
break;
else
code = array1[r1][c1] + code;// 记录棋子相连情况
break;
else // 表示该位置有棋子
if (chess == 0) // 第一次出现棋子
chess = array1[r1][c1];// 记录棋子
code = array1[r1][c1] + code;// 记录棋子相连情况
else if (chess == array1[r1][c1])
code = array1[r1][c1] + code;// 记录棋子相连情况
else
code = array1[r1][c1] + code;// 记录棋子相连情况
break;
return code;
// 右斜向下统计的方法
public static String countHYXX(int r, int c)
String code = "0";
int chess = 0;// 存储第一颗出现的棋子
// 循环遍历
for (int r1 = r + 1, c1 = c + 1; r1 < coloum && c1 < row; r1++, c1++)
if (array1[r1][c1] == 0) // 表示空位沒有棋子
if (c1 - 1 == c && r1 - 1 == r) // 相邻
break;
else
code = array1[r1][c1] + code;// 记录棋子相连情况
break;
else // 表示该位置有棋子
if (chess == 0) // 第一次出现棋子
chess = array1[r1][c1];// 记录棋子
code = array1[r1][c1] + code;// 记录棋子相连情况
else if (chess == array1[r1][c1])
code = array1[r1][c1] + code;// 记录棋子相连情况
else
code = array1[r1][c1] + code;// 记录棋子相连情况
break;
return code;
Chess.java
package com.sjsq;
import java.awt.Color;//设置棋子颜色和棋子的落子位置
public class Chess extends Object implements Gobang
int coloum,row; //输入列数,行数
Color color; //棋盘颜色的设置
public Chess(int coloum,int row,Color color)
this.coloum=coloum;
this.row=row;
this.color=color;
Gobang.java
package com.sjsq;
public interface Gobang //接口 申明全局变量
public static final int size = 40; // 设置格子大小为40
public static final int X = 20, Y = 20; // 设置棋盘右上角的位置
public static final int coloum = 15; //设置行数
public static final int row = 15; //设置列数
public static final int[][] array1 = new int[coloum][row]; //记录棋子位置的数组
public static final int[][] weightArray = new int[coloum][row]; //记录棋盘每个位置的权值
public static final boolean flag[] = new boolean[2]; //记录选择的模式
public static final boolean co[] = new boolean[2]; //记录选择的棋色
GobangListener.java
package com.sjsq;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import javax.swing.JOptionPane;
public class GobangListener extends MouseAdapter implements ActionListener,Gobang
private GobangMain gm; // 棋盘面板对象
private Graphics g; // 画笔对象
boolean cco=true; //记录玩家下棋还是电脑下棋
boolean fff=true; //记录是否能悔棋
boolean ggg=true; //记录是否能认输
private MyArrayList<Chess> array;
int coloum1,row1;
int xx,yy,max;
public GobangListener(GobangMain gm,MyArrayList<Chess> array) //从GobangMain传窗体对象和记录棋子的数组
this.gm = gm;
this.array=array;
public void actionPerformed(ActionEvent e)
if (e.getActionCommand().equals("悔棋"))
if(flag[0]) //人人对战悔棋
if(fff)
if(array.getSize()>1)
array1[coloum1][row1]=0;
Chess aaa=array.get(array.getSize()-2);
coloum1=aaa.coloum;
row1=aaa.row;
array.Delete();
cco=!cco;
gm.repaint();
if(flag[1]) //人机对战悔棋
if(fff)
if(cco)
if(array.getSize()>2)
array1[xx][yy]=0;
Chess aaa=array.get(array.getSize()-2);
coloum1=aaa.coloum;
row1=aaa.row;
array.Delete();
array1[coloum1][row1]=0;
Chess bbb=array.get(array.getSize()-2);
xx=bbb.coloum;
yy=bbb.row;
array.Delete();
gm.repaint();
if (e.getActionCommand().equals("认输"))
if(ggg)
if(flag[0])
if(cco)
JOptionPane.showMessageDialog(gm, "白棋获胜");
else
JOptionPane.showMessageDialog(gm, "黑棋获胜");
gm.removeMouseListener(this);
fff=false;
ggg=false;
if(flag[1])
if(co[0])
if(cco)
JOptionPane.showMessageDialog(gm, "黑棋获胜");
else
JOptionPane.showMessageDialog(gm, "白棋获胜");
gm.removeMouseListener(this);
fff=false;
ggg=false;
if(co[1])
if(cco)
JOptionPane.showMessageDialog(gm, "白棋获胜");
else
JOptionPane.showMessageDialog(gm, "黑棋获胜");
gm.removeMouseListener(this);
fff=false;
ggg=false;
array.Reset();
if (e.getActionCommand().equals("退出")) //退出游戏
System.exit(0);
if (e.getActionCommand().equals("人人对战")) //选择人人对战模式 flag[0]为true,flag[1]为false
flag[0]=true;
flag[1]=false;
for(int i=0;i<array1.length;i++)
Arrays.fill(array1[i], 0);
cco=true;
fff=true;
ggg=true;
array.Reset();
gm.repaint();
if (e.getActionCommand().equals("人机对战")) //选择人机对战模式 flag[0]为false,flag[1]为true
flag[0]=false;
flag[1]=true;
for(int i=0;i<array1.length;i++)
Arrays.fill(array1[i], 0);
cco=true;
fff=true;
ggg=true;
array.Reset();
gm.repaint();
if (e.getActionCommand().equals("黑子(先手)"))
co[0]=false;
co[1]=true;
for(int i=0;i<array1.length;i++)
Arrays.fill(array1[i], 0);
cco=true;
fff=true;
ggg=true;
array.Reset();
gm.repaint();
if (e.getActionCommand().equals("白子(后手)"))
co[0]=true;
co[1]=false;
for(int i=0;i<array1.length;i++)
Arrays.fill(array1[i], 0);
cco=false;
fff=true;
ggg=true;
array.Reset();
gm.repaint();
if (e.getActionCommand().equals("开始新游戏"))
if(flag[1])
if (co[1])
for(int i=0;i<array1.length;i++)
Arrays.fill(array1[i], 0);
gm.addMouseListener(this);
array.Reset();
gm.repaint();
if(co[0])
for(int i=0;i<array1.length;i++)
Arrays.fill(array1[i], 0);
// cco=false;
gm.addMouseListener(this);
array.Reset();
gm.repaint();
// g.setColor(Color.BLACK);
// g.fillOval(X+8*size-size/2, Y+8*size-size/2, size, size);
array1[7][7]=-1; //AI先手第一个子落点
Chess sh=new Chess(7,7,Color.BLACK);
array.add(sh);
cco=true;
fff=true;
ggg=true;
if(flag[0])
for(int i=0;i<array1.length;i++)
Arrays.fill(array1[i], 0);
cco=true;
fff=true;
ggg=true;
gm.addMouseListener(this);
array.Reset();
gm.repaint();
public void mouseReleased(MouseEvent e) //鼠标松开的时候进行的操作
if(flag[0]) //选择人人对战模式进行的操作
if (g == null)
g = gm.getGraphics();
int x = e.getX();
int y = e.getY();
coloum1 = (x-X+size/2)/size;
row1 = (y-Y+size/2)/size;
if(coloum1<coloum&&row1<row)
if(array1[coloum1][row1]==0)
if(cco)
g.setColor(Color.BLACK);
g.fillOval(X+coloum1*size-size/2, Y+row1*size-size/2, size, size);
array1[coloum1][row1]=1;
Chess sh=new Chess(coloum1,row1,Color.BLACK);
array.add(sh);
else
g.setColor(Color.WHITE);
g.fillOval(X+coloum1*size-size/2, Y+row1*size-size/2, size, size);
array1[coloum1][row1]=-1;
Chess sh=new Chess(coloum1,row1,Color.WHITE);
array.add(sh);
Judge jd=new Judge(coloum1,row1);
if(jd.judge())
if(cco)
JOptionPane.showMessageDialog(gm, "黑棋获胜");
else
JOptionPane.showMessageDialog(gm, "白棋获胜");
gm.removeMouseListener(this);
fff=false;
ggg=false;
array.Reset();
cco=!cco;
if(flag[1]) //选择人机对战进行的操作
if (g == null)
g = gm.getGraphics();
if(co[1])
if(cco) //若cco为true,则人下棋
int x = e.getX();
int y = e.getY();
coloum1 = (x-X+size/2)/size;
row1 = (y-Y+size/2)/size;
if(coloum1<coloum&&row1<row)
if(array1[coloum1][row1]==0)
g.setColor(Color.BLACK);
g.fillOval(X+coloum1*size-size/2, Y+row1*size-size/2, size, size);
array1[coloum1][row1]=1;
Chess sh=new Chess(coloum1,row1,Color.BLACK);
array.add(sh);
Judge jd=new Judge(coloum1,row1);
if(jd.judge())
if(cco)
JOptionPane.showMessageDialog(gm, "黑棋获胜");
else
JOptionPane.showMessageDialog(gm, "白棋获胜");
gm.removeMouseListener(this);
fff=false;
ggg=false;
array.Reset();
cco=!cco;
cco=!cco;
if(!cco) //若cco为false,则机器下棋
AIX();
if(co[0])
if(cco) //若cco为true,则人下棋
int x = e.getX();
int y = e.getY();
coloum1 = (x-X+size/2)/size;
row1 = (y-Y+size/2)/size;
if(coloum1<coloum&&row1<row)
if(array1[coloum1][row1]==0)
g.setColor(Color.WHITE);
g.fillOval(X+coloum1*size-size/2, Y+row1*size-size/2, size, size);
array1[coloum1][row1]=1;
Chess sh=new Chess(coloum1,row1,Color.WHITE);
array.add(sh);
Judge jd=new Judge(coloum1,row1);
if(jd.judge())
if(cco)
JOptionPane.showMessageDialog(gm, "白棋获胜");
else
JOptionPane.showMessageDialog(gm, "黑棋获胜");
gm.removeMouseListener(this);
fff=false;
ggg=false;
array.Reset();
cco=!cco;
cco=!cco;
if(!cco) //若cco为false,则机器下棋
AIX();
//调用AI进行下棋
public void AIX()
if(co[1])
for(int i=0;i<weightArray.length;i++)
for(int j=0;j<weightArray[i].length;j++)
weightArray[i][j]=0;
max=-1;
AI.Quan();
for(int i=0;i<weightArray.length;i++)
for(int j=0;j<weightArray[i].length;j++)
if(i<5&&j<5)
if(max<=weightArray[i][j]&&array1[i][j]==0)
max=weightArray[i][j];
xx=i;yy=j;
else
if(max<weightArray[i][j]&&array1[i][j]==0)
max=weightArray[i][j];
xx=i;yy=j;
if(array1[xx][yy]==0)
g.setColor(Color.WHITE);
g.fillOval(X+xx*size-size/2, Y+yy*size-size/2, size, size);
array1[xx][yy]=-1;
Chess sh=new Chess(xx,yy,Color.WHITE);
array.add(sh);
Judge jd=new Judge(xx,yy);
if(jd.judge())
if(cco)
JOptionPane.showMessageDialog(gm, "黑棋获胜");
else
JOptionPane.showMessageDialog(gm, "白棋获胜");
gm.removeMouseListener(this); //移除监听,这时将不能对棋盘进行操作
fff=false; //设置不能进行悔棋
ggg=false; //设置不能进行认输
array.Reset();
cco=!cco;
if(co[0])
for(int i=0;i<weightArray.length;i++)
for(int j=0;j<weightArray[i].length;j++)
weightArray[i][j]=0;
max=-1;
AI.Quan();
for(int i=0;i<weightArray.length;i++)
for(int j=0;j<weightArray[i].length;j++)
if(i<5&&j<5)
if(max<=weightArray[i][j]&&array1[i][j]==0)
max=weightArray[i][j];
xx=i;yy=j;
else
if(max<weightArray[i][j]&&array1[i][j]==0)
max=weightArray[i][j];
xx=i;yy=j;
if(array1[xx][yy]==0)
g.setColor(Color.BLACK);
g.fillOval(X+xx*size-size/2, Y+yy*size-size/2, size, size);
array1[xx][yy]=-1;
Chess sh=new Chess(xx,yy,Color.BLACK);
array.add(sh);
Judge jd=new Judge(xx,yy);
if(jd.judge())
if(cco)
JOptionPane.showMessageDialog(gm, "白棋获胜");
else
JOptionPane.showMessageDialog(gm, "黑棋获胜");
gm.removeMouseListener(this); //移除监听,这时将不能对棋盘进行操作
fff=false; //设置不能进行悔棋
ggg=false; //设置不能进行认输
array.Reset();
cco=!cco;
四、其他
1.更多系统
JavaSwing系统系列实现
Java+JSP系统系列实现
Java+Servlet系统系列实现
Java+SSM系统系列实现
Java+SSH系统系列实现
Java+Springboot系统系列实现
Java+Springboot+H-ui+Maven实现营销管理系统
Java+Springboot+Bootstrap+Maven实现网上商城系统
Java+Springboot+Bootstrap+Maven实现景区旅游管理系统
1.更多JavaWeb系统请关注专栏。
https://blog.csdn.net/helongqiang/category_10020130.htmlhttps://blog.csdn.net/helongqiang/category_10020130.html
2.更多JavaSwing系统请关注专栏。
2.源码下载
3.运行项目
请点击以下链接,部署你的项目。
4.备注
如有侵权请联系我删除。
5.支持博主
如果您觉得此文对您有帮助,请点赞加关注加收藏。祝您生活愉快!
以上是关于Java+Swing实现五子棋游戏的主要内容,如果未能解决你的问题,请参考以下文章