然后,要用它来复制当前棋局。具体代码如下:
private void copyChessboard(int[][] chess){
//复制当前棋盘
for(int i=0;i<Model.MaxlineY;i++)
for(int j=0;j<Model.MaxlineX;j++)
curChess[i][j]=chess[i][j];
}
第二步:记录当前落子点。具体代码如下:
private int ci,cj; //纪录当前落子的位置
private void copychessLocation(int i,int j){
//纪录当前落子的位置
ci=i;cj=j;
}
第三步:记录下棋方ID。具体代码如下:
private int nameID;//纪录当前下棋方
最后,定义一个函数,把它们全部包含进来,具体代码如下:
public void loadInfo(int[][] chess,int i,int j){
//下载相关信息到算法类
copyChessboard(chess);
copychessLocation(i,j);
nameID=2;
}
至此,棋局的基本信息已经有了,下一步要利用它来实现电脑智能。
3)实现电脑智能。
上文已经提到,这是本文的重点。希望读者细细看之。
①定义权值(玩家黑子)
例:黑白白空50 //黑代表黑子,即玩家落的子;白代表白子,即电脑落的子;空代表空子,即在该位置上还未落子;黑白白空代表棋盘上某条线上连续4点所构成的一种格局;50代表在棋盘上某条线上构成上述格局时应赋予的权值
黑白白空 50
空白白空 100
黑白白白空 500
空白白白空 1000
黑白白白白空 5000
空白白白白空 10000
白白白白白 100000
代码实现如下:
//定义suanfa类的权值常量
private final int Q2O=50;
private final int Q2=100;
private final int Q3O=500;
private final int Q3=1000;
private final int Q4O=5000;
private final int Q4=10000;
private final int Q5=100000;
②计算权值
权值定义好后,就可以用来计算棋盘上各个点的权值了。经分析,棋盘上某个点的权值有四部分构成,分别是此点在水平方向上的权值,此点在垂直方向上的权值,此点在45度方向上的权值,此点在135度方向上的权值。所以,必须先求出这四个方向上的权值,然后再将它们进行相加便得到这个点的权值了。
代码实现如下:
private int getQuan(int i,int j){ //i,j记录当前假定的落子点
//求当前位置的权值
int q=0;
q+=getQuan0(i,j); //得到水平方向上的权值,下面类似
q+=getQuan90(i,j);
q+=getQuan135(i,j);
q+=getQuan45(i,j);
return q;
}
可以看到,getQuan(i,j)有两个形参i和j,它们是用来记录棋盘上某点的位置,即curChess[i][j]。
大概思路已经理出来了,下面将具体讨论getQuan0(i,j)的求法。其它三个函数getQuan90(i,j)、getQuan135(i,j)、getQuan45(i,j)与getQuan0(i,j)大同小异,请读者自分析之。
getQuan0(i,j)是求i,j所对应的棋盘上的点在水平方向上的权值的。这里我们要考虑两种情况,一种是尽快让电脑赢,在①已经定义好了权值,只要从i,j点开始,在水平方向上向两边探索,就可以求得相应的权值qS;另一种情况是防止玩家尽快取胜。按一般思维考虑,还需要定义一些权值。稍稍思索,完全可以用在①定义的权值,只是我们需要调换角度,站在玩家的立场上考虑就可以了。也就是说,把①里的黑白子互换,其中一黑子是电脑的假定落子,权值不变。把按这种方式求出的权值作为电脑堵棋的权值qF。最后,把这两种权值相加,便得到该点在水平方向上的权值(q=qS+qF)。具体代码如下:
private int getQuan0(int i,int j){
//水平权值
int samechessNumS=0;//相同棋子的个数
int samechessNumF=0;
int blankNumS=0;//空子的个数
int blankNumF=0;
int q=0,qS=0,qF=0;
int[][] ij0=new int[2][2];//计算权值用的
ij0[0][0]=ij0[0][1]=i;
ij0[1][0]=ij0[1][1]=j;
samechessNumS=getsamechessNum0(ij0,1); //得到白子数目
if(ij0[1][0]>=0)
if(curChess[ij0[0][0]][ij0[1][0]]==0)
blankNumS++;
if(ij0[1][1]<Model.MaxlineX)
if(curChess[ij0[0][1]][ij0[1][1]]==0)
blankNumS++;
qS=getQuanpart(samechessNumS,blankNumS); //得到速胜权值
ij0[0][0]=ij0[0][1]=i;
ij0[1][0]=ij0[1][1]=j;
samechessNumF=getsamechessNum0(ij0,2); //得到黑子数目
if(ij0[1][0]>=0)
if(curChess[ij0[0][0]][ij0[1][0]]==0)
blankNumF++;
if(ij0[1][1]<Model.MaxlineX)
if(curChess[ij0[0][1]][ij0[1][1]]==0)
blankNumF++;
qF=getQuanpart(samechessNumF,blankNumF); //得到堵敌权值
q=qS+qF;
return q;
}
|