五子棋2.0
java项目开发(二)----五子棋2.0
新增内容
AI电脑下棋
HashMap、权值
- 死连--两端都能下棋的连子
- 活连--一端被堵住的连子
HashMap<String,Integer> hashmap=new HashMap<>();
//活连
hashmap.put("010", 10);
hashmap.put("0110", 100);
hashmap.put("01110", 1000);
hashmap.put("011110", 100000);
hashmap.put("020", 10);
hashmap.put("0220", 100);
hashmap.put("02220", 1000);
hashmap.put("022220", 100000);
//死连
//死一连
hashmap.put("012", 8);
hashmap.put("021", 8);
hashmap.put("01", 8);
hashmap.put("02", 8);
//死二连
hashmap.put("0112", 60);
hashmap.put("0221", 60);
hashmap.put("011", 60);
hashmap.put("022", 60);
//死三连
hashmap.put("01112", 900);
hashmap.put("02221", 900);
hashmap.put("0111", 900);
hashmap.put("0222", 900);
//死四连
hashmap.put("011112",90000);
hashmap.put("022221",90000);
hashmap.put("01111",90000);
hashmap.put("02222",90000);
遍历棋盘找到权值最大处下棋
创建一个与棋盘大小相同的数组存储权值
//创建一个与棋盘同大小的权值表
int[][] chessweight=new int[ROW+1][CLOUN+1];
设置for循环遍历棋盘
字符串"0"作为首位置的字符,每往后遍历一个棋子便加一个字符串
判断所遍历的这个棋棋盘是否符合所取条件
-这个位置必须没有棋子
-这个位置往后位置也不能为空(减少无效取值)
-当往后遍历取值到与连子不同棋子时记录并停止遍历,否则一直遍历下去
for(int i=0;i<chessNumArr.length;i++) {
for(int j=0;j<chessNumArr[i].length;j++) {
//记录这个棋子的权值
int code=0;
//判断这个点是否有棋子能够开始计数
if(chessNumArr[i][j]==0) {
//记录这个棋子的情况
int chessNum=chessNumArr[i][j];
//判断下个位置是否有棋子
//向右遍历记录符合要求的数组组合
if(j<chessNumArr[i].length-1&&chessNum!=chessNumArr[i][j+1]) {
String CodeStr="0";
int chess0=chessNumArr[i][j+1];
for(int k=j+1;k<chessNumArr[i].length;k++) {
//判断后面是否能继续连续下去
if(chess0==chessNumArr[i][k]) {
CodeStr=CodeStr+chessNumArr[i][k];
}else {
//记录并停止遍历
CodeStr=CodeStr+chessNumArr[i][k];
break;
}
}
}
}
}
空位置每遍历完一个方向便用HashMap得出权值加上
//判断这个字符串是否符合要求
if(hashmap.containsKey(CodeStr)) {
//给字符串赋值
code+=hashmap.get(CodeStr);}
接下来其他方向可以自己类比写出
监听器中写入
将游戏模式字符传入游戏监听器
-在五子棋界面创建字符串对象pattern
- 在游戏选择界面监听器中创建五子棋对象
- 按下游戏选择便给pattern赋值
- 因为五子棋界面对象以及传入游戏界面监听器,直接引用便是
//创建五子棋对象,引用它 的窗口,传入字符串
WuZiqi wzq=new WuZiqi();
if(btner.equals("人机模式")) {
startjf.setVisible(false);
wzq.initUI();
wzq.pattern="人机模式";
}
if(btner.equals("双人模式")) {
startjf.setVisible(false);
//引用窗口体
wzq.initUI