1、Java ME 炸弹人 课程设计报告JAVA ME游戏程序设计实验报告所在院(系): 数学与信息技术计算机学院学 号 :学生姓名 :年级专业 : 指导教师 : 提交日期 : 2012 年 6 月如需源代码请单独联系我QQ:452937595 博客: 1、游戏设计 1.游戏构想 本游戏的创意来自原版游戏泡泡堂,游戏主角在一个随机生成的地图中放置炸弹,以消灭地图中所有的敌人为目的。游戏地图被设计成一个多行多列的棋盘,游戏中的主角和敌人每次都只能按照棋盘中相邻的棋盘进行移动,而且在地图中还存在不同的障碍物,这些障碍物将阻挡游戏主角和敌人的移动。游戏的主角可以在没有任何障碍物的棋盘格中放置炸弹,炸弹爆
2、炸时候将摧毁与该棋盘格上下左右的四个棋盘格中的某些障碍物和敌人,当然游戏主角如果也处于这个范围内,游戏主角自己也被炸死。 2.游戏结构A.角色游戏主角:游戏中由玩家控制的一方,可以在任何空白区域随便移动,也可以在任何空白区域放置炸弹。敌人:地图中需要被游戏玩家消灭的一方,游戏主角需要放置炸弹将其炸死,敌人被杀死后,其所处的位置将变为空白区域,敌人可以在地图上的任何空白区域随便移动,当游戏主角碰到敌人时候,也会被杀死,游戏就结束了。B.炸弹游戏主角可以在地图上的任何空白区域放置炸弹,一定延时后炸弹爆炸,爆炸后以炸弹所在位置为中心向上下左右产生爆炸效果。 1、可以炸死敌人2、可以炸死游戏主角3、可
3、以摧毁砖墙,摧毁后砖墙位置变为空白区域4、遇到岩石没有任何作用C.地图整个游戏地图被划分为11*11的棋盘,每个棋盘格中放置一个游戏元素,游戏中各个游戏元素的详细功能介绍如下:空白区域:是地图中游戏主角和敌人可以移动到的位置,也是游戏主角可以放置炸弹的位置。岩石:地图中的障碍物能够阻止游戏主角和敌人的移动,并且不能够被炸弹摧毁。砖墙:地图中的另一种障碍物,也能够阻止游戏主角和敌人的移动,但是可以被炸弹摧毁掉,摧毁后的砖墙的位置变为空白区域。使用如下字符来表示游戏中的各种类型的元素N:表示空白区域W:表示砖墙L:表示岩石P:表示游戏主角E:表示敌人B:表示炸弹U:表示游戏主角正在放置炸弹X:表示
4、炸弹爆炸我们可以使用一个char型的二维数组中的数据来表示游戏中的元素以及各元素在游戏中的位置,当游戏中的敌人或者游戏主角根据游戏动作进行移动时,只需要修改二维数组中对应的数据元素的内容就可以了,游戏的视图在绘制时只需要遍历这个二维数组,就可以根据游戏动作绘制出当前的游戏运行画面。3.游戏的类 Board类:该类作为程序的模型定义类,在其中定义了游戏中所使用的数据结构以及对这些数据结构中的数据进行设置和获取的方法。 BoardView类:该类作为程序的视图定义类,也是游戏的画布屏幕类,在该类中定义了如何根据用户的游戏动作绘制对应的游戏运行画面的方法。 Bomb类:该类表示游戏中的炸弹,定义了如
5、何显示炸弹的爆炸效果以及炸弹爆炸后对其他相关元素的影响的方法。 Enemy类:该类表示游戏中的敌人,具体定义了敌人如何移动以及判断敌人是否死亡的方法。 Player类:该类表示游戏中的主角,定义了游戏主角如何移动、如何放置炸弹以及如何判断游戏主角是否死亡的方法。 Img类:该类定义了游戏中各种图像的构造方法。 jBombMan类:该类是程序的MIDlet类。2、代码分析 1./定义棋盘的初始化方法 public void init() /表示游戏结束的标识设置为false isGameOver = false; /表示玩家获胜的标识设置为false isWin = false; /遍历二维数组
6、,为数组的每个元素设置值为N,表示游戏中每个棋盘格上都为空 for( int i=0; iiCols; i+ ) for( int j=0; jiRows; j+ ) chBoardij = N; / 遍历二维数组,每相隔一个元素设置值为L,表示游戏中每相隔的棋盘格上放置一个岩石 for( int i=1; iiCols; i+=2 ) for( int j=1; jiRows; j+=2 ) chBoardij = L; / 遍历二维数组,在棋盘上非岩石的位置随机放置砖墙 for( int i=0; iiCols; i+ ) for( int j=0; joBoard.iRows ) h =
7、 oBoard.iRows; /根据工作区的位置,开始绘制棋盘中的元素 for( int i=x; ix+w; i+ ) for( int j=y; jy+h; j+ ) /根据遍历得到的数组中的元素类型进行绘制 switch( oBoard.chBoardij ) case N: /当前数组元素中的类型表示空白区域,则绘制空白区域的图像 g.setColor( BackgroundColor ); g.fillRect( iLeft + i*iCellSize, iTop + j*iCellSize, iCellSize, iCellSize ); break; case W: /当前数组元
8、素中的类型表示砖墙,则绘制砖墙的图像 g.drawImage( Img.imgWall, iLeft + i*iCellSize, iTop + j*iCellSize, Graphics.LEFT|Graphics.TOP ); break; case L: /当前数组元素中的类型表示岩石,则绘制岩石的图像 g.drawImage( Img.imgPillar, iLeft + i*iCellSize, iTop + j*iCellSize, Graphics.LEFT|Graphics.TOP ); break; case P: /当前数组元素中的类型表示游戏主角,则绘制游戏主角的图像 c
9、ase U: /当前数组元素中的类型表示主角正在放置炸弹,则绘制游戏主角的图像 g.drawImage( Img.imgPlayer, iLeft + i*iCellSize, iTop + j*iCellSize, Graphics.LEFT|Graphics.TOP ); break; case E: /当前数组元素中的类型表示敌人,则绘制敌人的图像 g.drawImage( Img.imgEnemy, iLeft + i*iCellSize, iTop + j*iCellSize, Graphics.LEFT|Graphics.TOP ); break; case B: /当前数组元素中
10、的类型表示炸弹,则绘制炸弹的图像 g.drawImage( Img.imgBomb, iLeft + i*iCellSize, iTop + j*iCellSize, Graphics.LEFT|Graphics.TOP ); break; case X: /当前数组元素中的类型表示炸弹爆炸,则绘制炸弹爆炸的图像 g.drawImage( Img.imgExploding, iLeft + i*iCellSize, iTop + j*iCellSize, Graphics.LEFT|Graphics.TOP ); break; paintBoard()方法是绘制游戏棋盘的,在该方法中首先调用p
11、aintFrame()方法来绘制棋盘的边框,然后遍历游戏模型类中定义的二维数组,根据数组中的每个元素的具体值来绘制对应的游戏元素的图像。3./游戏主角的初始化方法 public void init() while( true ) /获取游戏主角初始化的随机位置 iX = Math.abs( random.nextInt() ) % oBoard.iCols; iY = Math.abs( random.nextInt() ) % oBoard.iRows; /如果随机位置上不为空,则跳出当前本次循环,再重新获取随机位置 if( oBoard.chBoardiXiY != N ) continu
12、e; /如果随机位置在敌人的攻击范围内,则跳出当前本次循环,再重新获取随机位置 if( oBoard.near( E, iX, iY ) ) continue; /如果随机位置不能够向任何方向移动2步,则跳出当前本次循环,再重新获取随机位置 if( !oBoard.near2( N, iX, iY ) ) continue; /如果获得一个合适的随机位置,则跳出死循环,继续向下执行 break; /在棋盘中根据获取的随机位置设置对应的棋盘格中的元素为游戏主角 oBoard.chBoardiXiY = P; Init()方法定义了游戏主角的初始化,该方法将把游戏主角随机放置在游戏棋盘上的某个棋盘
13、格中。4./定义给定位置上的敌人死亡的方法 public void die( int x, int y ) System.out.println( Bomb die: x= + x + , y= + y ); int i; /遍历游戏中的全部敌人,判断是否有敌人在给定的棋盘格上,如果有则设置其列值为-1,表示该敌人已经死亡 for( i=0; iiNumbers; i+ ) if( (arrPositionsi0 = x)&(arrPositionsi1 = y) ) arrPositionsi0 = -1; break; /再次重新遍历游戏中的全部敌人,如果碰到一个未死亡的,则结束循环,如果
14、循环的计数值等于游戏中全部敌人的数量,则表示玩家获胜 for( i=0; iiNumbers; i+ ) if( arrPositionsi0 != -1 ) break; /判断循环计数值是否等于游戏中全部敌人的数量,如果是,则设置玩家获胜的标识,并重新绘制画布屏幕 if( i = iNumbers ) oBoard.isWin = true; oBoardView.repaint(); /定义游戏中的所有敌人对象全部死亡的方法 public void dieAll() /遍历全部游戏中的敌人,设置它们的列值为-1,表示它们全部死亡 for( int i=0; iiNumbers; i+ )
15、 arrPositionsi0 = -1; 设置在给定位置上的敌人死亡的方法die(),该方法首先判断给定位置上是否有敌人元素,如果有则将对应该位置的二维数组arrPositions中的值设置为-1,这就表示该数组元素表示的敌人已经死亡,然后遍历整个二维数组,如果数组中的-1的个数等于初始化游戏生成的敌人的个数,则表示游戏中的敌人全部被消灭,玩家获胜。5./敌人对象的初始化方法 public void init() int x, y; /随机将游戏中的敌人放置在棋盘中 for( int i=0; iiNumbers; ) /随机得到每个敌人在棋盘格中的位置 x = Math.abs( rand
16、om.nextInt() ) % oBoard.iCols; y = Math.abs( random.nextInt() ) % oBoard.iRows; /如果得到的随机位置上已经有其他元素了,则跳出本次循环 if( oBoard.chBoardxy != N ) continue; /如果得到的随机位置上为空,则将敌人元素放置在该单元格中 oBoard.chBoardxy = E; /将敌人对象所处的单元格位置保存在数组中 arrPositionsi0 = x; arrPositionsi1 = y; /继续本次循环 i+; 定义了游戏中初始化敌人的方法init(),在该方法中将随机产
17、生敌人所在的棋盘格位置,如果生成的位置上恰好是空白区域,则将敌人放置在该位置上,并将该位置定义在一个记录全部敌人位置的二维数组arrPositions中,如果生成的位置上有其他游戏元素,则重新生成随机位置再进行判断。6. /根据给定的单元格判断炸弹爆炸后的结果的方法 private void explode( int x, int y ) /如果给定的单元格中是游戏主角或者是游戏主角正在放置炸弹,则游戏主角死掉 if( oBoard.isElement( P, x, y )|oBoard.isElement( U, x, y ) ) oPlayer.die(); /如果给定的单元格中是敌人,则
18、敌人死掉 else if ( oBoard.isElement( E, x, y ) ) oEnemy.die( x, y ); /只要给定的单元格不是岩石和炸弹爆炸的元素,则给定的单元格中设置炸弹爆炸元素 if ( oBoard.isElement( N, x, y )|oBoard.isElement( W, x, y ) |oBoard.isElement( P, x, y )|oBoard.isElement( E, x, y ) |oBoard.isElement( U, x, y )|oBoard.isElement( B, x, y ) ) oBoard.chBoardxy =
19、X; Explode()方法定义了在给定位置放置炸弹后,炸弹爆炸所影响到的其他棋盘格的情况。如果炸弹爆炸时影响的棋盘格中是游戏主角元素,则调用Player类的die()方法使游戏主角死掉。如果炸弹爆炸时影响的棋盘格中是敌人元素,则调用Enemy类的die()方法使敌人死掉。3、调试 游戏初始画面游戏结束画面游戏获胜界面4、个人总结 以前我们只知道玩手机游戏的乐趣,对于手机游戏也充满了好奇,内心也是很崇拜那些开发这些游戏的人们。这学期我们开设了Java ME 这门课程,让我们开始接触学习游戏开发,也慢慢的学会了如何开发小型简单类的手机游戏。只有理论结合实践,才能提高自己的实际动手能力和独立思考的
20、能力。所以期末的手机游戏设计才是检验自己到底学到了多少,到底哪里有不足,如何改善这些不足的地方,才能更好的学习下去。在这几周我开发“炸弹人”的过程中,遇到了各种各样的困难和错误,但是面对错误和困难,我还是想尽办法去解决。或是上网查找资料、或是请教其他同学、或是查阅书籍、或是咨询老师,总算游戏还是完成了。通过这次实战,首先是对eclipse这个软件有了更深一步的了解和深入,其次J2ME类库的使用也有很了大大的提高。以前上课的时候,有时候遇到不懂的地方,现在才明白那是由于我没有在课后及时对老师所讲的内容进行实践操作,所以才记住了内容,却没有融会贯通,自然时间长了越积越多也就不会了,所以不管学习什么,特别是我们软件编程开发这方面,更重要的是实践。这次游戏设计还算顺利的完成了,付出的心血和努力没有白费。其实这个炸弹人游戏可以继续完善下去,例如可以记分数排名、加入一些道具等,在不断实践中完善。在这里还得衷心的感谢老师,平时上机给我的很多指导,也给我们大家充足的上机实践时间,使得大家很认真去学习这门课程,也顺利完成这门课程的设计。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1