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

📄 ai.java

📁 手机游戏的源代码
💻 JAVA
字号:

public class AI implements Runnable{
  private int AIforce;
//  private boolean thisBallIn = false;

  public AI() {
  }

  Thread self = new Thread(this);
  synchronized public void begin() {
    self = new Thread(this);
    self.start();
  }

  public void run() {
    initThinkData();
//    AIthink(true);
    AIthink(false);
    if(a.AIHitBallsKind != 0 //分出颜色
       && a.turn > 3 //当回合大于3的时候
       ){//进行反弹思考
      if(a.hitLevel>0){
        if(a.PRINT)System.out.println("***************************************************没有球进袋,计算反弹结果****************************************************************");
        AIthink(true);
      }
    }
    if(a.PRINT)System.out.println("###########   结束   ############");
    if (a.hitLevel < 3) {//碰撞等级小于3时,有坐标设置: dataLevel[][3] dataLevel[][4]起作用
      a.haveSet = true;
    }
    else {//碰撞等级大于等于3时,无坐标设置: dataLevel[][3] dataLevel[][4]不起作用
      a.haveSet = false;
    }
    a.thinkOver = true;
  }
  /**
   * 初始化一些思考的数据
   */
  private void initThinkData(){
    a.AIx = 8000;
    a.AIy = 0;
    a.haveSet = false;
    a.dataLevel = new int[4][7];
    a.hitLevel = 3;

    if(a.turn < 3 || a.AIHitBallsKind == a.KIND_ALL){
      AIforce = 2000;
    }
    else{
      AIforce = 1500;
    }

    if(a.AIHitBallsKind == a.KIND_ALL){
      a.dataLevel[2][0] = 1;
      a.dataLevel[2][1] = a.w/2;
      a.dataLevel[2][2] = (a.Balls[0].y/1000 == 6) ? 7000:6000;
      a.dataLevel[2][3] = 0;
      a.dataLevel[2][4] = 0;
      a.dataLevel[3][5] = 2000;
      a.dataLevel[2][6] = 0;
    }
    else{
      for (int t = 0; t < a.AIBallsID.length; t++) {
        if (a.Balls[a.AIBallsID[t]].alive) {
          a.dataLevel[3][0] = 1;
          a.dataLevel[3][1] = a.Balls[a.AIBallsID[t]].x;
          a.dataLevel[3][2] = a.Balls[a.AIBallsID[t]].y;
          a.dataLevel[3][3] = a.Balls[a.AIBallsID[t]].x;
          a.dataLevel[3][4] = a.Balls[a.AIBallsID[t]].y;
          a.dataLevel[3][5] = 2000;
          a.dataLevel[3][6] = a.AIBallsID[t];
          break;
        }
      }
    }
  }
  /**
   * 复位一些思考的数据
   */
  private void resetThinkData(){
    a.fail = false;
    a.curTrackSign = 0;
    a.thinkStop = false;//本次思考结束标志
    a.thinkEnd = false;
    a.haveSet = true;

    a.whiteBallStop = false;
    a.curBallStop = false;
    a.curBallIn = false;
    a.whiteBallIn = false;
  }

