⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 func.java

📁 这是一个经典的五子棋程序能够人机对战
💻 JAVA
字号:
package game;

/**
 * <p>Title: 五子棋</p>
 *
 * <p>Description: 五子棋游戏</p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: David Company</p>
 *
 * @author David
 * @version 1.0
 */
public class Func {
    private int[][] s=new int[15][];  //s=2 表示没有任何棋子,s=0表示黑方,s=1白方
    //下面数据是调试算法x,y
   int resultX=-1;
   int resultY=-1;
   //下面是一些图象常量数据
    int linespace=28;
    int xn=15;
    int yn=15;
    //保存MAX相同权值
    int equalMax[][]=new int[225][];   //equalMax[][0]=x;  equalMax[][1]=y
    int m_equalMax=-1;

    public Func() {
            for (int i=0;i<=14;i++){
              s[i] = new int[15];
              for (int j=0;j<=14;j++){
                s[i][j]=2;
              }
            }
    }
    public int getResultX(){
        return resultX;
    }
    public int getResultY(){
        return resultY;
    }
    public void setXY(int x,int y,int turn){
        s[x][y]=turn;
    }
    public void run(){
        getXY();
    }
    /* nowS is the function to view S[][] */
    public void showS(){
        for (int i=0;i<=14;i++){
            for (int j = 0; j <= 14; j++) {
                System.out.print(s[i][j] + " ");
            }
            System.out.println("");
        }
    }


    /* 下面是算法部分 */
   //isFive is the funcation to check 五个子
    private long calw(int x,int y,int turn){
        int a[][]=new int[4][];
        int i;
        int num;
        long w=0;  //w为权
        //初始化a[i][j]=0;
        //  i表示方向 j=0表示数目   j=1表示死活状态,0两头死,=1一头死,=2活
        for (i=0;i<=3;i++){
           a[i] = new int[2];
           for (int j=0;j<=1;j++){
             a[i][j]=0;
           }
         }
        //记录左右棋子个数
        num=0;i=1;
        //左
        while (true) {
            if ((y-i)<0) break;
            if (s[x][y-i]!=turn) {
                if (s[x][y-i]==2) a[0][1]++;
                break;
            }
            else{
                   i++;
                   num++;
                }
        }
        //右
        i=1;
        while (true){
           if ((y+i)>14) break;
           if (s[x][y+i]!=turn) {
               if (s[x][y+i]==2) a[0][1]++;
               break;
           }
           else{
                    i++;
                    num++;
           }
         }
        a[0][0]=num;

        //记录左上右下棋子个数
        num=0;i=1;
        //左上
        while (true) {
            if ((x-i)<0 || (y-i)<0) break;
            if (s[x-i][y-i]!=turn) {
                if (s[x-i][y-i]==2) a[1][1]++;
                break;
            }
            else{
                   i++;
                   num++;
            }
        }
        //右下
        i=1;
        while (true){
           if ((x+i)>14 || (y+i)>14) break;
           if (s[x+i][y+i]!=turn) {
               if (s[x+i][y+i]==2) a[1][1]++;
               break;
           }
           else{
                   i++;
                   num++;
           }
        }
        a[1][0]=num;

        //记录上下棋子个数
        num=0; i=1;
        //上
        while (true) {
            if ((x-i)<0) break;
            if (s[x-i][y]!=turn) {
                if (s[x-i][y]==2) a[2][1]++;
                break;
            }
            else{
                   i++;
                   num++;
                }
        }
        //下
        i=1;
        while (true){
           if ((x+i)>14) break;
           if (s[x+i][y]!=turn) {
               if (s[x+i][y]==2) a[2][1]++;
               break;
           }
           else{
                    i++;
                    num++;
           }
        }
        a[2][0]=num;

        //记录右上左下棋子个数
        num=0;i=1;
        //右上
        while (true) {
            if ((x-i)<0 || (y+i)>14) break;
            if (s[x-i][y+i]!=turn) {
                if (s[x-i][y+i]==2) a[3][1]++;
                break;
            }
            else{
                   i++;
                   num++;
            }
        }
        //左下
        i=1;
        while (true){
           if ((x+i)>14 || (y-i)<0) break;
           if (s[x+i][y-i]!=turn) {
               if (s[x+i][y-i]==2) a[3][1]++;
               break;
           }
           else{
                   i++;
                   num++;
           }
        }
        a[3][0]=num;

       for (i=0;i<=3;i++) {
           if (a[i][0] == 4) { //虽然两头死,但是可以成5
               w=w+100000;
           }
           if (a[i][1] == 2) {
               if (a[i][0]>=4) w=w+100000;  //能成活5
               if (a[i][0]==3) {//能成活4
                   if (w==0) w=10000;
                   else if (w<10000) w=w*10+10000;
                        else w=100000*10+w;
               }
               if (a[i][0]==2) {//能成活3
                   if (w==0) w=200;
                   else if (w<200) w=w*10+200;
                        else w=200*10+w;
               }
               if (a[i][0]==1) {//能成活2
                   if (w==0) w=5;
                   else if (w<5) w=w*10+5;
                        else w=5*10+w;
               }
           }
           if (a[i][1]==1){
               if (a[i][0]>=4) {  //能成死5
                   w = w + 100000;
               }
               if (a[i][0]==3) { //能成死4
                   if (w==0) w=500;
                   else if (w<500) w=w*10+500;
                        else w=500*10+w;
               }
               if (a[i][0]==2) { //能成死3
                   if (w==0) w=50;
                   else if (w<50) w=w*10+50;
                        else w=50*10+w;
               }
               if (a[i][0]==1) { //能成死2
                   if (w==0) w=3;
                   else if (w<3) w=w*10+3;
                        else w=3*10+w;
               }
           }
       }
       return w;
    }

