j2se人机对弈部份,电脑究竟是如何下棋的呢?如何判断棋盘中哪一点的权值最高?请有识之人,给点思路,最好给出代码并加讲解,谢谢。。

解决方案 »

  1.   

    http://topic.csdn.net/u/20110603/23/49312d22-efec-48b0-8aba-cde3fdf4a8a9.html
    你可以联系这个贴的LZ 他有代码
      

  2.   

    public class suanfa {

    //黑白白空      50
    //空白白空     100
    //黑白白白空  500
    //空白白白空 1000
    //黑白白白白空 5000
    //空白白白白空 10000
    //白白白白白      100000

    private static String white="○";
    private static String back="●";
    private static String Chess="十";

    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;
    private String[][] curchess;
    private int ci,cj;


    /**
     * @param args
     */


    //复制棋盘
    private void copychess(String[][] chess)
    {
    curchess=new String[19][19];
    for(int i=0;i<19;i++)
    {
    for(int j=0;j<19;j++)
    {
    curchess[i][j]=chess[i][j];
    }
    }
    }
    //当前落子点
    private void copychessLocaltion(int i,int j)
    {
    ci=i;
    cj=j;
    }


    //下载相关信息到算法类
    public void loadInfo(String[][] chess,int i,int j)
    {
    copychess(chess);
    copychessLocaltion(i,j);

    }


    //记录当前假定的落子点
    private int getQuan(int i,int j)
    {
    int q=0;       //求当前位置的权值
    q+=getQuan0(i,j);   //得到水平方向上的权值,下面类似
    q+=getQuan90(i,j);
    q+=getQuan135(i,j);
    q+=getQuan45(i,j);

    return q;

    }
    private int getsamechessNum0(int[][] qij, String chessID) {
    //得到水平方向的同子数目
    int num=1;  //存储相同棋子数目,当前点满足条件
    qij[1][0]--;
    //向左探索我们只探索临近的4个点,注意不要出边界
    while(qij[1][0]>=0&&num<5)
    {
    if(curchess[qij[0][0]][qij[1][0]]!=chessID) break;
    num++;
    qij[1][0]--;
    }
    qij[1][1]++;
    //向右求索
    while(qij[1][1]<19&&num<5)
    {
    if(curchess[qij[0][1]][qij[1][1]]!=chessID) break;
    num++;
    qij[1][1]++;
    }

    return num;
    }

    //求得某一方向上的一半权值
    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;
    } /*
     * 为了能被其他类调用,还需要添加一个对外的接口,并能够遍历棋盘。
     */
    public void countshessLocaltion(int[] sij)
    {
    int qhigh=-1;  //记录当前最高权值
    int qhere;      //记录当前位置的权值
    for(int i=0;i<19;i++)
    {
    for(int j=0;j<19;j++)
    {
    if(curchess[i][j]==Chess)
    if((qhere=getQuan(i,j))>qhigh)
    {
    qhigh=qhere;
    sij[0]=i;sij[1]=j;
    }
    }
    }
    }

    //水平权值
    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,white);
    //得到白子数目
    if(ij0[1][0]>=0)
    if(curchess[ij0[0][0]][ij0[1][0]]==Chess)
    blankNumS++;
    if(ij0[1][1]<19)
    if(curchess[ij0[0][1]][ij0[1][1]]==Chess)
    blankNumS++;
    qS=getQuanpart(samechessNumS,blankNumS);

    //得到速胜权值
    ij0[0][0]=ij0[0][1]=i;
    ij0[1][0]=ij0[1][1]=j;
    samechessNumF=getsamechessNum0(ij0,back);
    //得到黑子数目
    if(ij0[1][0]>=0)
    if(curchess[ij0[0][0]][ij0[1][0]]==Chess)
    blankNumF++;
    if(ij0[1][1]<19)
    if(curchess[ij0[0][1]][ij0[1][1]]==Chess)
    blankNumF++;
    qF=getQuanpart(samechessNumF,blankNumF);
    //得到堵敌权值
    q=qS+qF;
    return q;
    }

    private int getQuan45(int i, int j) {
    // TODO Auto-generated method stub
    return 0;
    } private int getQuan135(int i, int j) {
    // TODO Auto-generated method stub
    return 0;
    } private int getQuan90(int i, int j) {
    // TODO Auto-generated method stub
    return 0;
    }}
    /////////////////////////////////////////////////////////////////////////////////
    下面这几句我不懂是什么意思,麻烦帮忙解决一下,其它的我都明白了。
    //得到白子数目
    if(ij0[1][0]>=0)
    if(curchess[ij0[0][0]][ij0[1][0]]==Chess)
    blankNumS++;
    if(ij0[1][1]<19)
    if(curchess[ij0[0][1]][ij0[1][1]]==Chess)
    blankNumS++;