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

📄 main.java

📁 手机游戏的源代码
💻 JAVA
字号:
import javax.microedition.lcdui.*;
import java.util.Vector;
import com.nokia.mid.ui.FullCanvas;
//
//
//
public class Main extends FullCanvas implements CommandListener,Runnable {
//public class Main extends Canvas implements CommandListener,Runnable {

  public static final byte
      STATE_GAME_AIM = 0,
      STATE_GAME_FORCE = 1,
      STATE_GAME_RUNNING = 2,
      STATE_GAME_AITHINK = 3;
  public byte gameState = STATE_GAME_AIM;//游戏状态

  Image backImage,whiteBallImage,redBallImage,blueBallImage,blackBallImage;
  Thread self;
  long MILLIS_PER_TICK =50;

  int post;//玩家方向坐标点的位置
  int x ,y; //玩家选择的方向点的坐标
  public int force;//力量,开始最少为100
  byte flag = 0;//按键标志
  boolean forceUp;//力量条上升
  public static AI ai = new AI();

//  Vector v = new Vector();

  public m myMIDlet;
  public Main(m M) {
    myMIDlet = M;
    init();
    newGame();
  }

  public void init(){
    backImage = a.loadImage("/table.png");
    whiteBallImage = a.loadImage("/whiteball.png");
    redBallImage = a.loadImage("/redball.png");
    blueBallImage = a.loadImage("/blueball.png");
    blackBallImage = a.loadImage("/blackball.png");
  }
  public void newGame(){
    a.turn = 0;
    flag = 0;
    post = 75;
    force = 100;
    a.firstIn = false;
    a.isPlayerTurn = true;
    postToXY();
    formatBalls();
    a.linkBallsState();

    a.setTargetBalls(true,a.KIND_ALL);
    a.setTargetBalls(false,a.KIND_ALL);
  }


  public void commandAction(Command command, Displayable displayable) {
  }
  public void run() {
    final Thread currentThread = Thread.currentThread();
    while (currentThread == self) {
      try {
        long time = System.currentTimeMillis();
        if (isShown()) {
          repaint(); //所有游戏的绘制和逻辑均在里面实现
          serviceRepaints(); //写屏
        }
        time = System.currentTimeMillis() - time;
        if (time < MILLIS_PER_TICK) {
          synchronized (this) {
            wait(MILLIS_PER_TICK - time); //使每个周期大致相等
          }
        }
        else {
          currentThread.yield(); //让出控制权,防止饿死其它线程
        }
      }
      catch (Exception ex) {}
    }
  }
  /**
   * 线程开始
   */
  synchronized public void begin() {
    self = new Thread(this);
    self.start();
  }
  /**
   * 线程中断
   */
  synchronized public void stop() {
    self = null;
  }

  protected void paint(Graphics g) {
    gameRun();
    switch(getGameState()){
      case STATE_GAME_AIM:
        drawBalls(g);
        this.drawLine(g);
        g.setColor(0xffff00);
        g.fillRect(151,9,12,162);
        break;
      case STATE_GAME_AITHINK:
        drawBalls(g);
        g.setColor(0xffff00);
        g.fillRect(151,9,12,162);
        g.setColor((int)System.currentTimeMillis());
        if(a.thinkOver)
          g.drawString("AI思考结束,按5键继续",30,2,20);
        else
          g.drawString("AI思考",30,2,20);

        break;
      case STATE_GAME_RUNNING:
        drawBalls(g);
        break;
      case STATE_GAME_FORCE:
        drawForce(g);
        break;
    }
  }
  /**
   * 画球
   * @param g Graphics
   */
  private void drawBalls(Graphics g){
    g.drawImage(backImage, 0, 0, 20);
    for (int i = 0; i < a.Balls.length; i++) {
      if (a.Balls[i].alive || a.Balls[i].onBag) {
        switch (a.Balls[i].style) {
          case 0:
            a.Balls[i].drawBall(g, whiteBallImage);
            break;
          case 8:
            a.Balls[i].drawBall(g, blackBallImage);
            break;
          case 1:
              a.Balls[i].drawBall(g, redBallImage);
            break;
          case 9:
              a.Balls[i].drawBall(g, blueBallImage);
            break;
        }
      }
    }
  }
  /**
   * 画力量条
   * @param g Graphics
   */
  private void drawForce(Graphics g){
    g.setColor(0xffff00);
    g.fillRect(151,9,12,162);
    g.setColor(0xff0000);
    g.fillRect(152,170-force/100*8,10,force/100*8);
  }

  protected void keyPressed(int keyCode) {
    switch(keyCode){
      case Canvas.KEY_NUM5:
      case -5:
        flag = 5;
        break;
      case Canvas.KEY_NUM7:
        flag = 7;
        break;
      case -7:
        myMIDlet.exitMIDlet();
    }
    switch(getGameAction(keyCode)){
      case Canvas.LEFT:
        flag = 1;
        break;
      case Canvas.RIGHT:
        flag = 2;
        break;
      case Canvas.UP:
        flag = 3;
        break;
      case Canvas.DOWN:
        flag = 4;
        break;
    }
  }