  /**
   * 设置数据
   * @param lv int 等级 0:有球能被打进 1:白球和目标球都进 2:白球撞到目标球但没进袋 3:白球撞不到目标球
   * @param x int 方向X坐标
   * @param y int 方向Y坐标
   * @param hitx int 碰撞X坐标
   * @param hity int 碰撞Y坐标
   * @param force int 力量
   * @param s int 球号
   */
  private void setDataInLevel(int lv,int x,int y,int hitx,int hity,int force,int s){
    if (a.dataLevel[lv][0] == 0 ||
        ( (Math.abs(hitx - a.Balls[0].x) + Math.abs(hity - a.Balls[0].y)) <
         (Math.abs(a.dataLevel[lv][3] - a.Balls[0].x) + Math.abs(a.dataLevel[lv][4] - a.Balls[0].y)))
        ) {
      a.dataLevel[lv][0] = 1;
      a.dataLevel[lv][1] = x;
      a.dataLevel[lv][2] = y;
      a.dataLevel[lv][3] = hitx;
      a.dataLevel[lv][4] = hity;
      a.dataLevel[lv][5] = force;
      a.dataLevel[lv][6] = s;
    }
  }
  /**
   * 找目标球的碰撞点
   * @param ballSign byte 球号
   * @param bagSign byte 袋号
   * @return int[] 返回的结果[0]碰撞点的X坐标[1]碰撞点的Y坐标[2]碰撞点和袋的X距离[3]碰撞点和袋的Y距离
   */
  private int[] findHitSet(byte ballSign,byte bagSign){
    int[] result = new int[4];
    a.copyBallsState();
    int dtx = a.tempBalls[ballSign].x - a.bagSet[bagSign][0],
        dty = a.tempBalls[ballSign].y - a.bagSet[bagSign][1];
    int u = a.sqrt(dtx * dtx + dty * dty);
    int vx = dtx * 10000 / u,
        vy = dty * 10000 / u;
    int x = (u + a.ballD) * vx / 10000 + a.bagSet[bagSign][0],
        y = (u + a.ballD) * vy / 10000 + a.bagSet[bagSign][1];
    result[0] = x;
    result[1] = y;
    result[2] = dtx;
    result[3] = dty;
    return result;
  }
  /**
   * 找白球的方向点
   * @param x int 碰撞点的X坐标
   * @param y int 碰撞点的Y坐标
   * @param dtx int 碰撞点和袋的X距离
   * @param dty int 碰撞点和袋的Y距离
   * @param isRebound boolean 是否反弹
   * @param side int 反弹的边号
   * @return int[] 返回的结果 [0]是否有结果[1]方向X坐标[2]方向Y坐标[3]碰撞X坐标[4]碰撞Y坐标
   */
  private int[] findStartSet(int x,int y,int dtx,int dty,boolean isRebound,int side){
    int [] result = new int[5];
    a.copyBallsState();
    int m,n;
    if(!isRebound){
      m = x - a.tempBalls[0].x;
      n = y - a.tempBalls[0].y;
      if ( (dtx * m + dty * n) < 0){
        result[0] = 1;
        result[1] = x;
        result[2] = y;
        result[3] = x;
        result[4] = y;
      }
      else{
        result[0] = 0;
      }
    }
    else{
      int x1=0,y1=0,x0=0,y0=0;
      switch(side){
        case 0:
          x1 = x;
          y1 = a.SIDE_UP-(y-a.SIDE);
          x0 = a.tempBalls[0].x;
          y0 = a.SIDE_UP-(a.tempBalls[0].y-a.SIDE_UP);
          break;
        case 1:
          x1 = a.SIDE_RIGHT+(a.SIDE_RIGHT-x);
          y1 = y;
          x0 = a.SIDE_RIGHT+(a.SIDE_RIGHT-a.tempBalls[0].x);
          y0 = a.tempBalls[0].y;
          break;
        case 2:
          x1 = x;
          y1 = a.SIDE_DOWN+(a.SIDE_DOWN-y);
          x0 = a.tempBalls[0].x;
          y0 = a.SIDE_DOWN+(a.SIDE_DOWN-a.tempBalls[0].y);
          break;
        case 3:
          x1 = a.SIDE_LEFT-(x-a.SIDE_LEFT);
          y1 = y;
          x0 = a.SIDE_LEFT-(a.tempBalls[0].x-a.SIDE_LEFT);
          y0 = a.tempBalls[0].y;
          break;
      }
      m = x-x0;
      n = y-y0;
      if ( (dtx * m + dty * n) < 0){
        result[0] = 1;
        result[1] = x1;
        result[2] = y1;
        result[3] = x;
        result[4] = y;
      }
      else{
        result[0] = 0;
      }
    }
    return result;
  }

