你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 图形图象处理与游戏编程
用Java实现五子棋人机博弈(五)
 

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

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089