1.基本思路
首先讲一下这种算法的大概思路:
利用HashMap中key与value的对应关系。我们可以设置一个权值表。
weightMap.put("00", 0);
weightMap.put("0", 0);
//定义活一连
weightMap.put("010", 1);
weightMap.put("0-10", 1);
//定义活二连
weightMap.put("0110", 4);
weightMap.put("0-1-10", 4);
就设置成这样,给不同的情况设置一个value值,即权值,来表示危险程度。
当人下棋时,电脑下棋子在最大的地方阻止人赢。
当电脑下棋时,也选择权值最大的地方让电脑自己赢。
这样就只用每下一颗棋子,判断一遍整个棋盘空的部分的权值。
然后存入数组之中。筛选出权值最大的地方下棋。
2.部分代码
for(int i=0;i<chessExist.length;i++){
for(int j=0;j<chessExist[0].length;j++){
if(chessExist[i][j]==0){
String code="0";
int chess=0;//判断棋子出现次数
//判断是否为空位
//判断纵向向下方向
for(int k=1;k<=j;k++){
//如果向上的棋子是空棋
if(chessExist[i][j-k]==0){
//0的第一次出现,加上自身code=0,那么就有两个0连在一起了
code=chessExist[i][j-k]+code;
break;
}
//出现的是棋子的情况
else{
if(chess==0){
chess=chessExist[i][j-k];
code=chessExist[i][j-k]+code;
}
else if(chess==chessExist[i][j-k]){
code=chessExist[i][j-k]+code;
}else if(chess!=chessExist[i][j-k]){
code=chessExist[i][j-k]+code;
break;
}
}
}
weightchess[i][j]=weightMap.get(code)+weightchess[i][j];
//重置这些参数
code="0";
chess=0;
和判断输赢相同,这只是一个方向上的判断。重置参数后继续判断其他方向,因为代码都差不多,这里就不多写了,需要源码的可以留言交流
3.好处与弊端
好处:
这种写法是一个可以累加的写法,你可以不断的给HashMap添加权值,来丰富棋子的下法,比如双三的权值设置得更大一点。让别人用你的程序和AI下棋,如果AI输了,那么你就添加这种情况的权值,这样的话,AI的算法会随着添加的情况数的增加越来越厉害。
我的AI现在已经连我自己都下不赢了.......
弊端:
从上面可以看出,这个AI要变得比较聪明需要很多的情况考虑,一开始很容易考虑不完基本情况,可能运行着突然就会爆一个莫名其妙的错,比如找不到对应的权值,空指针异常。所以还是比较危险的。