Java+Swing实现五子棋游戏的示例代码
程序员文章站
2022-06-03 23:06:09
目录一、系统介绍1.开发环境2.技术选型3.系统功能二、系统展示三、部分代码ai.javachess.javagobang.javagobanglistener.java一、系统介绍1.开发环境开发工...
一、系统介绍
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五子棋的资料请关注其它相关文章!
上一篇: Servlet的线程安全问题