字体:  

J2ME手机游戏贪食蛇主程序源代码加详尽法文注释

skysea 发表于: 2008-7-18 19:16 来源: 游学欧洲网

转载请注明出自游学欧洲网数码科技板块

有菜单,可以设置难度,总共有四个等级,食物和移动速度随等级增加。

只供学习使用,请勿在真手机上试验,如有意外概不负责

作者为本人

效果图


1.jpg



www.stineuro.com

CODE:

/*
* MIDPCanvas.java
*
* Created on 14 janvier 2008, 10:58
*/

package tst;

import java.util.Random;

import javax.microedition.lcdui.*;

/**
*
* @author  SKYSEA
* @version 0.9
*il y a 5 niveaux
*/
public class MIDPCanvas extends Canvas implements CommandListener, Runnable {
    private int          [][]snake   =      new int [210][2]; //creer le serpent
   
    private int          [][]food    =      new int [20][2];  //creer la nourriture
   
    private boolean      isRun       =      true;
   
    private int          sleepTime   =      360;              //vitesse initiale
   
    private final int   CaseSize     =      13;               //pixel de l'image
   
    private int   s;                                          //score du premier niveau
   
    private Random       random      =      new Random();     //les coordonnées aléatoires
   
    private Image     img, snake_img;
   
    private Thread      t;                                     //Thread
   
    private int         score,level;                          //score et niveau
   
    private int          snakeNum;                            //le nombre de corps
   
    private int          foodNum;                             //nombre de boules
   
    private int          direction;                           //0:up 1:down 2:left 3:right
   
    private int       width, height;                          //width=getWidth(),height=getHeight();
   
   private int           keepTime    =        0;               //le temps de rester en l'image de Gameover
   
    private int         food_Init    =        5;               //pieces de nourriture initiales
   
    private int       level_Init     =        0;               //niveau initial
   
    private String[]  menu           =        null;             //menu
   
    private String[]  menu_Config    =        null;             //menu du config
   
    private int menuNum;                                        //numero de menu
   
    private int configNum;                                      //numero du menu du config
   
    private Font font                =        null;             //font du menu
   
    private Font font1               =        null;             //font du menu choisit
   
    private int gameState            =        10;                //0:start   1:configuration  2:exit 10:menu
   
    private final int GAMESTART      =        0;
   
    private final int GAMEMENU       =        10;
   
    private final int GAMEEXIT       =        2;
   
    private final int GAMECONFIG     =        1;  
   
    private final int DIRECTION_UP   =        0;
   
    private final int DIRECTION_DOWN =        1;
   
    private final int DIRECTION_LEFT =        2;
   
    private final int DIRECTION_RIGHT=        3;
   
   
    private Command okCommand,exitCommand;                          //commande de ok, exit
    /**
     * constructor
     */
   
    public MIDPCanvas() {
                              
        
   
        
         
        try {
            // Set up this canvas to listen to command events
            setCommandListener(this);
            // Add the ok command
            okCommand=new Command("OK",Command.OK,1);
            addCommand(okCommand);
            // Add the Exit command
            exitCommand=new Command("Exit", Command.EXIT, 1);
            addCommand(exitCommand);
            //recharger les images
            try {
                 img      = Image.createImage("/res/food.png");         
                 snake_img    = Image.createImage("/res/puce.png");
            } catch (Exception e) {System.out.println("Failure");}            
            //obtenir width et height de l'ecran
            width=this.getWidth();                                      
            height=this.getHeight();
            //initialiser le font
            font =  Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE);
            font1 =  Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_ITALIC, Font.SIZE_LARGE);
            //initialiser le menu
            menu = new String[]{"Commencer","Configurer","Fin"};
            menu_Config=new String[]{"Niveau"+level_Init,"Nourriture à commencer"+food_Init,"Exit"};
            //initialiser le menu default
            menuNum=0;
            //initialiser le menu du config default
            configNum=0;
            
            t = new Thread(this);
                                                  
         
            t.start();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
     
