您好,欢迎访问三七文档
当前位置:首页 > 学术论文 > 毕业论文 > Java-ME--炸弹人-课程设计报告
《JAVAME游戏程序设计》实验报告所在院(系):数学与信息技术计算机学院学号:学生姓名:年级专业:指导教师:提交日期:2012年6月如需源代码请单独联系我QQ:452937595博客:一、游戏设计1.游戏构想本游戏的创意来自原版游戏《泡泡堂》,游戏主角在一个随机生成的地图中放置炸弹,以消灭地图中所有的敌人为目的。游戏地图被设计成一个多行多列的棋盘,游戏中的主角和敌人每次都只能按照棋盘中相邻的棋盘进行移动,而且在地图中还存在不同的障碍物,这些障碍物将阻挡游戏主角和敌人的移动。游戏的主角可以在没有任何障碍物的棋盘格中放置炸弹,炸弹爆炸时候将摧毁与该棋盘格上下左右的四个棋盘格中的某些障碍物和敌人,当然游戏主角如果也处于这个范围内,游戏主角自己也被炸死。2.游戏结构A.角色游戏主角:游戏中由玩家控制的一方,可以在任何空白区域随便移动,也可以在任何空白区域放置炸弹。敌人:地图中需要被游戏玩家消灭的一方,游戏主角需要放置炸弹将其炸死,敌人被杀死后,其所处的位置将变为空白区域,敌人可以在地图上的任何空白区域随便移动,当游戏主角碰到敌人时候,也会被杀死,游戏就结束了。B.炸弹游戏主角可以在地图上的任何空白区域放置炸弹,一定延时后炸弹爆炸,爆炸后以炸弹所在位置为中心向上下左右产生爆炸效果。1、可以炸死敌人2、可以炸死游戏主角3、可以摧毁砖墙,摧毁后砖墙位置变为空白区域4、遇到岩石没有任何作用C.地图整个游戏地图被划分为11*11的棋盘,每个棋盘格中放置一个游戏元素,游戏中各个游戏元素的详细功能介绍如下:空白区域:是地图中游戏主角和敌人可以移动到的位置,也是游戏主角可以放置炸弹的位置。岩石:地图中的障碍物能够阻止游戏主角和敌人的移动,并且不能够被炸弹摧毁。砖墙:地图中的另一种障碍物,也能够阻止游戏主角和敌人的移动,但是可以被炸弹摧毁掉,摧毁后的砖墙的位置变为空白区域。使用如下字符来表示游戏中的各种类型的元素N:表示空白区域W:表示砖墙L:表示岩石P:表示游戏主角E:表示敌人B:表示炸弹U:表示游戏主角正在放置炸弹X:表示炸弹爆炸我们可以使用一个char型的二维数组中的数据来表示游戏中的元素以及各元素在游戏中的位置,当游戏中的敌人或者游戏主角根据游戏动作进行移动时,只需要修改二维数组中对应的数据元素的内容就可以了,游戏的视图在绘制时只需要遍历这个二维数组,就可以根据游戏动作绘制出当前的游戏运行画面。3.游戏的类Board类:该类作为程序的模型定义类,在其中定义了游戏中所使用的数据结构以及对这些数据结构中的数据进行设置和获取的方法。BoardView类:该类作为程序的视图定义类,也是游戏的画布屏幕类,在该类中定义了如何根据用户的游戏动作绘制对应的游戏运行画面的方法。Bomb类:该类表示游戏中的炸弹,定义了如何显示炸弹的爆炸效果以及炸弹爆炸后对其他相关元素的影响的方法。Enemy类:该类表示游戏中的敌人,具体定义了敌人如何移动以及判断敌人是否死亡的方法。Player类:该类表示游戏中的主角,定义了游戏主角如何移动、如何放置炸弹以及如何判断游戏主角是否死亡的方法。Img类:该类定义了游戏中各种图像的构造方法。jBombMan类:该类是程序的MIDlet类。二、代码分析1.//定义棋盘的初始化方法publicvoidinit(){//表示游戏结束的标识设置为falseisGameOver=false;//表示玩家获胜的标识设置为falseisWin=false;//遍历二维数组,为数组的每个元素设置值为'N',表示游戏中每个棋盘格上都为空for(inti=0;iiCols;i++)for(intj=0;jiRows;j++)chBoard[i][j]='N';//遍历二维数组,每相隔一个元素设置值为'L',表示游戏中每相隔的棋盘格上放置一个岩石for(inti=1;iiCols;i+=2)for(intj=1;jiRows;j+=2)chBoard[i][j]='L';//遍历二维数组,在棋盘上非岩石的位置随机放置砖墙for(inti=0;iiCols;i++)for(intj=0;jiRows;j++)//判断当前遍历到的棋盘格是否为空if(chBoard[i][j]=='N')//如果当前棋盘格位置为空,则根据随机数的判断条件是否成立来判断是否放置砖墙if(Math.abs(random.nextInt())%2==0)chBoard[i][j]='W';}在该类的初始化方法init()中首先遍历整个二维数组,把数组中的每个数组元素都设置为字符‘W’,这样就表示整个地图中都是空白区域,然后再次遍历整个二维数组,将间隔的数组元素设置为字符‘L’,这表示地图中每相隔的棋盘格上放置一个岩石,最后再次遍历整个二维数组,在非岩石的位置上根据产生的随机数来设置砖墙。这样调用初始化方法之后,游戏的随即地图就生成了。2.//定义绘制棋盘的方法privatevoidpaintBoard(Graphicsg){//判断画布屏幕的工作区的原点是否在坐标轴的原点上,如果是则直接绘制游戏棋盘的边框if(g.getClipX()==0)paintFrame(g);//设置画布屏幕的工作区的左上角坐标以及高度和宽度intx=(g.getClipX()-iLeft)/iCellSize;inty=(g.getClipY()-iTop)/iCellSize;intw=g.getClipWidth()/iCellSize;inth=g.getClipHeight()/iCellSize;System.out.println(paint:x=+x+,y=+y+,w=+w+,h=+h);//如果画布屏幕的工作区的高度超过了棋盘的高,则将工作区的高度设置为棋盘的高度if(hoBoard.iRows)h=oBoard.iRows;//根据工作区的位置,开始绘制棋盘中的元素for(inti=x;ix+w;i++)for(intj=y;jy+h;j++)//根据遍历得到的数组中的元素类型进行绘制switch(oBoard.chBoard[i][j]){case'N'://当前数组元素中的类型表示空白区域,则绘制空白区域的图像g.setColor(BackgroundColor);g.fillRect(iLeft+i*iCellSize,iTop+j*iCellSize,iCellSize,iCellSize);break;case'W'://当前数组元素中的类型表示砖墙,则绘制砖墙的图像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'://当前数组元素中的类型表示游戏主角,则绘制游戏主角的图像case'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'://当前数组元素中的类型表示炸弹,则绘制炸弹的图像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()方法是绘制游戏棋盘的,在该方法中首先调用paintFrame()方法来绘制棋盘的边框,然后遍历游戏模型类中定义的二维数组,根据数组中的每个元素的具体值来绘制对应的游戏元素的图像。3.//游戏主角的初始化方法publicvoidinit(){while(true){//获取游戏主角初始化的随机位置iX=Math.abs(random.nextInt())%oBoard.iCols;iY=Math.abs(random.nextInt())%oBoard.iRows;//如果随机位置上不为空,则跳出当前本次循环,再重新获取随机位置if(oBoard.chBoard[iX][iY]!='N')continue;//如果随机位置在敌人的攻击范围内,则跳出当前本次循环,再重新获取随机位置if(oBoard.near('E',iX,iY))continue;//如果随机位置不能够向任何方向移动2步,则跳出当前本次循环,再重新获取随机位置if(!oBoard.near2('N',iX,iY))continue;//如果获得一个合适的随机位置,则跳出死循环,继续向下执行break;}//在棋盘中根据获取的随机位置设置对应的棋盘格中的元素为游戏主角oBoard.chBoard[iX][iY]='P';}Init()方法定义了游戏主角的初始化,该方法将把游戏主角随机放置在游戏棋盘上的某个棋盘格中。4.//定义给定位置上的敌人死亡的方法publicvoiddie(intx,inty){System.out.println(Bombdie:x=+x+,y=+y);inti;//遍历游戏中的全部敌人,判断是否有敌人在给定的棋盘格上,如果有则设置其列值为-1,表示该敌人已经死亡for(i=0;iiNumbers;i++)if((arrPositions[i][0]==x)&&(arrPositions[i][1]==y)){arrPositions[i][0]=-1;break;}//再次重新遍历游戏中的全部敌人,如果碰到一个未死亡的,则结束循环,如果循环的计数值等于游戏中全部敌人的数量,则表示玩家获胜for(i=0;iiNumbers;i++)if(arrPositions[i][0]!=-1)break;//判断循环计数值是否等于游戏中全部敌人的数量,如果是,则设置玩家获胜的标识,并重新绘制画布屏幕if(i==iNumbers){oBoard.isWin=true;oBoardView.repaint();}}//定义游戏中的所有敌人对象全部死亡的方法publicvoiddieAll(){//遍历全部游戏中的敌人,设置它们的列值为-1,表示它们全部死亡for(inti=0;iiNumbers;i++)arrPositions[i][0]=-1;}}设置在给定位置上的敌人死亡的方法die(),该方法首先判断给定位置上是否有敌人元素,如果有则将对应该位置的二维数组arrPositions中的值设置为-1,这就表示该数组元素表示的敌人已经死亡,然后遍历整个二维数组,如果数组中的-1的个数等于初始化游戏生成的敌人的个数,则表示游戏中的敌人全部被消灭,玩家获胜。5.//敌人对象的初始化方法publicvoidinit(){intx,y;//随机将游戏中的敌人放置在棋盘中for(inti=0;iiNumbers;){//随机得到每个敌人在棋盘格中的位置x=Math.abs(random.nextInt(
本文标题:Java-ME--炸弹人-课程设计报告
链接地址:https://www.777doc.com/doc-5402815 .html