//根据遍历得到的数组中的元素类型进行绘制
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;iif((arrPositions[i][0]==x)&&(arrPositions[i][1]==y)){
arrPositions[i][0]=-1;
break;
}
//再次重新遍历游戏中的全部敌人,如果碰到一个未死亡的,则结束循环,如果循环的计数值等于游戏中全部敌人的数量,则表示玩家获胜
for(i=0;iif(arrPositions[i][0]!
=-1)
break;
//判断循环计数值是否等于游戏中全部敌人的数量,如果是,则设置玩家获胜的标识,并重新绘制画布屏幕
if(i==iNumbers){
oBoard.isWin=true;
oBoardView.repaint();
}
}
//定义游戏中的所有敌人对象全部死亡的方法
publicvoiddieAll(){
//遍历全部游戏中的敌人,设置它们的列值为-1,表示它们全部死亡
for(inti=0;iarrPositions[i][0]=-1;
}
}
设置在给定位置上的敌人死亡的方法die(),该方法首先判断给定位置上是否有敌人元素,如果有则将对应该位置的二维数组arrPositions中的值设置为-1,这就表示该数组元素表示的敌人已经死亡,然后遍历整个二维数组,如果数组中的-1的个数等于初始化游戏生成的敌人的个数,则表示游戏中的敌人全部被消灭,玩家获胜。
5.//敌人对象的初始化方法
publicvoidinit(){
intx,y;
//随机将游戏中的敌人放置在棋盘中
for(inti=0;i//随机得到每个敌人在棋盘格中的位置
x=Math.abs(random.nextInt())%oBoard.iCols;
y=Math.abs(random.nextInt())%oBoard.iRows;
//如果得到的随机位置上已经有其他元素了,则跳出本次循环
if(oBoard.chBoard[x][y]!
='N')
continue;
//如果得到的随机位置上为空,则将敌人元素放置在该单元格中
oBoard.chBoard[x][y]='E';
//将敌人对象所处的单元格位置保存在数组中
arrPositions[i][0]=x;
arrPositions[i][1]=y;
//继续本次循环
i++;
}
}
定义了游戏中初始化敌人的方法init(),在该方法中将随机产生敌人所在的棋盘格位置,如果生成的位置上恰好是空白区域,则将敌人放置在该位置上,并将该位置定义在一个记录全部敌人位置的二维数组arrPositions中,如果生成的位置上有其他游戏元素,则重新生成随机位置再进行判断。
6.//根据给定的单元格判断炸弹爆炸后的结果的方法
privatevoidexplode(intx,inty){
//如果给定的单元格中是游戏主角或者是游戏主角正在放置炸弹,则游戏主角死掉
if(oBoard.isElement('P',x,y)||oBoard.isElement('U',x,y))
oPlayer.die();
//如果给定的单元格中是敌人,则敌人死掉
elseif(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.chBoard[x][y]='X';
}
Explode()方法定义了在给定位置放置炸弹后,炸弹爆炸所影响到的其他棋盘格的情况。
如果炸弹爆炸时影响的棋盘格中是游戏主角元素,则调用Player类的die()方法使游戏主角死掉。
如果炸弹爆炸时影响的棋盘格中是敌人元素,则调用Enemy类的die()方法使敌人死掉。
3、调试
游戏初始画面
游戏结束画面
游戏获胜界面
4、个人总结
以前我们只知道玩手机游戏的乐趣,对于手机游戏也充满了好奇,内心也是很崇拜那些开发这些游戏的人们。
这学期我们开设了JavaME这门课程,让我们开始接触学习游戏开发,也慢慢的学会了如何开发小型简单类的手机游戏。
只有理论结合实践,才能提高自己的实际动手能力和独立思考的能力。
所以期末的手机游戏设计才是检验自己到底学到了多少,到底哪里有不足,如何改善这些不足的地方,才能更好的学习下去。
在这几周我开发“炸弹人”的过程中,遇到了各种各样的困难和错误,但是面对错误和困难,我还是想尽办法去解决。
或是上网查找资料、或是请教其他同学、或是查阅书籍、或是咨询老师,总算游戏还是完成了。
通过这次实战,首先是对eclipse这个软件有了更深一步的了解和深入,其次J2ME类库的使用也有很了大大的提高。
以前上课的时候,有时候遇到不懂的地方,现在才明白那是由于我没有在课后及时对老师所讲的内容进行实践操作,所以才记住了内容,却没有融会贯通,自然时间长了越积越多也就不会了,所以不管学习什么,特别是我们软件编程开发这方面,更重要的是实践。
这次游戏设计还算顺利的完成了,付出的心血和努力没有白费。
其实这个炸弹人游戏可以继续完善下去,例如可以记分数排名、加入一些道具等,在不断实践中完善。
在这里还得衷心的感谢老师,平时上机给我的很多指导,也给我们大家充足的上机实践时间,使得大家很认真去学习这门课程,也顺利完成这门课程的设计。