Java+Swing实现五子棋游戏的示例代码

目录
  • 一、系统介绍
    • 1.开发环境
    • 2.技术选型
    • 3.系统功能
  • 二、系统展示
  • 三、部分代码
    • AI.java
    • Chess.java
    • Gobang.java
    • GobangListener.java

一、系统介绍

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;
			}
		}
}

	}

以上就是Java+Swing实现五子棋游戏的示例代码的详细内容,更多关于Java Swing五子棋的资料请关注我们其它相关文章!

(0)

相关推荐

  • java基于swing实现的五子棋游戏代码

    本文实例讲述了java基于swing实现的五子棋游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ActionListener{         private static final long serialVersionUID = 1L;      

  • Java+Swing实现经典五子棋游戏

    目录 前言 主要需求 主要设计 功能截图 代码实现 总结 前言 五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜. 棋具与围棋通用,起源于中国上古时代的传统黑白棋种之一.主要流行于华人和汉字文化圈的国家以及欧美一些地区,是世界上最古老的棋. 容易上手,老少皆宜,而且趣味横生,引人入胜:不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性. 用java语言实现

  • Java swing五子棋的实现方法

    今天给大家介绍一下如何用Java swing实现五子棋的开发即用Java开发图形界面程序五子棋,代码由于太多,只贴部分,最下面会附上下载地址,废话不多说,下面我们先看一下运行结果: 接下来我们看代码: 首先是创建主frame框架界面: package org.liky.game.frame; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Toolkit; import

  • Java初学者之五子棋游戏实现教程

    本文为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 1.图形化界面的创建 1.1创建JFrame窗体容器 1)JFrame窗体需要设置基本的大小.布局.默认的关闭方式,以及最重要的设置可见. 1.2在JFrame上添加组件,用来绘制棋盘棋子和游戏操作. 1)棋盘棋子的绘制:自定义一个类去继承JPanel,把绘制棋盘和棋子的方法重写进入paint()方法里,这样当窗体发生变化(放大.缩小.移动等操作时,棋盘棋子不会消失,棋局得以保存). 2)悔棋.认输等操作通过JButto

  • java swing实现简单的五子棋游戏

    用java swing写的一个简单的五子棋游戏. 下面是Main.java. package com.crossing.main; import com.crossing.view.GameWindow; public class Main { /** * @param args */ public static void main(String[] args) { GameWindow gameWindow = new GameWindow(); } } 下面是GameWindow.java.

  • java实现简易的五子棋游戏

    本文实例为大家分享了java实现简易五子棋游戏的具体代码,供大家参考,具体内容如下 先上效果图 一.问题分析 1.五子棋游戏分析: 五子棋作为较为普遍且简易的娱乐游戏,受到众多人的热爱,且五子棋AI也是一个较为容易实现的AI.下面我们先来分析游戏规则.(哈哈,虽然大家都知道,但我还是想写写)双方分别使用黑白两色棋子,下在棋盘横线交叉处,先连成五子者胜利.(黑棋禁手啥的规则在我的程序里没加,就不赘述了). 2.程序分析: (1)首先,五子棋开始,我们需要一个棋盘,15*15的棋盘,需要黑白棋子.

  • java Swing实现五子棋游戏

    本文实例为大家分享了java实现五子棋项目,供大家参考,具体内容如下 运行结果 视频经过压缩画质略显粗糙. 标题 1)绘制网格棋盘: 重写JPanel的paint(Graphics g)方法,绘制16*16网格. 如图: 2)代码如下(仅包含部分代码): public class Board extends JPanel{ int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.get

  • Java+Swing实现五子棋游戏的示例代码

    目录 一.系统介绍 1.开发环境 2.技术选型 3.系统功能 二.系统展示 三.部分代码 AI.java Chess.java Gobang.java GobangListener.java 一.系统介绍 1.开发环境 开发工具:Eclipse2021 JDK版本:jdk1.8 Mysql版本:8.0.13 2.技术选型 Java+Swing 3.系统功能 实现五子棋游戏,开始游戏,悔棋,认输,退出功能. 二.系统展示 1.首页 2.黑棋走 3.白棋走 三.部分代码 AI.java packag

  • Java实现单机版五子棋游戏的示例代码

    目录 前言 主要需求 主要设计 功能截图 代码实现 总结 前言 五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜. 棋具与围棋通用,起源于中国上古时代的传统黑白棋种之一.主要流行于华人和汉字文化圈的国家以及欧美一些地区,是世界上最古老的棋. 容易上手,老少皆宜,而且趣味横生,引人入胜:不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性. 用java语言实现

  • Java实现AI五子棋游戏的示例代码

    目录 前言 实现过程 抽象 实现AI接口 评估函数 前言 本文只是介绍五子棋AI的实现,最终的成品只是一个 AI 接口,并不包括 GUI,且不依赖 GUI. 五子棋 AI 的实现并不难,只需要解决一个问题就行: 怎么确定AI的最佳落子位置? 一般情况下,五子棋棋盘是由15条横线和15条纵线组合而成的,15x15 的棋盘共有 225 个交叉点,也就是说共有 225 个落子点. 假如说,AI 是黑棋,先行落子,所以 AI 总共有 225 个落子点可以选择,我们可以对每个落子点进行评估打分,哪个分高下

  • Java实现萝卜勇者游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 启动类 键盘监听 核心算法 总结 前言 <萝卜勇者>是由国内玩家自制的一款独立游戏,玩家扮演萝卜勇士闯关,打败各种邪恶的敌人,获得最后的胜利. <萝卜勇者>游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 参考<萝卜勇者>的剧情,实现JAVA版本的单机游戏. 主要设计 1. 用Swing库做可视化界面 2.键盘监听,用WSAD可以控制光标移动,J是确定,K是取消,游戏中,WSA

  • JAVA实现经典扫雷游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 总结 前言 windows自带的游戏<扫雷>是陪伴了无数人的经典游戏,本程序参考<扫雷>的规则进行了简化,用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 1.要有难度等级,初级,中级,高级 2.由玩家逐个翻开方块,以找出所有地雷为最终游戏目标.如果玩家翻开的方块有地雷,则游戏结束 3.游戏主区域由很多个方格组成.使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字:方格中数字则表示其

  • Java实现贪吃蛇游戏的示例代码

    目录 项目演示 项目实战 1. 游戏的主启动类 2. 游戏的面板 3. 数据中心 4. 绘制静态面板 5. 绘制静态小蛇 6. 绘制动态小蛇 7. 设置游戏状态 8. 让蛇动起来 9. 绘制食物布局 10. 游戏失败判定 11. 积分获取系统 12. 游戏优化 项目演示 项目演示地址 项目实战 1. 游戏的主启动类 作为贪吃蛇游戏的主启动类,构建了顶级窗口,可以容纳各种面板, package Snake; import javax.swing.*; /** * 游戏的主启动类 */ public

  • Java实现角色扮演游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏启动类 抽象类:游戏角色类 魔法行为接口 总结 前言 <模式策略的角色扮演游戏>游戏是自制的角色扮演游戏.选择两个角色,然后进行PK,可用来学习JAVA的接口,继承和多态. 主要设计 1.事先设计好英雄,血量和相关技能. 2.为了让玩家能与程序互动,使用下面这个命令可达效果 Scanner sc = new Scanner(System.in); 3.运行StartMain里的main方法 4.设计四个角色 1.Queen 2.King 3.Kni

  • java实现双人五子棋游戏

    本文实例为大家分享了java实现双人五子棋游戏的具体代码,供大家参考,具体内容如下 通过 上下左右 控制棋盘走动  空格落子   (深度优先搜索) package day_1;    import java.awt.*; import javax.swing.*;   import java.awt.event.*;   public class CircleRun extends JFrame {     /**      *       */     MyPanel mp = null;  

  • java实现简易五子棋游戏

    本文实例为大家分享了java实现简易五子棋游戏的具体代码,供大家参考,具体内容如下 编写一个简易五子棋,棋盘在控制台中绘制,棋盘每- - 个点都有对应的坐标,下棋者输 入对应坐标落棋子,运行效果如图所示.两位数字表示的坐标中,第-一个数字表示横坐标, 第二个数字表示纵坐标,运行结果如图所示. 代码: package Test; import java.util.Scanner; public class Test4 { public static void main(String[] args)

随机推荐