JAVA实验报告18-“打地鼠”游戏程序设计.docx
JAVA 实验(18)课程名称:Java面向对象程序设计学 院:管 理 学 院专业班级:信息管理与信息系统(6)班 学 号:3108006406姓 名:张钟权任课教师:聂小东2010年06月15日管 理学院 信息管理与信息系统专业08信管6班 组学号3108006406姓名张钟权 协作者 教师评定实验题目“打地鼠”游戏程序设计一、实验目的与要求(1)实验目的:通过编写调试“打地鼠”游戏程序,分析了解“打地鼠” 游戏的功能实现过程,掌握游戏设计的有关知识。(2)实验要求:按照实验教程的要求完成“打地鼠”游戏程序的编写和调 试工作。二、实验方案(1) HammerSprite 类:©HammerSprite (Image image, int frameWidth, int frameHeight)方法: 锤子精灵的构造函数,设置精灵贴片图像及精灵的宽度与高度;moveTo (intx, inty)方法:为游戏操控者控制手机的按键,移动 锤子精灵到指定位置。(2) MouseSprite 类:©MouseSprite (Image image, int frameWidth, int frameHeight) 方法: 地鼠精灵的构造函数,设置精灵贴片图像及精灵的宽度与长度;moveTo (int s)方法:根据随机数s,移动地鼠精灵到指定的坐标位 置。(3) MainCanvas 类:MainCanvas ()方法:对游戏进行初始化,设置游戏的背景图像及背景音乐,并实例化游戏精灵;gameStart ()方法:游戏开始,加载地鼠精灵,让其随机现身。(4) BeatSusliksMIDlet:执行程序的入口,定义了 “开始游戏”和“退出游戏”按钮地方法。三、实验结果和数据处理import java. io. *;import java, utiI. *;import javax. microedit ion. Icdui.*;import javax. microedition. Icdui. game. *;import javax. microedition, media. *;import javax. microedition, media, control. *;pub Iic cl ass Mai nCanvas extends GameCanvasimplements RunnabIeprivate private private private privateThread boo Iean int int Imagesleeping;begin;frameDeleay;bkp, hammer Image, start Img, mouse Image,gameOverImg;private private private private privateHammerSprite MouseSprite int long PlayerhammerSprite;mouseSprite;I eve I;Score;musicP layer, musicPIayerl;构造函数,进行一些初始化的设置 pub I ic Mai nCanvas ()(super (true);/frameDeleay = 33;/begin = 0;得分回零Score = 0;try游戏背景图像bkp = Image, create I mage C'/bk. pngn);游戏开始封面start I mg = Image, create I mage ("/start, png'1);锤子系列图像,构造锤子精灵hammer Image = Image. createlmage(n/chuizi. pngN);地鼠锤子系列图像,构造地鼠精灵mouse Image = Image, create I mage("/shu. png");地鼠贴片的宽和高mouseSprite = new MouseSprite( mouse I mage, 40, 30 );锤子贴片的宽和高hammerSprite = new HammerSprite ( hammer Image, 40, 30 );游戏结束画面gameOverImg = Image, createlmage ("/gameover. pngu);catch (IOExcept i on e)1 try 定义声音文件的输入流InputStream is = this. getClass(), getResourceAsStream(nMusic. midn);建立midi文件媒体播放器musicP layer = Manager. createPIayer (i s, "audio/midi");让播放器对声音流进行预提取mus i cP I ayer. prefetch ();设置声音的播放次数(无限循环)musicP Iayer. setLoopCount(-1);启动播放器mus i cP I ayer. start ();catch (IOException ioe)1)catch (MediaExcept ion me)精灵碰撞检测private void checkSpritEvent()(if (hammerSprite. col IidesWith(mouseSprite, true)mouseSprite.();加分 Score+=100;手机按键对应锤子精灵的坐标位置: private void update()(获取手机按键的键值int keySeIect = th i s. getKeyStates ();swi tch ()case LEFT.PRESSED:移动锤子精灵到指定的坐标位置 hammerSpr ite. moveTo (42, 93);检测精灵碰撞 checkSpr i tEvent ();break;case RIGHT_PRESSED:移动雇子精灵到指定的坐标位置 hammerSpr ite. moveTo(180, 92);检测精灵碰撞 checkSpr i tEvent ();break;case FIRE_PRESSED:移动锤子精灵到指定的坐标位置 hammerSpr i te. moveTo(110, 95);检测精灵碰撞 checkSpr i tEvent ();break;case UP_PRESSED:/场动锤子精灵到指定的坐标位置 hammerSpr i te. moveTo(120, 73);检测精灵碰撞 checkSpr i tEvent (); break;case DOWN_PRESSED:移务锤子精灵到指定的坐标位置 hammerSpr ite. moveTo(100, 134);检测精灵碰撞checkSpr i tEvent (); break;)显示游戏封面private void drawStart(Graphics g )(g. setColor( 0, 0, 0 );g. f i I I Rect ( 0, 0, getWidthO , getHe i ght (); g. setColor( 255, 255, 255 );g. dr aw I mage ( start I mg, 0, 0, g. T0P|g. LEFT );刷新画面f lushGraphics ();显示游戏画面private void draw( Graphics g )(g. setColor( 0, 0, 0 );g. f i I I Rect ( 0, 0, getWidthO , getHe i ght ();g. setColor( 255, 255, 255 );显示背景图像g. dr aw I mage ( bkp, 0, 0, g. TOP | g. LEFT );加载地鼠精灵mouseSpr i te. pai nt (g);加载锤子精灵hammerSpr i te. paint(g);g. setColor( 0, 0, 0 );记录得分g. drawStr i ng ( ,H+Score, 70, 194, g. TOP | g. LEFT);记录关卡g. drawStr ing( " n+mouseSpr i te. getLeve I (), 220, 194, g. TOP |g. LEFT);刷新画面f lushGraphics();过关,显示得分和过关数private void drawLevel(Graphics g)(g. setColor( 0, 0, 0 );g. f i I IRect ( 0, 0, getWidthO , getHeight ();g. setColor ( 255, 255, 255 );g. setColor ( 255, 255, 255 );在93行27列显示得分情况g. drawStr i ng ( H,+Score, 27, 93, g. TOP | g. LEFT);在93行106列显示过关数g. drawStr ing( " "+mouseSpr i te. getLeve I (), 106, 93, g. TOP | g. LEFT);在59行30列显示g. drawStr ing( "LeveI:n+mouseSpr ite. getLeveI() +" Start", 30,59,g. TOP | g. LEFT);刷新画面f lushGraphics();结束游戏画面private void drawGameOver( Graphics g )g. setColor( 0, 0, 0 );h. f i I I Rect ( 0, 0, getWidthO f getHe i ght (); 显示游戏结束画面i. draw I mage (gameOver I mg, 0, 0, g. TOP | g. LEFT);刷新画面f lushGraphics ();)启动线程pub I ic void start ()(sIeep i ng = false;t = new Thread (this);t. start ();运行线程pub I ic void run ()(Graphics g = this. getGraphics();whiIe( !sleeping )(游戏结束if ( mouseSprite. isGameOver ()(begin = -1;游戏进行中if( begin = 1 )(锤子精灵移动到指定的坐标位置update ();显示画面draw (g);try 暂停 Thread, sIeep (frameDeIeay); ) catch (InterruptedException ie) 如果是进入新关if ( mouseSprite. isNewLeveI ()显示新的关数drawLevel (g);mouseSprite. setNewLeveI (faIse);mouseSprite. initBeatMouse();Thread, sIeep (5000);catch (InterruptedException ie) 游戏开始else if ( begin = 0 )(drawStart(g);try(Thread, sIeep(frameDeIeay);catch (InterruptedException ie) 游戏结束else if( begin = -1 )(drawGameOver( g );mouseSpr i te. stop ();try mus i cP I ayer. stop () ; catch (Except i on e)( try(Thread.sIeep (500);)catch (InterruptedException ie)停止音乐pub I ic void stop ()(sIeep i ng = true;mus i cP I ayer. c I ose ();设置开始状态标志pub Iic void beginning( int b )begin = b;设置开始状态pub I ic int i fBeg i n ()(return begi n;)游戏开始pub Iic void gameStart()(开始过关数第1关beginning(l);得分归零Score = 0;初始化地鼠精灵的一些状态设置mouseSprite. i n i tGame ();加载地鼠精灵mouseSprite. start();)四、结论设计本程序的关键在于实现地鼠精灵的随机出现,几秒钟延时后,便 立即消失了,游戏操作者能够控制手机按键移动锤子精灵敲打到地鼠,发 生两类精灵碰撞。于是将程序划分为了锤子精灵HammerSprite类、地鼠精 灵 MouseSprite类、控制游戏操作的MainCanvas类以及程序入口 BeatSusliksMIDlet 类。五、问题与讨论锤子精灵HammerSprite类由两个状态的贴片构成,一个准备状态,一 个敲打状态;地鼠精灵MouseSprite类由两个状态的贴片构成,一个伸头状 态,一个被敲打状态。