  public void AIthink(boolean isRebound){
    if(a.PRINT)System.out.println("----------------------------------------------------");/////////
    for(byte s=0;s<a.AIBallsID.length;s++){//-----------------AI要打的球循环-----------------
      if(!a.tempBalls[a.AIBallsID[s]].alive){
        continue;
      }
      boolean thisBallIn = false;
      for (byte i = 0; i < a.bagSet.length; i++){//------------球代循环--------------------
        if(thisBallIn) break;
        int[] hitData = findHitSet(a.AIBallsID[s],i);
        for (byte j = 0;j<4;j++){//--------------------------球案边循环---------------------------
          int[] data = findStartSet(hitData[0],hitData[1],hitData[2],hitData[3],isRebound,j);

          if (data[0] == 1) { //--------------------------------角度合适---------VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
            a.curHitSign = a.AIBallsID[s];
            a.AIx = data[3];
            a.AIy = data[4];
            resetThinkData(); //----------初始化一些状态数据
            a.tempBalls[0].onHit(AIforce, data[1], data[2]);
            if(a.PRINT)System.out.println("================================================="); /////////
            if(a.PRINT)System.out.println("球号" + a.AIBallsID[s] + "  袋号" + i); /////////////////////////////////////////////////////
            int loop = 0;

            while (!a.thinkEnd) { //-------------while think move------------****************************************
              loop++;
              a.move(); //球进行移动
              if (a.fail) { // 碰错球 LV3=====================================================================
                a.thinkEnd = true;
                if(a.PRINT)System.out.println("失败"); //////////////////////////////////////////////////
              }
              else
              if (a.curBallIn && a.whiteBallStop) { //目标球进袋 LV0============================================
                thisBallIn = true;
                a.thinkEnd = true;
                a.hitLevel = 0;
                setDataInLevel(0, data[1], data[2], data[3], data[4], AIforce,a.curHitSign);
                if(a.PRINT)System.out.println("成功!!!▄︻┹═一▄︻┹═一▄︻┹═一▄︻┹═一▄︻┹═一▄︻┹═一"); /////////////////////////////////////////////////
                if (a.AIHitBallsKind == a.KIND_ALL || //打所有球的时候得到坐标就确定
                    isRebound //反弹的时候有了坐标就确定
                    ) {
                  return;
                }
              }
              else
              if (a.curBallIn && a.whiteBallIn) { //全进 LV1=====================================================
                a.thinkEnd = true;
                if(a.PRINT)System.out.println("全进袋"); /////////////////////////////////////////////////////////

//                if((!isRebound && a.hitLevel>0)||(isRebound && a.hitLevel>1)){
//                  a.hitLevel = 1;
//                  setDataInLevel(1, data[1], data[2], data[3], data[4], AIforce, a.curHitSign);
//                }
                if(isRebound){//反弹的时候
                  if(a.hitLevel>1){//当在非反弹的时候没有两球都进的情况进入
                    a.hitLevel = 1;
                    setDataInLevel(1, data[1], data[2], data[3], data[4], AIforce, a.curHitSign);
                  }
                }
                else{//不是反弹的情况
                  if (a.hitLevel > 0 ) {//当没有成功的情况进入
                    a.hitLevel = 1;
                    setDataInLevel(1, data[1], data[2], data[3], data[4], AIforce, a.curHitSign);
                  }
                }

              }
              else
              if (a.thinkStop || (a.curBallStop && a.curTrackSign == a.curHitSign)) { //全没进 LV2====================================
                a.thinkEnd = true;
                if(a.PRINT)System.out.println("碰到球,没进袋"); //////////////////////////////////////////////////
                if(a.PRINT){if (!a.thinkStop) System.out.println("//////////////////力量不够//////////////////////////////");}
                if(!isRebound){
                  if (a.hitLevel > 1) {
                    a.hitLevel = 2;
                    setDataInLevel(2, data[1], data[2], data[3], data[4], AIforce, a.curHitSign);
                  }
                }
                else{
                  if (a.hitLevel > 2) {
                    a.hitLevel = 2;
                    setDataInLevel(2, data[1], data[2], data[3], data[4], AIforce, a.curHitSign);
                  }
                }
              }
              else
              if (loop > 110) {//=============================超过循环时间========================================================
                a.thinkEnd = true;
              }
            } //-------------------------while think move end-----------**********************************************

            if(a.PRINT)System.out.println("loop = " + loop); /////////////////////////////////////////////////
          } //------ 角度合适 end-----------------VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
          if(!isRebound){
            break;
          }
        }//------------边循环 end-----------------------------------------------
      }//------------球代循环  end ----------------------------------------------
    }//-----------------AI要打的球循环   end  ---------------------------
  }

}

⌨️ 快捷键说明

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