getsamechessNum0()函数的代码如下:
private int getsamechessNum0(int[][] qij,int chessID){
//得到水平方向的同子数目
int num=1; //存储相同棋子数目,当前点满足条件
qij[1][0]--;
while(qij[1][0]>=0 && num<5){ //向左探索//我们只探索临近的4个点,注意不要出边界哦
if(curChess[qij[0][0]][qij[1][0]]!=chessID)break;
num++;
qij[1][0]--;
}
qij[1][1]++;
while(qij[1][1]<Model.MaxlineX && num<5){ //向右探索
if(curChess[qij[0][1]][qij[1][1]]!=chessID)break;
num++;
qij[1][1]++;
}
return num;
}
getQuanpart()的代码如下:
private int getQuanpart(int sameChessNum,int blankNum){
//求取某一方向上的一半权值
if(sameChessNum==2 && blankNum==1)return Q2O;
else if(sameChessNum==2 && blankNum==2)return Q2;
else if(sameChessNum==3 && blankNum==1)return Q3O;
else if(sameChessNum==3 && blankNum==2)return Q3;
else if(sameChessNum==4 && blankNum==1)return Q4O;
else if(sameChessNum==4 && blankNum==2)return Q4;
else if(sameChessNum==5)return Q5;
else return 0;
}
以上是求水平方向权值的全过程,到现在为止,其他三个方向上的权值求法大家也都会了。一一把它们加到suanfa类里就可以了。这里就不再赘述了。
4)判断输赢
从落子点分别向四个方向探索,只要有一个方向上的相同棋子达到5个,就可以判赢了。前文刚刚定义了getsamechessNum0()函数。用此函数就可以得到在水平方向上相同棋子的数目。其他三个方向上也是一样。具体代码如下:
public boolean isWin(int chessID){
//判断下棋方是否赢棋
int[][] ij0=new int[2][2];
int[][] ij90=new int[2][2];
int[][] ij135=new int[2][2];
int[][] ij45=new int[2][2];
ij0[0][0]=ij0[0][1]=ci; //赋值落子点位置,下同
ij0[1][0]=ij0[1][1]=cj;
ij90[0][0]=ij90[0][1]=ci;
ij90[1][0]=ij90[1][1]=cj;
ij135[0][0]=ij135[0][1]=ci;
ij135[1][0]=ij135[1][1]=cj;
ij45[0][0]=ij45[0][1]=ci;
ij45[1][0]=ij45[1][1]=cj;
if(getsamechessNum0(ij0,chessID)==5 || getsamechessNum90(ij90,chessID)==5 || getsamechessNum135(ij135,chessID)==5 || getsamechessNum45(ij45,chessID)==5)
return true;
else
return false;
}
5)为了能被其他类调用,还需要在suanfa类里添加一个对外的接口,并能够遍历棋盘。实现代码如下:
public void countchessLocation(int[] sij){
//计算机器落子的最佳位置
int qhigh=-1;//纪录当前最高权值
int qhere;//纪录当前位置的权值
for(int i=0;i<Model.MaxlineY;i++)
for(int j=0;j<Model.MaxlineX;j++)
if(curChess[i][j]==0)
if((qhere=getQuan(i,j))>qhigh){
qhigh=qhere;
sij[0]=i;sij[1]=j;
}
}
到此为止,已经实现电脑智能,并可以判断输赢了。
5.下棋状态
下棋有很多状态,读者可以按照自己的想法一一添加。本文只简单介绍输赢状态的添加,因为上文代码中已提到。
(1) 新建一个JPanel窗体,取名JPstate。
(2) 添加一个JLabel控件,代码如下:
public static JLabel JLinfo=new JLabel();
public JPstate() {
initComponents();
add(JLinfo);
JLinfo.setBounds(10,30,30,200);
JLinfo.setIcon(null);
}
至此,一个五子棋人机对战版已经完成了。最后界面如图2所示:
四、结语
该程序阅读起来可能有些困难。不过学习编程最好的方法就是阅读、调试程序,在实践中学习。建议读者先按照本文给出的步骤一步一步完成程序,再一边调试一边思考代码的含义和联系,领悟编程的方法。该程序在NeatBeans IDE 5.0,XP环境下调试通过。
|