最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java+Swing實(shí)現(xiàn)五子棋游戲的示例代碼

 更新時(shí)間:2022年02月15日 15:48:22   作者:水堅(jiān)石青  
本文將通過Java語(yǔ)言實(shí)現(xiàn)經(jīng)典游戲—五子棋游戲,文中采用了Swing制作游戲界面,具有開始游戲,悔棋,認(rèn)輸,退出等功能。感興趣的可以跟隨小編一起動(dòng)手試一試

一、系統(tǒng)介紹

1.開發(fā)環(huán)境

開發(fā)工具:Eclipse2021

JDK版本:jdk1.8

Mysql版本:8.0.13

2.技術(shù)選型

Java+Swing

3.系統(tǒng)功能

實(shí)現(xiàn)五子棋游戲,開始游戲,悔棋,認(rèn)輸,退出功能。

二、系統(tǒng)展示

1.首頁(yè)

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 {
 
		/**
		 * 權(quán)值
		 */
		// 防守權(quán)值
		// 活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);
 
		 //進(jìn)攻權(quán)值
		 //活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) {// 如果該位置沒有棋子則開始統(tǒng)計(jì)
					code = countHL(r, c);// 調(diào)用水平向左統(tǒng)計(jì)的方法
					weight = map.get(code);// 根據(jù)棋子相連情況獲取對(duì)應(yīng)的權(quán)值
					if (weight != null) {// 判斷是否有該種棋子相連的情況
						weightArray[r][c] += weight;// 累加權(quán)值
					}
					// 把另外七個(gè)方向統(tǒng)計(jì)完畢后,就完成權(quán)值統(tǒng)計(jì)
					code = countHR(r, c);// 調(diào)用水平向右統(tǒng)計(jì)的方法
					weight = map.get(code);// 根據(jù)棋子相連情況獲取對(duì)應(yīng)的權(quán)值
					if (weight != null) {// 判斷是否有該種棋子相連的情況
						weightArray[r][c] += weight;// 累加權(quán)值
					}
 
					code = countHT(r, c);// 調(diào)用水平向左統(tǒng)計(jì)的方法
					weight = map.get(code);// 根據(jù)棋子相連情況獲取對(duì)應(yīng)的權(quán)值
					if (weight != null) {// 判斷是否有該種棋子相連的情況
						weightArray[r][c] += weight;// 累加權(quán)值
					}
 
					code = countHB(r, c);// 調(diào)用水平向左統(tǒng)計(jì)的方法
					weight = map.get(code);// 根據(jù)棋子相連情況獲取對(duì)應(yīng)的權(quán)值
					if (weight != null) {// 判斷是否有該種棋子相連的情況
						weightArray[r][c] += weight;// 累加權(quán)值
					}
 
					code = countHZXS(r, c);// 調(diào)用水平向左統(tǒng)計(jì)的方法
					weight = map.get(code);// 根據(jù)棋子相連情況獲取對(duì)應(yīng)的權(quán)值
					if (weight != null) {// 判斷是否有該種棋子相連的情況
						weightArray[r][c] += weight;// 累加權(quán)值
					}
 
					code = countHYXS(r, c);// 調(diào)用水平向左統(tǒng)計(jì)的方法
					weight = map.get(code);// 根據(jù)棋子相連情況獲取對(duì)應(yīng)的權(quán)值
					if (weight != null) {// 判斷是否有該種棋子相連的情況
						weightArray[r][c] += weight;// 累加權(quán)值
					}
 
					code = countHZXX(r, c);// 調(diào)用水平向左統(tǒng)計(jì)的方法
					weight = map.get(code);// 根據(jù)棋子相連情況獲取對(duì)應(yīng)的權(quán)值
					if (weight != null) {// 判斷是否有該種棋子相連的情況
						weightArray[r][c] += weight;// 累加權(quán)值
					}
 
					code = countHYXX(r, c);// 調(diào)用水平向左統(tǒng)計(jì)的方法
					weight = map.get(code);// 根據(jù)棋子相連情況獲取對(duì)應(yīng)的權(quán)值
					if (weight != null) {// 判斷是否有該種棋子相連的情況
						weightArray[r][c] += weight;// 累加權(quán)值
					}
// 針對(duì)每種情況都進(jìn)行權(quán)值分析,保證五子棋規(guī)則的完善
					// 判斷兩個(gè)2連在一條直線但中間有一個(gè)空位的情況
					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;
					}
 
					// 判斷一個(gè)活2連和一個(gè)活1連在一條直線上但中間有一個(gè)空位的情況
					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連在一條線上差一個(gè)棋位
					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;
					}
				}
			}
		}
	}
 
	// 水平向左統(tǒng)計(jì)的方法
	public static String countHL(int r, int c) {
		String code = "0";
		int chess = 0;// 存儲(chǔ)第一顆出現(xiàn)的棋子
		// 循環(huán)遍歷
		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) {// 第一次出現(xiàn)棋子
					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;
	}
 
	// 水平向右統(tǒng)計(jì)的方法
	public static String countHR(int r, int c) {
		String code = "0";
		int chess = 0;// 存儲(chǔ)第一顆出現(xiàn)的棋子
		// 循環(huán)遍歷
		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) {// 第一次出現(xiàn)棋子
					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;
	}
 
	// 豎直向上統(tǒng)計(jì)的方法
	public static String countHT(int r, int c) {
		String code = "0";
		int chess = 0;// 存儲(chǔ)第一顆出現(xiàn)的棋子
		// 循環(huán)遍歷
		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) {// 第一次出現(xiàn)棋子
					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;
	}
 
	// 豎直向下統(tǒng)計(jì)的方法
	public static String countHB(int r, int c) {
		String code = "0";
		int chess = 0;// 存儲(chǔ)第一顆出現(xiàn)的棋子
		// 循環(huán)遍歷
		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) {// 第一次出現(xiàn)棋子
					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;
	}
 
	// 左斜向上統(tǒng)計(jì)的方法
	public static String countHZXS(int r, int c) {
		String code = "0";
		int chess = 0;// 存儲(chǔ)第一顆出現(xiàn)的棋子
		// 循環(huán)遍歷
		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) {// 第一次出現(xiàn)棋子
					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;
	}
 
	// 右斜向上統(tǒng)計(jì)的方法
	public static String countHYXS(int r, int c) {
		String code = "0";
		int chess = 0;// 存儲(chǔ)第一顆出現(xiàn)的棋子
		// 循環(huán)遍歷
		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) {// 第一次出現(xiàn)棋子
					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;
	}
 
	// 左斜向下統(tǒng)計(jì)的方法
	public static String countHZXX(int r, int c) {
		String code = "0";
		int chess = 0;// 存儲(chǔ)第一顆出現(xiàn)的棋子
		// 循環(huán)遍歷
		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) {// 第一次出現(xiàn)棋子
					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;
	}
 
	// 右斜向下統(tǒng)計(jì)的方法
	public static String countHYXX(int r, int c) {
		String code = "0";
		int chess = 0;// 存儲(chǔ)第一顆出現(xiàn)的棋子
		// 循環(huán)遍歷
		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) {// 第一次出現(xiàn)棋子
					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;//設(shè)置棋子顏色和棋子的落子位置
 
public class Chess extends Object implements Gobang{
	int coloum,row; //輸入列數(shù),行數(shù)
	Color color; //棋盤顏色的設(shè)置
	
	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; // 設(shè)置格子大小為40
	public static final int X = 20, Y = 20; // 設(shè)置棋盤右上角的位置
	public static final int coloum = 15;    //設(shè)置行數(shù)
	public static final int row = 15;       //設(shè)置列數(shù)
	public static final int[][] array1 = new int[coloum][row];   //記錄棋子位置的數(shù)組
	public static final int[][] weightArray = new int[coloum][row];    //記錄棋盤每個(gè)位置的權(quán)值
	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;   	// 棋盤面板對(duì)象
	private Graphics g;     	// 畫筆對(duì)象
	boolean cco=true;      	//記錄玩家下棋還是電腦下棋
	boolean fff=true;     		//記錄是否能悔棋
	boolean	 ggg=true;    		//記錄是否能認(rèn)輸
	private MyArrayList<Chess> array;
	int coloum1,row1;
	int xx,yy,max;
	
	public GobangListener(GobangMain gm,MyArrayList<Chess> array) {  //從GobangMain傳窗體對(duì)象和記錄棋子的數(shù)組
		this.gm = gm;
		this.array=array;
	}
	
    public void actionPerformed(ActionEvent e) {
    	if (e.getActionCommand().equals("悔棋")) {
    		if(flag[0]) {           //人人對(duì)戰(zhàn)悔棋
    			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]) {      //人機(jī)對(duì)戰(zhàn)悔棋
    			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("認(rèn)輸")) {
    		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("人人對(duì)戰(zhàn)")) {  //選擇人人對(duì)戰(zhàn)模式 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("人機(jī)對(duì)戰(zhàn)")) {  //選擇人機(jī)對(duì)戰(zhàn)模式 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先手第一個(gè)子落點(diǎn)
			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) {     //鼠標(biāo)松開的時(shí)候進(jìn)行的操作
		if(flag[0]) {  //選擇人人對(duì)戰(zhàn)模式進(jìn)行的操作
			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]) { //選擇人機(jī)對(duì)戰(zhàn)進(jìn)行的操作
			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,則機(jī)器下棋
				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,則機(jī)器下棋
					AIX();
				}
			}
		}
		
		
	}
	
	//調(diào)用AI進(jìn)行下棋
	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);  //移除監(jiān)聽,這時(shí)將不能對(duì)棋盤進(jìn)行操作
				fff=false;         //設(shè)置不能進(jìn)行悔棋
				ggg=false;         //設(shè)置不能進(jìn)行認(rèn)輸
	    		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);  //移除監(jiān)聽,這時(shí)將不能對(duì)棋盤進(jìn)行操作
					fff=false;         //設(shè)置不能進(jìn)行悔棋
					ggg=false;         //設(shè)置不能進(jìn)行認(rèn)輸
		    		array.Reset();
				}
				cco=!cco;
			}
		}
}
	
 
 
 
	}

