作者:雷神
QQ:38929568
QQ群:28048051JAVA游戏编程(满) 28047782(将满)

修改贪吃蛇一些BUG,主要在cGame.java Gif.java这连个类其他的可以参考上一片 
JAVA游戏编程之二----j2me MIDlet 手机游戏入门开发--贪吃蛇

本文给出的是程序代码,需要图片才能编译程序,

工程文件如附件所示,地址如下:贪吃蛇2

Gif.java 这个类是绘制动画的类,也是蛇的食物类

cGame.java

 
  
  1. ////////////////////////////////////////////////////////////////////////////////  
  2. //  
  3. // cGame.java  
  4. //  
  5. // Project: Minesweeper  
  6. // Author(s): Gao Lei  
  7. // Create: 2007-10-12  
  8. ////////////////////////////////////////////////////////////////////////////////  
  9. package code;  
  10.  
  11. import java.util.Random;  
  12. import javax.microedition.lcdui.*;  
  13.  
  14. ////////////////////////////////////////////////////////////////////////////////  
  15.  
  16. class cGame extends Canvas implements Runnable  
  17. ...{  
  18.     private static final int STATEPLAY        = 0;  
  19.     private static final int STATELOST        = 1;  
  20.     private static final int STATEWIN        = 2;  
  21.  
  22.     private static final int KEY_UP         = 1;  
  23.     private static final int KEY_DOWN         = 2;  
  24.     private static final int KEY_LEFT         = 3;  
  25.     private static final int KEY_RIGHT     = 4;  
  26.     private static final int KEY_FIRE         = 5;  
  27.       
  28.     public static int     s_width     = 0;  
  29.     public static int     s_height    = 0;  
  30.     public static long    updates        = 0;  
  31.     public static Random rand;              
  32.       
  33.     private int maxRand = 1000;  
  34.     private int map_x     = 10;  
  35.     private int map_y     = 10;  
  36.     private int map_w     = 16;  
  37.     private int map_h     = 16;  
  38.       
  39.  
  40.     private int key_x     = map_x / 2;  
  41.     private int key_y     = map_y / 2;  
  42.     private int snake_w    = 8;  
  43.     private int snake_h    = 8;  
  44.     private int pos_x     = map_x / 2;  
  45.     private int pos_y     = map_y / 2;  
  46.     private int aspect_x= 0;  
  47.     private int aspect_y= 1;  
  48.     private int    snake_max    = 50;  
  49.     private int    snake_min    = 5;  
  50.     private int    snake_n        = snake_min;  
  51.     private int    gameState     = STATEPLAY;  
  52.     private int level        = 1;  
  53.     private long sleepTime    =300;  
  54.       
  55.     private int[]    snake_x        = new int[ snake_max ];  
  56.     private int[]    snake_y        = new int[ snake_max ];  
  57.       
  58.     private int[][] map;  
  59.     private boolean isShowInfo    = false;  
  60.  
  61.     private Font     font         = Font.getFont( Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE );  
  62.     private Thread    thread;                          
  63.     private Image[] imgGameBg    = new Image[4];  
  64.     private Image[] imgItem        = new Image[3];  
  65.     private Gif[]    gold        = new Gif[5];  
  66.     private Gif[]    dung        = new Gif[2];  
  67.     private Gif        fungus;  
  68.       
  69.     cGame()  
  70.     ...{  
  71.         setFullScreenMode(true);  
  72.         s_width = getWidth();      
  73.         s_height= getHeight();      
  74.         rand    = new Random( System.currentTimeMillis() );  
  75.         try 
  76.         ...{  
  77.             forint i=0; i<gold.length; i++ )  
  78.             ...{  
  79.                 gold[i]= new Gif("gold"51915 );  
  80.             }  
  81.             forint i=0; i<dung.length; i++ )  
  82.             ...{  
  83.                 dung[i]= new Gif("dung"62130 );  
  84.                 dung[i].life = -2;    // --life  
  85.             }  
  86.               
  87.             fungus = new Gif("fungus"122523 );  
  88.             fungus.setFormTime  
  89.             (   
  90.                 new int[] ...{ 2000,  150,  150,  150,  
  91.                              150,  200,  100,  100,  
  92.                              200,  150,  200,  200 
  93.                 }   
  94.             );  
  95.             fungus.life = 5;        // --life +5  
  96.             fungus.isShow = false;  
  97.               
  98.             forint i=0; i<imgItem.length; i++ )  
  99.             ...{  
  100.                 imgItem[i]=Image.createImage("/pics/item_16_"+i+".png");  
  101.             }  
  102.             Image temp     = Image.createImage("/pics/bg_tile_0.png");  
  103.             Graphics gn;                                              
  104.             forint i=0; i<imgGameBg.length; i++ )      
  105.             ...{  
  106.                 imgGameBg[i] = Image.createImage(1616);  
  107.                 gn = imgGameBg[i].getGraphics();  
  108.                 gn.drawImage(temp, -i*160, gn.LEFT|gn.TOP);  
  109.             }  
  110.             gn     = null;  
  111.             temp = null;      
  112.             System.gc();  
  113.         }catch(Exception e)...{ e.printStackTrace(); }  
  114.  
  115.         rePlay( level );  
  116.         thread  = new Thread(this);  
  117.         thread.start();      
  118.     }  
  119.       
  120.     public void run()  
  121.     ...{  
  122.         whiletrue )  
  123.         ...{  
  124.             try 
  125.             ...{  
  126.                 updates++;              
  127.                 repaint();  
  128.                 serviceRepaints();  
  129.                 thread.sleep(sleepTime);  
  130.             }catch(Exception e)  
  131.             ...{  
  132.                 e.printStackTrace();  
  133.             }  
  134.         }  
  135.     }  
  136.       
  137.  
  138.     public void paint(Graphics g)  
  139.     ...{  
  140.         g.setClip(00, s_width, s_height);  
  141.         g.setColor(0x000000);                  
  142.         g.fillRect(00, s_width, s_height);  
  143.  
  144.         forint i=0; i<map_x; i++ )              
  145.         ...{  
  146.             forint j=0; j<map_y; j++ )  
  147.             ...{  
  148.                 g.drawImage(imgGameBg[ map[i][j] ], j*map_h, i*map_w, g.LEFT|g.TOP);  
  149.             }      
  150.         }  
  151.  
  152.         forint i=0; i<gold.length; i++ )  
  153.         ...{  
  154.             gold[i].paint(g);  
  155.         }  
  156.         forint i=0; i<dung.length; i++ )  
  157.         ...{  
  158.             dung[i].paint(g);  
  159.         }  
  160.         if( snake_n>20 )  
  161.         ...{  
  162.             fungus.isShow = true;  
  163.             fungus.paint( g );  
  164.         }  
  165.           
  166.         paintSnake( g );  
  167.  
  168.         if( isShowInfo || gameState != STATEPLAY )      
  169.         ...{  
  170.             g.setColor(0xFFFFFF);                  
  171.             forint i=0; i<=map_y; i++ )    // |||      
  172.             ...{  
  173.                 g.drawLine(i*map_w, 0, i*map_w, map_h*map_x);  
  174.             }  
  175.             forint i=0; i<=map_x; i++ )     // ===      
  176.             ...{  
  177.                 g.drawLine(0, i*map_h, map_y*map_w, i*map_h);  
  178.             }  
  179.             g.setFont( font );  
  180.         }  
  181.         g.setColor( 0xff0000 );  
  182.         g.setFont( font );  
  183.         g.drawString( "life:"+snake_n, 2,  20 );  
  184.         g.drawString( "level:"+level,  2180 );  
  185.     }  
  186.  
  187.  
  188.     void paintSnake( Graphics g )  
  189.     ...{  
  190.         g.setColor(0x0000FF);              
  191.         forint i=snake_n; i>0; i-- )  
  192.         ...{  
  193.             snake_x[i] = snake_x[i-1];   
  194.             snake_y[i] = snake_y[i-1];  
  195.             g.fillRect(snake_x[i]-snake_w/2, snake_y[i]-snake_h/2, snake_w, snake_h);  
  196.         }  
  197.         snake_x[0] += aspect_x*8;  
  198.         snake_y[0] += aspect_y*8;  
  199.         g.setColor(0x6666FF);      
  200.         g.fillRect(snake_x[0]-snake_w/2, snake_y[0]-snake_h/2, snake_w, snake_h);  
  201.  
  202.         if( snake_x[0]<0 || snake_x[0]>s_width || snake_y[0]<0 ||snake_y[0]>s_height )  
  203.         ...{  
  204.             rePlay(level);  
  205.         }  
  206.               
  207.         forint i=snake_min; i<snake_n; i++ )  
  208.         ...{  
  209.             if( isIntersect(snake_x[0], snake_y[0],    snake_w, snake_h,   
  210.                             snake_x[i], snake_y[i],    snake_w, snake_h )   
  211.                 )  
  212.             ...{  
  213.                 rePlay(level);  
  214.             }  
  215.         }  
  216.           
  217.         forint i=0; i<gold.length; i++ )  
  218.         ...{  
  219.             if( isIntersect(snake_x[0],        snake_y[0],        snake_w,    snake_h,   
  220.                             gold[i].pos_x,    gold[i].pos_y,    gold[i].w,     gold[i].h )   
  221.               )  
  222.             ...{  
  223.                 addSnake( gold[i].life );  
  224.                 gold[i].setPos();  
  225.             }  
  226.         }  
  227.         forint i=0; i<dung.length; i++ )  
  228.         ...{  
  229.             if( isIntersect(snake_x[0],        snake_y[0],        snake_w,    snake_h,   
  230.                             dung[i].pos_x,    dung[i].pos_y,    dung[i].w,     dung[i].h )   
  231.               )  
  232.             ...{  
  233.                 addSnake( dung[i].life );  
  234.                 dung[i].setPos();  
  235.             }  
  236.         }  
  237.           
  238.         if( fungus.isShow && isIntersect(snake_x[0],        snake_y[0],        snake_w,    snake_h,   
  239.                 fungus.pos_x,    fungus.pos_y,    fungus.w,     fungus.h )   
  240.           )  
  241.         ...{  
  242.             addSnake( fungus.life );  
  243.             fungus.setPos();  
  244.         }  
  245.           
  246.     }  
  247.       
  248.     boolean isIntersect(int x1,int y1, int w1, int h1, int x2, int y2, int w2, int h2)  
  249.     ...{  
  250.         if( Math.abs(x2-x1) < (w1+w2)/2 && Math.abs(y2-y1) < (h1+h2)/2 )  
  251.         ...{  
  252.             return true;  
  253.         }  
  254.         else 
  255.             return false;  
  256.     }  
  257.       
  258.     public void keyPressed(int key)  
  259.     ...{  
  260.         key = Math.abs(key);  
  261.         System.out.println("key="+key);  
  262.  
  263.         switch( key )  
  264.         ...{  
  265.             case KEY_NUM2:  
  266.             case KEY_UP:  
  267.                 if( gameState != STATEPLAY )      
  268.                     break;  
  269.                 else 
  270.                 ...{  
  271.                     if( aspect_y <= 0 )  
  272.                     ...{  
  273.                         aspect_x =  0;  
  274.                         aspect_y = -1;  
  275.                     }  
  276.                 }  
  277.             break;  
  278.  
  279.             case KEY_NUM8:  
  280.             case KEY_DOWN:  
  281.                 if( gameState != STATEPLAY )  
  282.                     break;  
  283.                 else 
  284.                 ...{  
  285.                     if( aspect_y >= 0 )  
  286.                     ...{  
  287.                         aspect_x =  0;  
  288.                         aspect_y = +1;  
  289.                     }  
  290.                 }  
  291.             break;  
  292.  
  293.             case KEY_NUM4:  
  294.             case KEY_LEFT:  
  295.                 if( gameState != STATEPLAY )      
  296.                     break;  
  297.                 else 
  298.                 ...{  
  299.                     if( aspect_x <= 0 )  
  300.                     ...{  
  301.                         aspect_y =  0;  
  302.                         aspect_x = -1;  
  303.                     }  
  304.                 }  
  305.             break;  
  306.  
  307.             case KEY_NUM6:  
  308.             case KEY_RIGHT:  
  309.                 if( gameState != STATEPLAY )  
  310.                     break;  
  311.                 else 
  312.                 ...{  
  313.                     if( aspect_x >= 0 )  
  314.                     ...{  
  315.                         aspect_y =  0;  
  316.                         aspect_x = +1;  
  317.                     }  
  318.                 }  
  319.             break;  
  320.  
  321.             case KEY_FIRE:  
  322.             case KEY_NUM5:  
  323.                 if( gameState == STATEPLAY )  
  324.                 ...{  
  325. //                    addSnake();  
  326. //                    System.out.println("snake_n="+snake_n);  
  327.                 }  
  328.             break;  
  329.  
  330.             case KEY_NUM1:          
  331.  
  332.             break;  
  333.             case KEY_NUM3:          
  334.                 isShowInfo = !isShowInfo;  
  335.             break;  
  336.             case KEY_NUM0:          
  337.                 rePlay( level );          
  338.             break;  
  339.         }  
  340.         repaint();  
  341.     }  
  342.       
  343.     private void addSnake(int life)  
  344.     ...{  
  345.         int s_n = snake_n;  
  346.         snake_n += life;  
  347.         if( snake_n >= snake_max )  
  348.         ...{  
  349.             level++;  
  350.             rePlay(level);  
  351.         }  
  352.         else if( snake_n < snake_min )        //game over  
  353.         ...{  
  354.             rePlay(level);  
  355.         }  
  356.         else if( life>0 )  
  357.         ...{  
  358.             forint i=s_n; i<snake_n; i++ )  
  359.             ...{  
  360.                 snake_x[i] = -snake_w;  
  361.                 snake_y[i] = -snake_h;  
  362.             }  
  363.         }  
  364.     }  
  365.  
  366.     public void rePlay( int level )  
  367.     ...{  
  368.         sleepTime     = 300-level*20;  
  369.         map_x        = s_height/16;  
  370.         map_y        = s_width/16;  
  371.         key_x         = map_x>>1;  
  372.         key_y         = map_y>>1;  
  373.         gameState    = STATEPLAY;  
  374.         map          = new int[map_x][map_y];  
  375.         isShowInfo    = false;  
  376.         snake_n        = snake_min;  
  377.         aspect_x    = 0;  
  378.         aspect_y    = 0;  
  379.         try 
  380.         ...{  
  381.             Image temp     = Image.createImage("/pics/bg_tile_"+(level%2)+".png");  
  382.             Graphics gn;                                              
  383.             forint i=0; i<imgGameBg.length; i++ )      
  384.             ...{  
  385.                 imgGameBg[i] = Image.createImage(1616);  
  386.                 gn = imgGameBg[i].getGraphics();  
  387.                 gn.drawImage(temp, -i*160, gn.LEFT|gn.TOP);  
  388.             }  
  389.             gn     = null;  
  390.             temp = null;      
  391.             System.gc();  
  392.         }catch(Exception e)...{ e.printStackTrace(); }  
  393.  
  394.         forint i=0; i<map_x; i++ )    //draw bg  
  395.         ...{  
  396.             forint j=0; j<map_y; j++ )  
  397.             ...{  
  398.                 int r = rand.nextInt(maxRand);  
  399.                 forint k=0; k<imgGameBg.length; k++ )  
  400.                 ...{  
  401.                     if( r < (maxRand>>(k+1)) )  
  402.                     ...{  
  403.                         map[i][j] = k;  
  404.                     }  
  405.                 }  
  406.             }  
  407.         }  
  408.  
  409.         forint i=0; i<snake_n; i++ )    //init snake  
  410.         ...{  
  411.             snake_x[i] = s_width >>1;  
  412.             snake_y[i] = s_height>>1;    //-(i*snake_h);  
  413.         }  
  414.     }