  protected void keyReleased(int keyCode) {
    flag = 0;
  }
  /**
   * 游戏逻辑计算
   */
  private void gameRun() {
    switch (getGameState()) {
      case STATE_GAME_AIM:
        playerAim();
        break;
      case STATE_GAME_AITHINK:
        computerAim();
        break;
      case STATE_GAME_FORCE:
        selectForce();
        break;
      case STATE_GAME_RUNNING:
        ballsMove();
        break;
    }
  }
  /**
   * post坐标转成X,Y坐标
   */
  public void postToXY(){
    if(post>=0&&post<150){
      x=post;y=0;
    }
    else if(post>=150&&post<350){
      x=150;y=post-150;
    }
    else if(post>=350&&post<500){
      x=500-post;y=200;
    }
    else if(post>=500&&post<700){
      x=0;y=700-post;
    }
  }
  /**
   * 初始化所有球
   */
  public void formatBalls(){
    a.solidBallsID = new byte[7];
    a.stripeBallsID = new byte[7];
    a.Balls[0] = new Ball(75,180, 0,a.STYLE_WHITE);
    a.Balls[1] = new Ball(75, 80, 1,a.STYLE_SOLID);
    a.Balls[5] = new Ball(75, 62, 5,a.STYLE_BLACK);
    setupBalls(new int[]{2,3},new int[][]{{70,71,1},{80,71,9}});
    setupBalls(new int[]{4,6},new int[][]{{65,62,9},{85,62,1}});
    setupBalls(new int[]{7,8,9,10},new int[][]{{60, 53,1},{70, 53,9},{80, 53,1},{90, 53,9}});
    setupBalls(new int[]{11,12,13,14,15},new int[][]{{55, 44,9},{65, 44,9},{75, 44,1},{85, 44,9},{95, 44,1}});
    int m = 0,n = 0;
    for(int i = 0; i<16; i++){
      if(a.Balls[i].style == a.STYLE_WHITE || a.Balls[i].style == a.STYLE_BLACK){
        continue;
      }
      if(a.Balls[i].style<8){
        a.solidBallsID[m] = a.Balls[i].arraySign;
        m++;
      }
      else{
        a.stripeBallsID[n] =a.Balls[i].arraySign;
        n++;
      }
    }
  }
  /**
   * 随机放置球的序号
   * @param order int[]
   * @param data int[][]
   */
  private void setupBalls(int[] order,int[][] data){
    Vector v = new Vector();
    for(int i = 0;i<data.length;i++){
      v.addElement(data[i]);
    }
    for(int i = 0;i<order.length;i++){
      int temp = a.getRandom()%v.size();
      int[] tempData = (int[])(v.elementAt(temp));
      a.Balls[order[i]] = new Ball(tempData[0],tempData[1],order[i],tempData[2]);
      v.removeElementAt(temp);
    }
  }
  /**
   * 设置游戏状态
   * @param s byte 状态号
   */
  private void setGameState(byte s){
    gameState = s;
    switch(s){
      case STATE_GAME_AIM:
        a.isPlayerTurn = true;
        break;
      case STATE_GAME_AITHINK:
        a.isPlayerTurn = false;
        a.think = true;
        ai.begin();
        break;
      case STATE_GAME_RUNNING:
        a.think = false;
        break;
    }
  }
  /**
   * 返回游戏状态
   * @return byte
   */
  private byte getGameState(){
    return gameState;
  }