以上就是Java+Swing實(shí)現(xiàn)五子棋游戲的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Java Swing五子棋的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java處理字節(jié)的常用工具類

    java處理字節(jié)的常用工具類

    這篇文章主要為大家詳細(xì)介紹了java處理字節(jié)的常用工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java編寫的24點(diǎn)紙牌游戲

    Java編寫的24點(diǎn)紙牌游戲

    這篇文章主要介紹了Java編寫的24點(diǎn)紙牌游戲的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • SpringBoot訪問靜態(tài)資源的配置及順序說明

    SpringBoot訪問靜態(tài)資源的配置及順序說明

    這篇文章主要介紹了SpringBoot訪問靜態(tài)資源的配置及順序說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot 中實(shí)現(xiàn)跨域的5種方式小結(jié)

    SpringBoot 中實(shí)現(xiàn)跨域的5種方式小結(jié)

    這篇文章主要介紹了SpringBoot 中實(shí)現(xiàn)跨域的5種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • SpringIOC控制反轉(zhuǎn)的原理詳解

    SpringIOC控制反轉(zhuǎn)的原理詳解

    這篇文章主要介紹了SpringIOC控制反轉(zhuǎn)的原理詳解,本來管理業(yè)務(wù)對(duì)象(bean)的操作是由我們程序員去做的,但是有了?Spring?核心容器后,這些?Bean?對(duì)象的創(chuàng)建和管理交給我們Spring容器去做了,也就是控制權(quán)由程序員變成了容器,需要的朋友可以參考下
    2023-08-08
  • Java ResultSet案例講解

    Java ResultSet案例講解

    這篇文章主要介紹了Java ResultSet案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 導(dǎo)入SpringCloud依賴踩的坑及解決

    導(dǎo)入SpringCloud依賴踩的坑及解決

    這篇文章主要介紹了導(dǎo)入SpringCloud依賴踩的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java讀取文件內(nèi)容,解析Json格式數(shù)據(jù)方式

    java讀取文件內(nèi)容,解析Json格式數(shù)據(jù)方式

    這篇文章主要介紹了java讀取文件內(nèi)容,解析Json格式數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中StringUtils工具類的一些用法實(shí)例

    Java中StringUtils工具類的一些用法實(shí)例

    這篇文章主要介紹了Java中StringUtils工具類的一些用法實(shí)例,本文著重講解了isEmpty和isBlank方法的使用,另外也講解了trim、strip等方法的使用實(shí)例,需要的朋友可以參考下
    2015-06-06
  • JFreeChart實(shí)現(xiàn)實(shí)時(shí)曲線圖

    JFreeChart實(shí)現(xiàn)實(shí)時(shí)曲線圖

    這篇文章主要為大家詳細(xì)介紹了JFreeChart實(shí)現(xiàn)實(shí)時(shí)曲線圖的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06

最新評(píng)論

含山县| 平阳县| 乌恰县| 日土县| 马鞍山市| 泸西县| 云南省| 全南县| 双柏县| 龙游县| 永年县| 衡水市| 武乡县| 和硕县| 福安市| 尖扎县| 公安县| 宝山区| 阳曲县| 麦盖提县| 衡山县| 光泽县| 遵义市| 巢湖市| 金川县| 苗栗县| 社旗县| 历史| 射洪县| 和平区| 莆田市| 仙居县| 车致| 海兴县| 大兴区| 天镇县| 山东省| 普安县| 芷江| 湟源县| 鄂尔多斯市|