    /**
     * initialiser le niveau et le score
     */
     public void initLevel(int lev_init){
      //initialiser le score
      score=0;
      //initialiser le niveau
      level=lev_init;
      
      sleepTime=300;
      //initialiser le temps de sleep selon le niveau initial
      sleepTime-=50*level;
     }
      /**
     * initialiser le serpent
     */
  public void initSnake(){
      snakeNum=1;
      //noter les coordonnées de la tete
      for(int i=0;i<snakeNum;i++){                                       
          snake[i][0]=0;
          snake[i][1]=0;
      }
      //initialiser la direction
      direction=DIRECTION_RIGHT;
     
}
   /**
     * initialiser la nouriture
     */
  public void initFood(int foodN){
       int i,j,k;
       foodNum=foodN;
      //creer et noter les coordonnées de  nouriture aléatoires
       //le nombre de nouriture est foodN
        for (int r = 0; r < foodN; r++) {
            k = java.lang.Math.abs(random.nextInt()) %225;
            i = k /15;
            j = k %15;
            
                    food[r][0]=i;
                    food[r][1]=j;
               
            }
      
      
  }
     /**
     * paint menu
      *si le menu est choisit, on change le font
     */
  public void paintMenu(Graphics g){
  g.setColor(-1);
  g.fillRect(0, 0, width, height);
  
  for(int i = 0; i < menu.length; i++)
  {
   if(menuNum == i)
   {
    g.setColor(255, 0, 0);
    g.setFont(font1);
    g.drawString(menu[i], width/2 - 5, 70 + i * 25 - 4, Graphics.BOTTOM | Graphics.HCENTER);
   }
   else
   {
    g.setColor(0, 255, 0);
    g.setFont(font);
    g.drawString(menu[i], width/2, 70 + i * 25, Graphics.BOTTOM | Graphics.HCENTER);
   }
  }
  }
  public void paintConfig(Graphics g){
      
      menu_Config=new String[]{"Niveau"+level_Init,"Nourriture à commencer"+food_Init,"Exit"};
      g.setColor(-1);
      g.fillRect(0, 0, width, height);
      for(int i = 0; i < menu_Config.length; i++){
   if(configNum == i)
   {
    g.setColor(255, 0, 0);
    g.setFont(font1);
    g.drawString(menu_Config[i], width/2 - 5, 70 + i * 25 - 4, Graphics.BOTTOM | Graphics.HCENTER);
   }
   else
   {
    g.setColor(0, 255, 0);
    g.setFont(font);
    g.drawString(menu_Config[i], width/2, 70 + i * 25, Graphics.BOTTOM | Graphics.HCENTER);
   }
  }
   
  }
   /**
     * paint
     */
  public void paint(Graphics g){
      //si jeu n'est pas encore fini
     switch(gameState){
        
         case GAMEMENU:{
          configNum=0;
             paintMenu(g);
         
           //initialiser le niveau
            initLevel(level_Init);                                   
            //initialiser le serpent
            initSnake();                                         
            //initialiser la nouriture
            initFood(food_Init);
            s=food_Init*10;
            
            break;
      }
     case GAMECONFIG:{
         menuNum=0;
         paintConfig(g);
         
          break;
      }
       case GAMESTART:{
      if(!isGameOver()&&sleepTime>60){  
      int i;
        g.setColor(0, 0, 0);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(255, 0, 255);
        //écrire les coordonnées de la tete, score et  niveau
        g.drawString(" x: "+snake[0][0]+" y: "+snake[0][1]+" Score:"+score+" Level:"+level,0,height-15,Graphics.TOP|Graphics.LEFT);
      
        //dessiner le serpent
        for (i=0;i<snakeNum;i++){
            g.drawImage(snake_img,snake[i][0]*CaseSize,snake[i][1]*CaseSize,Graphics.TOP|Graphics.LEFT);
        }
        //dessiner la nouriture
         for (i=0;i<foodNum;i++){
            g.drawImage(img,food[i][0]*CaseSize,food[i][1]*CaseSize,Graphics.TOP|Graphics.LEFT);
        }

      
      }
      //si le niveau est plus haut, le jeu est fini
        
        else if(sleepTime<60){
        g.setColor(255,255, 255);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(255, 0, 255);
        g.drawString("T'as bien réussit",width/2,height/2,Graphics.BASELINE|Graphics.HCENTER);
        //rentre au menu
        keepTime=1000;
        gameState=10;
        }
      //si le serpent est mort, le jeu est fini
        else if(isGameOver()){
        g.setColor(255,255, 255);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(255, 0, 255);
        g.drawString("Game over",width/2,height/2,Graphics.BASELINE|Graphics.HCENTER);
      
        //rentre au menu
        gameState=10;
           keepTime=1000;
        }
      break;
      }
      //exit
         case GAMEEXIT:{
       isRun=false;
             ExlTestKai.instance.quitApp();
        
      }}
  }
  

   /**
     * move
     */
  public void move(int direction){
      //donner les coordonnées de la tete du precedent à l'arriere'
      for(int i= snakeNum-1;i>0;i--){
          snake[i][0]=snake[i-1][0];
          snake[i][1]=snake[i-1][1];
      }
      //changer les coordonnées de la tete
      switch(direction){
          case DIRECTION_UP:
              snake[0][1]-=1;
              break;
          case DIRECTION_DOWN:
              snake[0][1]+=1;
              break;
          case DIRECTION_LEFT:
              snake[0][0]-=1;
              break;
          case DIRECTION_RIGHT:
              snake[0][0]+=1;
              break;
      }
  }
   
