| 
				 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环境下调试通过。 			
				 |