    //this funcation to getXY from Computer
    private void getXY(){
    long max=0;
    long temp=0;
    int i,j;
        for (i=0;i<=14;i++){
          for (j = 0; j <= 14; j++) {
            if (s[i][j]==2){
              temp=calw(i,j,1);
             // if (temp!=0) System.out.println("                 ==Com==w[" + i + "," + j + "]=" + temp);
              if (temp>2200) temp=temp*3;
              if (max<temp) {
                  max=temp;
                  equalMax[0]=new int[3];
                  m_equalMax=-1;
                  equalMax[0][0]=i;
                  equalMax[0][1]=j;
              }
              if (max==temp && max!=0){
                  m_equalMax++;
                  equalMax[m_equalMax]=new int[3];
                  equalMax[m_equalMax][0]=i;
                  equalMax[m_equalMax][1]=j;
              }

              temp=calw(i,j,0); //player;
              //if (temp!=0) System.out.println("                 ==Pla==w[" + i + "," + j + "]=" + temp);
              if (temp<200) temp--; else temp*=2;
              if (max<temp) {
                  max=temp;
                  equalMax[0]=new int[3];
                  m_equalMax=-1;
                  equalMax[0][0]=i;
                  equalMax[0][1]=j;
              }
              if (max==temp && max!=0){
                  m_equalMax++;
                  equalMax[m_equalMax]=new int[3];
                  equalMax[m_equalMax][0]=i;
                  equalMax[m_equalMax][1]=j;
              }
            }
          }
        }
        //随机产生
        int t;
        if (max==0) {resultX=-1;resultY=-1;}
        else{
            t=(int)(Math.random()* (m_equalMax+1));
            resultX=equalMax[t][0];
            resultY=equalMax[t][1];
        }
    }
    /* 算法部分结束 */

    //isDrawNow is the funcation to check wheather draw
    public boolean isDrawNow(int x,int y){
       System.out.println( " X=" + x + ",Y=" + y);
       if (x > xn || y > yn ) return false;
       if (s[x][y]==1 || s[x][y]==0) return false;
       return true;
    }

    public boolean isOK(){
        int x;
        for (int i=0;i<=10;i++){
          for (int j=0;j<=14;j++){
              if (s[i][j]!=2){
                  x=s[i][j];
                  if ( j >= 4){ //搜索左下方
                      if (x==s[i][j] && x==s[i+1][j-1]  && x==s[i+2][j-2] && x==s[i+3][j-3]&& x==s[i+4][j-4]){
                          return true;
                      }
                  }
                  //下方
                  if (x==s[i][j] && x==s[i+1][j]  && x==s[i+2][j] && x==s[i+3][j]&& x==s[i+4][j]){
                          return true;
                  }
                  //右下方
                  if ( j <= 10){ //搜索左下方
                      if (x==s[i][j] && x==s[i+1][j+1]  && x==s[i+2][j+2] && x==s[i+3][j+3]&& x==s[i+4][j+4]){
                          return true;
                      }
                  }
                  //右方
                  if ( j <= 10){ //搜索右方
                      if (x==s[i][j] && x==s[i][j+1]  && x==s[i][j+2] && x==s[i][j+3] && x==s[i][j+4]){
                          return true;
                      }
                  }
              }
          }
        }
        return false;
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -