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

与前一款扫雷比较,这个游戏多了一个 类,用来显示动画,也是蛇要吃的物品类, 也有了代码包,图片包,结构清晰,代码量500行,地图生成的简单算法,和播放动画的简单算法!有矩形碰撞,升级就是增加蛇的移动速度,简单做法就是把刷新速度提高了,每次刷新蛇要移动一个格子,出现的物品有的是增加蛇长度的,有的是减少蛇长度的。

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

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

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

  1. package code;
  2. import javax.microedition.lcdui.Image;
  3. import javax.microedition.lcdui.Graphics;
  4. public class Gif
  5. ...{
  6. public String     name  = "gif";
  7. public int         life  =  1;
  8. public int         pos_x =  0;
  9. public int         pos_y =  0;
  10. public int         w       = 10;
  11. public int         h       = 10;
  12. public int         form  =  1;
  13. private int        allTime;
  14. private int     currForm;
  15. private long     startTime;
  16. public boolean isShow=true;
  17. public int[] formTime=...{100};
  18. private Image[] img;
  19. public Gif( String _name, int _form, int _w, int _h )
  20. ...{
  21. w     = _w;
  22. h     = _h;
  23. setGif( _name, _form );
  24. startTime = System.currentTimeMillis();
  25. setPos();
  26. }
  27. public void setGif( String _name, int _form )
  28. ...{
  29. try
  30. ...{
  31. name     = _name;
  32. form     = _form;
  33. formTime= new int[form];
  34. img        = new Image[form];
  35. forint i=0; i<form; i++ )
  36. ...{
  37. formTime[i]    =  100;
  38. allTime        += formTime[i];
  39. img[i]         =  Image.createImage("/pics/"+name+"_"+i+".png");
  40. }
  41. //            Image temp     = Image.createImage("/pics/"+name+".png");
  42. //            form        = temp.getWidth()/w;
  43. //            formTime    = new int[form];
  44. //            img            = new Image[form];
  45. //            Graphics gn;
  46. //            for( int i=0; i<img.length; i++ )
  47. //            {
  48. //                formTime[i]    = 100;                
  49. //                allTime        +=formTime[i];    
  50. //                img[i]         = Image.createImage(w, h);
  51. //                gn             = img[i].getGraphics();    
  52. //                gn.drawImage(temp, -i*w, 0, gn.LEFT|gn.TOP);
  53. //            }
  54. //            gn     = null;
  55. //            temp = null;    
  56. //            System.gc();
  57. }catch(Exception e)...{ e.printStackTrace(); }
  58. }
  59. public void setPos()
  60. ...{
  61. pos_x = cGame.rand.nextInt(cGame.s_width-w)  + ( w>>1 );
  62. pos_y = cGame.rand.nextInt(cGame.s_height-h) + ( h>>1 );
  63. startTime = System.currentTimeMillis();
  64. }
  65. public void setFormTime(int[] _formTime)
  66. ...{
  67. formTime = _formTime;
  68. allTime  = 0;
  69. forint i=0; i<formTime.length; i++ )
  70. ...{
  71. allTime    +=formTime[i];
  72. }
  73. startTime = System.currentTimeMillis();
  74. }
  75. public void paint(Graphics g)
  76. ...{
  77. if( isShow )
  78. ...{
  79. long now = System.currentTimeMillis();
  80. long time= (now-startTime)%allTime;
  81. for(int i=0; i<form; i++)
  82. ...{
  83. time -= formTime[i];
  84. if( time<=0 )
  85. ...{
  86. g.drawImage(img[i], pos_x, pos_y, g.HCENTER|g.VCENTER);
  87. break;
  88. }
  89. }
  90. }
  91. }
  92. }

cGame.java 这个类已经不陌生了, 作用功能和上一个游戏雷同

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

Snake.java这个类是之前的 Minesweeper.java这个类 基本上就该个名字,其他什么都不用改!

  1. ///
  2. //
  3. // Snake.java
  4. //
  5. // Project: Snake
  6. // Author(s): Gao Lei
  7. // Create: 2007-10-08
  8. ///
  9. package code;
  10. import javax.microedition.midlet.*;
  11. import javax.microedition.lcdui.*;
  12. ///
  13. public class Snake extends MIDlet
  14. ...{
  15. static Snake s_midlet;
  16. static Display s_display = null;
  17. static cGame s_game = null;
  18. public Snake()
  19. ...{
  20. s_midlet = this;
  21. }
  22. public void startApp()
  23. ...{
  24. if (s_display == null)
  25. ...{
  26. s_display = Display.getDisplay(this);
  27. }
  28. if (s_game == null)
  29. ...{
  30. s_game = new cGame();
  31. s_display.setCurrent(s_game);
  32. }
  33. else
  34. ...{
  35. s_display.setCurrent(s_game);
  36. }
  37. }
  38. public void pauseApp()
  39. ...{
  40. }
  41. public void destroyApp(boolean unconditional)
  42. ...{
  43. notifyDestroyed();
  44. }
  45. }

这次代码上的注释比较少的原因是我的IDE不支持中文输入!所以即便是加注释也是英文的!就没加了
大多数函数方法和上个游戏没多大变化!