Java+Swing实现五子棋游戏

Posted 水坚石青

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java+Swing实现五子棋游戏相关的知识,希望对你有一定的参考价值。

目录

一、系统介绍

1.开发环境

2.技术选型

3.系统功能

二、系统展示

1.首页

2.黑棋走

3.白棋走

三、部分代码

AI.java

Chess.java

Gobang.java

GobangListener.java

四、其他

1.更多系统

JavaSwing系统系列实现

Java+JSP系统系列实现

Java+Servlet系统系列实现

Java+SSM系统系列实现

Java+SSH系统系列实现

Java+Springboot系统系列实现

2.源码下载

3.运行项目

4.备注

5.支持博主


一、系统介绍

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+Swing实现斗地主游戏

Java+Swing实现图书管理系统

Java+Swing实现医院管理系统

Java+Swing实现考试管理系统

Java+Swing实现酒店管理系统

Java+Swing实现超市管理系统

Java+Swing实现电影购票系统

Java+Swing实现仓库管理系统-1

Java+Swing实现仓库管理系统-2

Java+Swing实现进销存管理系统

Java+Swing实现自助取款机系统

Java+Swing实现通讯录管理系统

Java+Swing实现停车场管理系统

Java+Swing实现学生信息管理系统

Java+Swing实现学生宿舍管理系统

Java+Swing实现学生选课管理系统

Java+Swing实现学生成绩管理系统

Java+Swing实现学校教材管理系统

Java+Swing实现学校教务管理系统

Java+Swing实现企业人事管理系统

Java+Swing实现电子相册管理系统

Java+Swing实现超市管理系统-TXT存储数据

Java+Swing实现自助取款机系统-TXT存储数据

Java+Swing实现宠物商店管理系统-TXT存储数据

Java+JSP系统系列实现

Java+JSP实现学生图书管理系统

Java+JSP实现学生信息管理系统

Java+JSP实现用户信息管理系统

Java+Servlet系统系列实现

Java+Servlet+JSP实现航空订票系统

Java+Servlet+JSP实现新闻发布系统

Java+Servlet+JSP学生宿舍管理系统

Java+Servlet+JSP实现图书管理系统

Java+Servlet+JSP实现停车场管理系统

Java+Servlet+JSP实现房屋租赁管理系统

Java+Servlet+JSP实现学生信息管理系统

Java+Servlet+JSP实现学生选课管理系统

Java+Servlet+JSP实现宠物诊所管理系统

Java+Servlet+JSP实现学生成绩管理系统-1

Java+Servlet+JSP实现学生成绩管理系统-2

Java+SSM系统系列实现

Java+SSM+JSP实现图书管理系统

Java+SSM+JSP实现超市订单系统

J​​​ava+SSM+JSP实现网上考试系统

Java+SSM+JSP实现宠物商城系统

Java+SSM+Layui实现学生成绩管理系统

Java+SSM+Bootstrap实现学生信息管理系统

Java+SSH系统系列实现

Java+SSH+JSP实现在线考试系统

Java+SSH+JSP实现医院在线挂号系统

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系统请关注专栏。

https://blog.csdn.net/helongqiang/category_6229101.htmlhttps://blog.csdn.net/helongqiang/category_6229101.html

2.源码下载

Java+Swing实现五子棋游戏

3.运行项目

 请点击以下链接,部署你的项目。

Eclipse如何导入JavaSwing项目超详细图文教程

Eclipse如何导入JavaSwing项目超详细视频教程

4.备注

如有侵权请联系我删除。

5.支持博主

如果您觉得此文对您有帮助,请点赞加关注加收藏。祝您生活愉快!

以上是关于Java+Swing实现五子棋游戏的主要内容,如果未能解决你的问题,请参考以下文章

基于Java Swing五子棋小游戏设计和实现

基于Java Swing五子棋小游戏设计和实现

JAVA 实现《五子棋》游戏|CSDN创作打卡

利用Java类和对象以及数组开发一个小型五子棋游戏

Java五子棋课程设计

五子棋算法问题(求解)