说到ai这个热词,很多人都会变得兴奋,那么我们就来聊聊五子棋ai的那些事
1.通过哈希表实现ai
这种ai实现方法可以说是相当笨拙的了,主要是利用哈希表能够接受字符串返回整形对象的特点,实现对不同棋形进行赋权,最后加权得到最优解的方法
HashMap hm=new HashMap();
hm.put("0001",50);
hm.put("-1000", 30);
hm.put("1000",20);
hm.put("1-10", 20);
hm.put("-1-1-10", 150);
hm.put("1000", 100);
hm.put("-1-100", 150);
hm.put("0110",100);
hm.put("1100", 100);
hm.put("1110", 1000);
hm.put("0111", 1000);
hm.put("-1-1-1-1", 15000);
hm.put("1111", 20000);//有兴趣的同学自己优化一下,这是我自己乱敲的
int a[][]= {{-1,0,1},{-1,0,1}};//通过这个数组实现对八个方向的检索,一个很实用的操作
for(int i=0;i=0&&j+m*a[1][l]<15&&j+m*a[1][l]>=0)
va+=chessplace[i+m*a[0][k]][j+m*a[1][l]];
Integer ff=hm.get(va);
if(ff!=null)
chessvalue[i][j]+=ff;//小心空对象报错哦!
}
}
}
}
}
这个算法除了特别容易实现以外没有什么优点,尤其是它没有办法分辨1101这样两黑一空一黑的局面,而且没有多少延展性,不能对后续局面进行判断。
2,落子后对全局局势进行判断,选择最佳落子地点
这种算法也是五子棋中常用的算法,方法很简单,五子棋中有所谓活四,死四,双活三的说法,只要给以上每种行为赋值,并且相加就可以得出全局局势的总值,最后从中选择最佳点
这种算法也有很大的缺点,那就是它的速度相当慢,甚至有时会出现肉眼可见的停顿,而且缺乏远见,只能对当前局势做出最优解,首先我们还是再看一下代码。
`public double getvalue1(int a, int b) {
double value2 = 0;
chessplace[a][b] = -1;//落下黑子
for (int i = 0; i < Config.ROW; i++) {
for (int j = 0; j < Config.ROW; j++) {
int c[][] = { { -1, 0, 1 }, { -1, 0, 1 } };
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++) {
String va = "";
for (int m = 0; m <=4; m++)
if (a + m * c[0][k] < 15 && a + m * c[0][k] >= 0 && b + m * c[1][l] < 15
&& b + m * c[1][l] >= 0)
va += chessplace[a + m * c[0][k]][b + m * c[1][l]];
switch (va) {
case"00000":
value2+=0;
break;
case"-11000":
value2+=1;
break;
case "0-1-1-10":
value2 += 5000;
break;
case "0-1-1-11":
value2 += 2;
break;
case "0111-1":
value2 += 6000;
break;
case "-11110":
value2 += 6000;
break;
case "0-1-1-1-1":
value2 += 100000;
break;
case "1111-1":
value2 += 800000;
break;
case "-11111":
value2 += 800000;
break;
case "-1-1-1-11":
value2 += 100000;
break;
case "0-1-100":
value2 += 5;
break;
case "-1-1-1-1-1":
value2 += 100000000;
break;
default:value2 +=0;
}
}
}
}}
chessplace[a][b] = 0;//注意这列不要忘记把棋子收回,否则你就会看到被完全下满的棋盘
return value2;
}`
关于再进一步的话,其实我们可以采取博弈树的模式,让我们的ai变得更加厉害——选择权值前三的点,然后让ai对这个局势进若干次博弈,最终得到胜利的方向,这就是我们所谓的走一步看三步了,具体相关的代码等我有时间再来完善好了(咕咕咕