  /**
     * eatFood
     */
  public void eatFood(){
      //si les coordonnées de la nourriture sont les meme de la tete du serpent,
      //effacer la piece de nourriture et le serpent grossit
      for(int i=0;i<foodNum;i++){
          if(snake[0][0]==food[i][0]&&snake[0][1]==food[i][1]){
              food[i][0]=-20;
              food[i][1]=-20;
              snakeNum++;
              score+=10;
          }
      }
      keepTime=0;
   
     
  }
   /**
     *is gameover
     */
  public boolean isGameOver(){
      boolean gm=false;
      //si la tete du serpent touche le coté de l'ecran ou il touche soi-meme, il est mort
      if(snake[0][0]<0||snake[0][0]>(width-13)/CaseSize||snake[0][1]<0||snake[0][1]>(height-13)/CaseSize){
        gm=true;
      }
      for(int i=1;i<snakeNum;i++){
          if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1])
              gm=true;
         
      }
   
      return gm;
  }
  /**
     * compterScore
     */
  public void compterScore(){
   
     //si toute la nourriture est mangée par le serpent, on initialiser la nourriture, augmente le niveau et les pieces de la nourriture
      if(score == s){
        sleepTime=300;
          foodNum++;
          s+=foodNum*10;
          initFood(foodNum);
          level++;
          sleepTime-=50*level;
         
      }
  }
  /**
     * run
     */
  public void run() {
        
      
     
      
        while (isRun){
      
         
            
         
        
         try {
            
                t.sleep(sleepTime);
                // Mise à jour des touches
                t.sleep(keepTime);
          eatFood();
               
             move(direction);
             //compter le score
             compterScore();
        
               repaint();
             //si le jeu est fini, on sort
               
         
       System.out.println("aaa");
                  
               
            
            } catch (Exception e) {
               
            }
         
        }
    }
   
[ 本帖最后由 skysea 于 2008-7-20 15:53 编辑 ]

最新回复

skysea at 2008-7-18 19:16:27

CODE:

/**
     * key Pressed
     */
        protected  void keyPressed(int keycode) {
            int action = getGameAction(keycode);
            
            switch(gameState){
                //controler le mouvement dans le menu
                case GAMEMENU:{
                    
                    switch(action){
                           case UP:
                               if(menuNum >0) --menuNum;
                            break;
                            case DOWN:
                            if(menuNum <menu.length -1) ++menuNum;
                            break;
                            //changer la condition
                            case FIRE:{
                                switch(menuNum){
                                    case GAMESTART:
                                        gameState=0;
                                        break;
                                 
                                    case GAMECONFIG:
                                        gameState=1;
                                       break;
                                   case GAMEEXIT:
                                       
                                       gameState=2;
                                       break;
                                }
                            }
                }
               }
                //changer le niveau et les pieces de nourriture initiales
             case GAMECONFIG:{
                    
                    switch(action){
                           case UP:
                           if(configNum >0)   configNum--;
                                break;
                           case DOWN:
                          if(configNum  <menu_Config.length-1) configNum++;
                                break;
                            //changer
                            case LEFT:{
                                switch(configNum){
                                    case 0:
                                        if (level_Init<4)
                                            level_Init++;
                                        break;
                                    case 1:
                                       if(food_Init<10)
                                        food_Init++;

                                   
                                }
                                break;
                            }
                            case RIGHT:{
                                switch(configNum){
                                    case 0:
                                        if (level_Init>0)
                                            level_Init--;
                                        break;
                                   case 1:
                                       if(food_Init>0)
                                        food_Init--;

                                    
                                }
                                break;
                            }
                        case FIRE:{
                            if (configNum==2){
                                gameState=10;
                            }
                        }
                }
               }
                //controler le mouvement dans le jeu
               case GAMESTART:{
            switch(action){
                case UP:
                    if(direction!=DIRECTION_DOWN)
                        direction=DIRECTION_UP;
                    break;
                case DOWN:
                    if(direction!=DIRECTION_UP)
                        direction=DIRECTION_DOWN;
                    break;
                case LEFT:
                    if(direction!=DIRECTION_RIGHT)
                        direction=DIRECTION_LEFT;
                    break;
                case RIGHT:
                    if(direction!=DIRECTION_LEFT)
                        direction=DIRECTION_RIGHT;
            }
          break;
             }
                case GAMEEXIT:{
                    gameState=2;
                    
                }
                    
               
               
        }
        }
    /**
     * Called when a key is released.
     */
    protected  void keyReleased(int keycode) {
      
    }
   
    /**
     * Called when action should be handled
     */
    public void commandAction(Command command, Displayable displayable) {
    if(command==okCommand){
          if (gameState==10)
                gameState=menuNum;
    }
    else if(command==exitCommand){
               
                gameState=2;
    }
    }
   
    }
[ 本帖最后由 skysea 于 2008-7-18 19:20 编辑 ]
tiger at 2008-7-19 10:00:05
太强了!!!仔细阅读下!