  /**
   * 画瞄准线
   */
  private void drawLine(Graphics g){
    int x2 = a.tempBalls[0].x,
        y2 = a.tempBalls[0].y;
    int x1=0,y1=0;
    int x3=0,y3=0;
    int x = this.x*100,
        y = this.y*100;
    byte lineState = 0;
    boolean haveReturn = true;
    boolean isOK = false;
    int l = a.sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y));
    int vx = (x-x2)*10000/l,
        vy = (y-y2)*10000/l;
    if(post >=0 && post<150){
      lineState = 0;
    }
    else if(post>=150 && post<350){
      lineState = 1;
    }
    else if(post>=350 && post<500){
      lineState = 2;
    }
    else if(post>=500 && post<700){
      lineState = 3;
    }
    while(!isOK){
      switch(lineState){
        case 0:
          y1=a.SIDE;
          x1=(y1-y)*(x2-x)/(y2-y)+x;
          isOK = true;
          if(x1<=1960 || x1>=13040){
            haveReturn = false;
          }
          else{
            haveReturn = true;
          }
          if(x1<a.SIDE){
            lineState = 3;
            isOK = false;
          }
          else if(x1>a.w-a.SIDE){
            lineState = 1;
            isOK = false;
          }
          break;
        case 1:
          x1=a.w-a.SIDE;
          y1=(y2-y)*(x1-x)/(x2-x)+y;
          isOK = true;
          if((y1>=9134&&y1<=10866)||y1<=1960||y1>=18040){
            haveReturn = false;
          }
          else {
            haveReturn = true;
          }
          if(y1<a.SIDE){
            lineState = 0;
            isOK = false;
          }
          else if(y1>a.h-a.SIDE){
            lineState = 2;
            isOK = false;
          }
          break;
        case 2:
          y1=a.h-a.SIDE;
          x1=(y1-y)*(x2-x)/(y2-y)+x;
          isOK = true;
          if(x1<=1960 || x1>=13040){
            haveReturn = false;
          }
          else{
            haveReturn = true;
          }
          if(x1<a.SIDE){
            lineState = 3;
            isOK = false;
          }
          else if(x1>a.w-a.SIDE){
            lineState = 1;
            isOK = false;
          }
          break;
        case 3:
          x1 = a.SIDE;
          y1=(y2-y)*(x1-x)/(x2-x)+y;
          isOK = true;
          if((y1>=9134&&y1<=10866)||y1<=1960||y1>=18040){
            haveReturn = false;
          }
          else {
            haveReturn = true;
          }
          if(y1<a.SIDE){
            lineState = 0;
            isOK = false;
          }
          else if(y1>a.h-a.SIDE){
            lineState = 2;
            isOK = false;
          }
          break;
      }
    }
    if(haveReturn){
      switch (lineState) {
        case 0:
        case 2:
          x3 = x1 + 12 * vx / 100;
          y3 = y1 - 12 * vy / 100;
          break;
        case 1:
        case 3:
          x3 = x1 - 12 * vx / 100;
          y3 = y1 + 12 * vy / 100;
          break;
      }
    }
    x1/=100;x2/=100;x3/=100;y1/=100;y2/=100;y3/=100;
    g.setColor(0xffffff);
    g.drawLine(x2,y2,x1,y1);
    if(haveReturn){
      g.setColor(0xffff00);
      g.drawLine(x3, y3, x1, y1);
    }
  }
  /**
   * 玩家瞄准
   */
  private void playerAim() {
    switch (flag) {
      case 0:
        break;
      case 1:
        post -= 2;
        if (post < 0) {
          post += 700;
        }
        postToXY();
        break;
      case 2:
        post += 2;
        if (post >= 700) {
          post -= 700;
        }
        postToXY();
        break;
      case 4:
        post += 50;
        if (post >= 700) {
          post -= 700;
        }
        postToXY();
        flag = 0;
        break;
      case 3:
        post -= 50;
        if (post < 0) {
          post += 700;
        }
        postToXY();
        flag = 0;
        break;
      case 5:
        setGameState(STATE_GAME_FORCE);
        force = 0;
        forceUp = true;
        flag = 0;
        break;
    }
  }
  /**
   * 电脑瞄准
   */
  private void computerAim() {
    if(a.thinkOver && flag == 5){
      a.linkBallsState();
      a.Balls[0].onHit(a.dataLevel[a.hitLevel][5],a.dataLevel[a.hitLevel][1],a.dataLevel[a.hitLevel][2]);
      setGameState(STATE_GAME_RUNNING);
      a.thinkOver = false;
      System.gc();
    }
    if(a.PRINT){ if(a.thinkOver && flag == 7)  System.out.println("球:"+a.dataLevel[a.hitLevel][6]+"  LV:"+a.hitLevel +"  回合:"+a.turn);}

  }
  /**
   * 选择力量条
   */
  private void selectForce(){
    if (forceUp) {
      if(force<1200)
        force += 50;
      else
        force += 80;
      if(force == 2000){
        forceUp = false;
      }
    }
    else{
      if(force>1200)
        force -= 80;
      else
        force -= 50;
      if(force == 100){
        forceUp = true;
      }
    }
    if (flag == 5) {
      a.tempBalls[0].onHit(force, x * 100, y * 100);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      setGameState(STATE_GAME_RUNNING);
    }
    else if(flag == 7){
      setGameState(STATE_GAME_AIM);
      force = 0;
    }
  }
  /**
   * 球的移动
   */
  private void ballsMove(){
    a.move();
    if (a.ballsState == 0) { //移动完成
      if(!a.isPlayerTurn){
        setGameState(STATE_GAME_AIM);
        a.turn ++;


      }
      else{
        setGameState(STATE_GAME_AITHINK);
      }
      if (!a.tempBalls[0].alive) {
        a.tempBalls[0] = null;
        a.tempBalls[0] = new Ball(80, 180, 0,0);
      }
    }
  }



}

⌨️ 快捷键说明

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