手机游戏开发技术实验报告.docx
《手机游戏开发技术实验报告.docx》由会员分享,可在线阅读,更多相关《手机游戏开发技术实验报告.docx(53页珍藏版)》请在冰豆网上搜索。
手机游戏开发技术实验报告
《J2ME手机游戏开发技术》实验报告
实验名称:
益智类游戏——炸弹人
1.实验目的
利用J2ME有关知识,设计一款益智类(PUZ)炸弹人(Bombman)游戏程序,是我们能够掌握JavaME游戏开发的基本技巧。
2.实验环境
Windows7操作系统,Eclipse,WTK2.5.1,JDK1.6
3.实验内容
利用自己所学的J2ME知识,进行游戏开发,该游戏的创意是游戏主角在一个随机生存的地图中放置炸弹,以消灭地图中所有的敌人为目的。
游戏地图被设计成一个多行多列的棋盘,游戏中的主角和敌人每次都只能按照棋盘中相邻的棋盘格进行移动,而且在地图中还存在不同的障碍物,用来阻挡游戏主角和敌人的移动。
游戏主角可以在没有障碍物的地方防止炸弹来引爆敌人或障碍物来获得去路。
从中有以下是几个元素的详细功能:
(1)空白区:
是游戏主角和敌人可以移动的位置及放置炸弹的位置。
(2)岩石:
地图中的障碍物,用来阻止游戏主角和敌人的且不能被炸弹摧毁。
(3)砖墙:
也是用来阻止的,不过能被炸弹摧毁变成空白区。
(4)敌人:
是消灭游戏主角的一方,它需要游戏主角用炸弹将其炸死,其所处的地方也会变为空白区,敌人在空白区来去自如,一旦碰到游戏主角,游戏主角会被杀死。
(5)游戏主角:
游戏中由玩家控制的一方,在空白区移动,可以放置炸弹。
4.实验步骤(代码分析)
该游戏是一个11*11的棋盘,用一个char型的二维数组来表示该棋盘,二维数组中的每一个数组元素就代表了游戏棋盘中的一个棋盘格。
该游戏采用面向对象的程序设计方法,主要的功能都封装到不同的类中,定义了以下几个类:
1.Board类:
该类作为程序的模型定义类,在其中定义了游戏中所使用的数据结构以及对这些数据结构中的数据进行设置和获取的方法。
2.BoardView类:
该类作为程序的视图定义类,也是游戏的画布屏幕类,在该类中定义了如何根据用户的游戏动作绘制对应的游戏运行画面的方法。
3.Bomb类:
该类表示游戏中的炸弹,定义了如何显示炸弹的爆炸效果以及炸弹爆炸后对其他相关元素的影响的方法。
4.Enemy类:
该类表示游戏中的敌人,具体定义了敌人如何移动以及判断敌人是否死亡的方法。
5.Player类:
该类表示游戏中的主角,定义了游戏主角如何移动、如何防止炸弹以及判断游戏是否死亡的方法。
6.Img类:
该类定义了游戏中各种图像的构造方法。
7.jBombMan类:
该类是程序的MIDlet类。
(1)jBombMan.java
privateDisplayoDisplay。
//屏幕对象
privateBoardViewoBoardView。
//棋盘视图对象
privateBoardoBoard。
//棋盘对象
privatePlayeroPlayer。
//主角对象
privateEnemyoEnemy。
//敌人对象
(2)Board.java
//定义棋盘的二维数组
publicchar[][]chBoard。
/*
N-None表示什么也没有
W-Wall表示砖墙
L-Pillar表示岩石
P-Player表示游戏主角
E-Enemy表示敌人
B-Bomb表示炸弹
U-Bombunderplayer表示主角正在放置炸弹
X-Exploding表示炸弹爆炸
*/
//声明一个随机数对象
privateRandomrandom。
//声明棋盘的行和列数
publicintiCols,iRows。
//声明判断游戏是否结束的标识
publicvolatilebooleanisGameOver。
//声明判断是否玩家胜利的标识
publicvolatilebooleanisWin。
//构造函数,初始化棋盘的行数和列数,并构造随机数对象
publicBoard(intcols,introws)
//定义棋盘的初始化方法
publicvoidinit()
//判断某个棋盘格中是否是给定的元素
publicbooleanisElement(charch,intx,inty)
//获取指定的某个棋盘格中的元素
publicchargetElement(intx,inty)
//设置指定的某个棋盘格中的元素
publicvoidsetElement(charch,intx,inty)
//判断给定的位置是否在敌人的攻击范围内
publicbooleannear(charch,intx,inty)
//判断给定的位置是否可以向某个方向移动2步
publicbooleannear2(charch,intx,inty)
(3)BoardView.java
privateBoardoBoard。
privatePlayeroPlayer。
privateEnemyoEnemy。
//定义背景色
privatefinalintBackgroundColor=0xffffff。
//定义每个棋盘格的大小
privatefinalintiCellSize=20。
//声明内部边框距离坐标原点的横坐标距离
privatefinalintiLeft=10。
//声明内部边框距离坐标原点的纵坐标距离
privatefinalintiTop=10。
publicBoardView(Boardboard)
publicvoidsetPlayer(Playerplayer)
publicvoidsetEnemy(Enemyenemy)
//绘制游戏屏幕
publicvoidpaint(Graphicsg)
//定义绘制游戏结束的方法
privatevoidpaintGameOver(Graphicsg)
//定义绘制游戏玩家获胜的方法
privatevoidpaintWin(Graphicsg)
//绘制游戏棋盘边框的方法
privatevoidpaintFrame(Graphicsg)
//定义绘制棋盘的方法
privatevoidpaintBoard(Graphicsg)
//定义响应按键按下的事件处理方法
publicvoidkeyPressed(intcode)
//定义游戏结束或者玩家胜利时的事件处理方法
privatevoidkeyForInit(intaction)
//定义游戏过程中的事件处理方法
privatevoidkeyForPlay(intaction)
//定义重新绘制棋盘格的方法
publicvoidrepaintCells(intx,inty,intw,inth)
(4)Player.java
privateBoardoBoard。
privateBoardViewoBoardView。
privateEnemyoEnemy。
privateBomboBomb。
privateRandomrandom。
privateintiX,iY。
//游戏主角的构造函数
publicPlayer(Boardboard,BoardViewboardview)
//游戏主角的初始化方法
publicvoidinit()
publicvoidsetEnemy(Enemyenemy)
//清除炸弹对象的方法
publicvoidclearBomb()
//判断游戏主角能否移动到给定的棋盘格上
privatebooleancanGo(intx,inty)
//定义放置炸弹的方法
publicvoidfire()
//定义游戏主角向左移动的方法
publicvoidleft()
//定义游戏主角向右移动的方法
publicvoidright()
//定义游戏主角向上移动的方法
publicvoidup()
//定义游戏主角向下移动的方法
publicvoiddown()
//定义游戏主角死掉的方法
publicvoiddie()
(5)Enemy.java
privateBoardoBoard。
privateBoardViewoBoardView。
publicPlayeroPlayer。
//设置敌人每次移动的间隔时间
privatefinalintiMoveTime=500。
privateRandomrandom。
//声明游戏中敌人的数量
privateintiNumbers。
//声明所有敌人所在位置的二维数组
privateint[][]arrPositions。
privatevolatilebooleanstopThread=false。
//初始化敌人对象的构造函数
publicEnemy(Boardboard,BoardViewboardview,Playerplayer,intnumbers)
//敌人对象的初始化方法
publicvoidinit()
publicvoidstopThread()
//定义线程的方法体,在该方法中将定义敌人如何进行移动
publicvoidrun()
//定义敌人的移动方法
privatevoidmove(inti)
//判断能否移动到指定棋盘格位置上的方法
privatebooleancanGo(intx,inty)
//定义给定位置上的敌人死亡的方法
publicvoiddie(intx,inty)
//定义游戏中的所有敌人对象全部死亡的方法
publicvoiddieAll()
(6)Bomb.java
privateBoardoBoard。
privateBoardViewoBoardView。
privatePlayeroPlayer。
privateEnemyoEnemy。
//定义炸弹爆炸前等待的时间
privatefinalintiExplodingTime=4000。
//定义爆炸效果显示的时间
privatefinalintiDisapearTime=1000。
privateintiX,iY。
privatevolatilebooleanstopThread=false。
//炸弹类的构造方法
publicBomb(Boardboard,BoardViewboardview,Playerplayer,Enemyenemy,intx,inty)
publicvoidstopThread()
//根据给定的单元格判断炸弹爆炸后的结果的方法
privatevoidexplode(intx,inty)
//清空给定的单元格中的元素
privatevoidclear(intx,inty)
//定义线程的方法体,在该方法中将定义炸弹爆炸的效果
publicvoidrun()
(7)img.java
//创建游戏中炸弹图像的方法,其余图像方法一样
publicstaticImageimgBomb=Image.createImage(newbyte[]{{...},(int)0,(int)163})。
5.实验结果与分析(包括代码和实验归纳总结)
程序代码:
1.游戏的模型类实现
(1)Board.java
packagecom.mot.j2me.midlets.jbombman。
importjava.util.*。
//定义游戏的模型的类,可以将其看做一个棋盘
publicclassBoard{
//定义棋盘的二维数组
publicchar[][]chBoard。
/*
N-None表示什么也没有
W-Wall表示砖墙
L-Pillar表示岩石
P-Player表示游戏主角
E-Enemy表示敌人
B-Bomb表示炸弹
U-Bombunderplayer表示主角正在放置炸弹
X-Exploding表示炸弹爆炸
*/
//声明一个随机数对象
privateRandomrandom。
//声明棋盘的行和列数
publicintiCols,iRows。
//声明判断游戏是否结束的标识
publicvolatilebooleanisGameOver。
//声明判断是否玩家胜利的标识
publicvolatilebooleanisWin。
//构造函数,初始化棋盘的行数和列数,并构造随机数对象
publicBoard(intcols,introws){
//构造随机数对象
random=newRandom()。
iCols=cols。
iRows=rows。
//构造表示棋盘的二维数组
chBoard=newchar[iCols][iRows]。
//调用棋盘的初始化方法
init()。
}
//定义棋盘的初始化方法
publicvoidinit(){
//表示游戏结束的标识设置为false
isGameOver=false。
//表示玩家获胜的标识设置为false
isWin=false。
//遍历二维数组,为数组的每个元素设置值为'N',表示游戏中每个棋盘格上都为空
for(inti=0。
ii++)
for(intj=0。
jj++)
chBoard[i][j]='N'。
//遍历二维数组,每相隔一个元素设置值为'L',表示游戏中每相隔的棋盘格上放置一个岩石
for(inti=1。
ii+=2)
for(intj=1。
jj+=2)
chBoard[i][j]='L'。
//遍历二维数组,在棋盘上非岩石的位置随机放置砖墙
for(inti=0。
ii++)
for(intj=0。
jj++)
//判断当前遍历到的棋盘格是否为空
if(chBoard[i][j]=='N')
//如果当前棋盘格位置为空,则根据随机数的判断条件是否成立来判断是否放置砖墙
if(Math.abs(random.nextInt())%2==0)
chBoard[i][j]='W'。
}
//判断某个棋盘格中是否是给定的元素
publicbooleanisElement(charch,intx,inty){
if(x<0)
returnfalse。
if(x>=iCols)
returnfalse。
if(y<0)
returnfalse。
if(y>=iRows)
returnfalse。
return(chBoard[x][y]==ch)。
}
//获取指定的某个棋盘格中的元素
publicchargetElement(intx,inty){
if(x<0)
return'?
'。
if(x>=iCols)
return'?
'。
if(y<0)
return'?
'。
if(y>=iRows)
return'?
'。
returnchBoard[x][y]。
}
//设置指定的某个棋盘格中的元素
publicvoidsetElement(charch,intx,inty){
if(ch=='?
')
return。
if(x<0)
return。
if(x>=iCols)
return。
if(y<0)
return。
if(y>=iRows)
return。
chBoard[x][y]=ch。
}
//判断给定的位置是否在敌人的攻击范围内
publicbooleannear(charch,intx,inty){
returnisElement(ch,x-1,y)||isElement(ch,x,y-1)
||isElement(ch,x+1,y)||isElement(ch,x,y+1)。
}
//判断给定的位置是否可以向某个方向移动2步
publicbooleannear2(charch,intx,inty){
return(isElement(ch,x-1,y)&&isElement(ch,x-2,y))
||(isElement(ch,x,y-1)&&isElement(ch,x,y-2))
||(isElement(ch,x+1,y)&&isElement(ch,x+2,y))
||(isElement(ch,x,y+1)&&isElement(ch,x,y+2))。
}
}
2.游戏的视图类实现
(1)BoardView.java
packagecom.mot.j2me.midlets.jbombman。
importjavax.microedition.lcdui.*。
//游戏的画布屏幕类
publicclassBoardViewextendsCanvas{
privateBoardoBoard。
privatePlayeroPlayer。
privateEnemyoEnemy。
//定义背景色
privatefinalintBackgroundColor=0xffffff。
//定义每个棋盘格的大小
privatefinalintiCellSize=20。
//声明内部边框距离坐标原点的横坐标距离
privatefinalintiLeft=10。
//声明内部边框距离坐标原点的纵坐标距离
privatefinalintiTop=10。
publicBoardView(Boardboard){
oBoard=board。
}
publicvoidsetPlayer(Playerplayer){
oPlayer=player。
}
publicvoidsetEnemy(Enemyenemy){
oEnemy=enemy。
}
//绘制游戏屏幕
publicvoidpaint(Graphicsg){
//声明同步块,对Graphics对象g进行同步
synchronized(g){
//如果游戏结束,则绘制游戏结束的界面
if(oBoard.isGameOver)
paintGameOver(g)。
//如果玩家获胜,则绘制玩家获胜的界面
elseif(oBoard.isWin)
paintWin(g)。
//否则绘制当前游戏运行的界面
else
paintBoard(g)。
}
}
//定义绘制游戏结束的方法
privatevoidpaintGameOver(Graphicsg){
g.drawImage(Img.imgGameOver,60,100,Graphics.LEFT|Graphics.TOP)。
}
//定义绘制游戏玩家获胜的方法
privatevoidpaintWin(Graphicsg){
g.drawImage(Img.imgCongratulation,60,100,Graphics.LEFT|Graphics.TOP)。
}
//绘制游戏棋盘边框的方法
privatevoidpaintFrame(Graphicsg){
g.drawRect(0,0,239,239)。
g.drawRect(1,1,237,237)。
g.drawRect(2,2,235,235)。
g.drawRect(3,3,233,233)。
g.drawRect(7,7,225,225)。
g.drawRect(8,8,223,223)。
}
//定义绘制棋盘的方法
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(h>oBoard.iRows)
h=oBoard.iRows。
//根据工作区的位置,开始绘制棋盘中的元素
for(inti=x。
ii++)
for(intj=y。
jj++)
//根据遍历得到的数组中的元素类型进行绘制
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|Graphi