用MIDP实现贪吃蛇游戏 |
| 作者:不详 来源:本站整理 发布时间:2005-11-24 16:57:03 |
|
标,然后段的头部开始按照方向向后画若干节。(段的头尾和蛇的头尾不是一个概念) 下面代码段是WormLink中的段得属性: // 段头部坐标 private int x, y; // 段长度 private int len; // 移动方向 private byte dir; 下面重点介绍几个重要函数: public void decreaseLength() 这是从段的头部减少一格 // 首先段的总长度减少1 len--; switch (dir) { // 不同的方向左边的改变也不一样 case Worm.LEFT: x--; break; case Worm.RIGHT: x++; break; case Worm.UP: y--; break; case Worm.DOWN: y++; break; } public boolean contains(int x, int y) 判断所给的坐标[x,y]是否包含在段中 switch (dir) { // 不同的方向判断的方法也不一样 case Worm.LEFT: return ((y == this.y) && ((x <= this.x) && (x >= getEndX()))); case Worm.RIGHT: return ((y == this.y) && ((x >= this.x) && (x <= getEndX()))); case Worm.UP: return ((x == this.x) && ((y <= this.y) && (y >= getEndY()))); case Worm.DOWN: return ((x == this.x) && ((y >= this.y) && (y <= getEndY()))); } public int getEndX() 得到这一段的尾部x坐标(段方向指向的最后一格的坐标),当这段是蛇的头部段时,得到的是头部最前面的坐标。 // 不同的方向判断方法不一样 if (dir == Worm.LEFT) return x-len; if (dir == Worm.RIGHT) return x+len; return x; WormPit类 WormPit类中包括了Worm和WormFood。贪吃蛇将会在画面中移动寻找食物。如果它吃到食物它将会长一格。如果它碰到边界或者吃到自己将Game Over。 下面介绍几个重要的函数: private void paintPitContents(Graphics g) 重绘屏幕上的所有元素 // 更新贪吃蛇的状态 myWorm.update(g); // 头部的位置和食物的位置重合就吃到食物 if (myFood.isAt(myWorm.getX(), myWorm.getY())) { myWorm.eat(); score += level; foodEaten++; if (foodEaten > (level << 1)) { /* 增加游戏难度 */ forceRedraw = true; foodEaten = 0; level++; if (tonePlayer != null) { try { tonePlayer.setMediaTime(0); tonePlayer.start(); } catch (MediaException me) { } } } else { if (audioPlayer != null) { try { Manager.playTone(69, 50, 100); // Play audio } catch (MediaException me) { } } } g.setColor(WormPit.ERASE_COLOUR); // 填充长方形(三个字的宽度) g.fillRect((width - (SCORE_CHAR_WIDTH * 3))-START_POS, height-START_POS, (SCORE_CHAR_WIDTH * 3), SCORE_CHAR_HEIGHT); g.setColor(WormPit.DRAW_COLOUR); // 显示新的分数 g.drawString("" + score, width - (SCORE_CHAR_WIDTH * 3) - START_POS, height - START_POS, Graphics.TOP|Graphics.LEFT); // 重新生成食物 myFood.regenerate(); int x = myFood.getX(); int y = myFood.getY(); while (myWorm.contains(x, y)) { // 如果食物和贪吃蛇的身体重复就重新生成 myFood.regenerate(); x = myFood.getX(); y = myFood.getY(); } } // 画出食物 myFood.paint(g); } catch (WormException se) { gameOver = true; } public void run() 主循环体: while (!gameDestroyed) { // 游戏不终止就一直循环执行 try { synchronized (myWorm) { // 多线程中要进行同步 // 如果游戏结束 if (gameOver) { if (WormScore.getHighScore(level) < score) { // 把最高分保存 WormScore.setHighScore(level, score, "me"); } if ((audioPlayer != null) && (audioPlayer.getState() == Player.STARTED)) { try { audioPlayer.stop(); Manager.playTone(60, 400, 100); } catch (Exception ex) { } } // 重绘 repaint(); // 游戏结束时等待用户重新开始 myWorm.wait(); } else if (gamePaused) { //重绘 repaint(); // 游戏暂停时等待用户重新开始 myWorm.wait(); } else { // 游戏继续 myWorm.moveOnUpdate(); repaint(); // 这里的等待时间决定了游戏难度!!! myWorm.wait(DEFAULT_WAIT-(level*40)); } } } catch (java.lang.InterruptedException ie) { } } WormMain类 最主要的类,继承自MIDlet父类并实现了CommandListener接口。 protected void startApp() 实现MIDlet父类的方法,当开始程序时首先执行这个函数 // 显示画板 Display.getDisplay(this).setCurrent(theGame); try { // 开始游戏线程 Thread myThread = new Thread(theGame); myThread.start(); } catch (Error e) { destroyApp(false); notifyDestroyed(); } public void commandAction(Command c, Displayable d) 接受并处理用户输入事件 // 重新开始 if (c == restartCmd) { theGame.restart(); }; // 改变难度等级 if (c == levelCmd) { Item[] levelItem = { new Gauge("Level", true, 9, theGame.getLevel()) }; Form f = new Form("Change Level", levelItem); f.addCommand(OKCmd); f.addCommand(cancelCmd); f.setCommandListener(this); Display.getDisplay(this).setCurrent(f); }; // 离开游戏 if (c == exitCmd) { destroyApp(false); notifyDestroyed(); }; // 开始游戏 if (c == startCmd) { theGame.removeCommand(startCmd); theGame.addCommand(restartCmd); theGame.restart(); }; // 确定 if (c == OKCmd) { Form f = (Form)d; Gauge g = (Gauge)f.get(0); theGame.setLevel(g.getValue()); Display.getDisplay(this).setCurrent(theGame); }; // 取消 if (c == cancelCmd) { Display.getDisplay(this).setCurrent(theGame); }; // 打开音效 if (c == audioOnCmd) { /* 打开音效 */ theGame.createAudioPlayer(); theGame.removeCommand(audioOnCmd); theGame.addCommand(audioOffCmd); }; // 关闭音效 if (c == audioOffCmd) { /* 关闭音效 */ theGame.destroyAudioPlayer(); theGame.removeCommand(audioOffCmd); theGame.addCommand(audioOnCmd); } |
| [] [返回上一页] [打 印] |
|
文章评论 |
