J2ME课程设计报告Word格式.docx
- 文档编号:16413415
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:25
- 大小:147.80KB
J2ME课程设计报告Word格式.docx
《J2ME课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《J2ME课程设计报告Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
二、大作业题目
J2ME大作业题目:
设计一个贪食蛇小游戏。
三、概要设计
贪食蛇游戏是一条不停游动的蛇不断的捕食来达到自身的增长,但是若蛇碰到自身的身体或者碰到了任何障碍物,则游戏结束。
该游戏需要采用外部文件引入的图片贴图来绘制贪食蛇与食物的图标。
在游戏中,蛇的位置通过蛇头的坐标来实现移动的操作,其中引入了线程,同时不断刷新界面,使得蛇身不断移动。
在游戏过程中,贪食蛇的身体随着进食而增加其长度,当蛇头碰到不断增长的蛇身,游戏即结束。
四、详细设计
1.Map类的设计:
该类是实现贪食蛇界面的类。
该类通过将界面设计成一个数组来实现对于贪食蛇的控制,同时实现绘制界面的方法。
publicclassMap{//绘制Map界面
Imageimage;
TiledLayermBackground;
protectedMap(){
try{
image=Image.createImage("
/body.png"
);
//提取BODY图片
}catch(IOExceptione){
e.printStackTrace();
}
mBackground=newTiledLayer(17,17,image,8,8);
intcolumns=mBackground.getColumns();
int[]map={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
//绘制界面数组
for(inti=0;
i<
map.length;
i++){
intcolumn=i%columns;
introw=(i-column)/columns;
mBackground.setCell(column,row,map[i]);
}
}
2.SnakeImg类的设计:
该类是用于创建贪食蛇图标与食物图标的类。
通过该类对图片进行读取,从而在界面上绘制出图标。
贪食蛇是由一个红色的head与三个蓝色的BODY组成,在游戏的过程中,蛇身不断随着进食而增长。
食物由一个黑色方块构成。
publicclassSnakeImg{//绘制游戏图标
Imagehead;
//定义贪食蛇头对象
Imagebody;
//定义贪食蛇身对象
Imagefood;
//定义食物对象
SpriteheadSprite;
SpritefoodSprite;
SnakeImg(){
try{//读取图片
head=Image.createImage("
/head.png"
body=Image.createImage("
food=Image.createImage("
/food.png"
headSprite=newSprite(head);
foodSprite=newSprite(food);
3.SnakeMidlet类的设计:
该类是本程序的MIDLET类。
该类声明了SnakeMidlet,destroyApp,pauseApp,startApp等4个方法,从而保证了程序的顺利运行。
publicclassSnakeMidletextendsMIDlet{//定义MIDLET类
SnakeThreadsnakethread;
Displaydisplay;
publicSnakeMidlet(){//声明SnakeMidle方法
display=Display.getDisplay(this);
snakethread=newSnakeThread();
display.setCurrent(snakethread);
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{
//声明destroyApp方法
protectedvoidpauseApp(){
//声明pauseApp方法
protectedvoidstartApp()throwsMIDletStateChangeException{
//声明startApp方法
4.SnakeThread类的设计:
该类是程序实现功能的类。
通过该类实现SnakeThread线程的创建,通过贪食蛇的头的坐标来实现贪食蛇四个方向的移动,同时实现吃到食物实现自身的身长的增长,并且在该类中处理自动生成食物,越界与吃到食物的情况。
publicclassSnakeThreadextendsGameCanvasimplementsRunnable{
//创建snakethread类
Graphicsg;
booleanisRun;
SnakeImgimg;
Mapmap;
intheadX=64;
intheadY=64;
intheadMoveSign;
intcanpassSign;
intbodyMoveSign;
intchangePointNum;
int[]changePointX=newint[100];
int[]changePointY=newint[100];
int[]changePointSign=newint[100];
longgamestarttime;
longtimeSinceStart;
intx=8;
inty=8;
inttailX;
inttailY;
intfoodX;
intfoodY;
Randomr=newRandom();
publicSnakeThread(){//创建snakethread线程
super(true);
g=getGraphics();
img=newSnakeImg();
map=newMap();
start();
publicvoidstart(){
isRun=true;
Threadt=newThread(this);
t.start();
publicvoidrun(){
setfood();
map.mBackground.setCell(x,y-3,1);
map.mBackground.setCell(x,y-2,1);
map.mBackground.setCell(x,y-1,1);
while(isRun==true){
gamestarttime=System.currentTimeMillis();
paintAll();
gameOver();
if(timeSinceStart<
100){
try{
Thread.sleep(100-timeSinceStart);
}catch(InterruptedExceptionie){}
}
publicvoidpaintAll(){//绘制游戏界面与蛇身食物
g.setColor(220,220,220);
g.fillRect(0,0,156,156);
g.setColor(255,255,255);
g.fillRect(8,8,128,128);
map.mBackground.paint(g);
img.headSprite.setPosition(headX,headY);
img.headSprite.paint(g);
bodyMove();
headMove();
img.foodSprite.paint(g);
flushGraphics();
publicvoidheadMove(){
//通过0123定义snake的四个方向移动,通过headX或headY坐标实现
if(headMoveSign==0){
headY=headY+8;
map.mBackground.setCell(headX/8,headY/8-1,1);
elseif(headMoveSign==1){
headX=headX+8;
map.mBackground.setCell(headX/8-1,headY/8,1);
elseif(headMoveSign==2){
headY=headY-8;
map.mBackground.setCell(headX/8,headY/8+1,1);
elseif(headMoveSign==3){
headX=headX-8;
map.mBackground.setCell(headX/8+1,headY/8,1);
if(headY>
128){//处理越界情况
headY=8;
elseif(headY<
8){
headY=128;
elseif(headX>
128){
headX=8;
elseif(headX<
headX=128;
intkeyState=getKeyStates();
//成功吃到食物
if((keyState&
DOWN_PRESSED)!
=0){
canpassSign=0;
if(headMoveSign-canpassSign!
=2){
headMoveSign=canpassSign;
changePointX[changePointNum]=headX/8;
changePointY[changePointNum]=headY/8;
changePointSign[changePointNum]=canpassSign;
changePointNum++;
elseif((keyState&
RIGHT_PRESSED)!
canpassSign=1;
UP_PRESSED)!
canpassSign=2;
=-2){
LEFT_PRESSED)!
canpassSign=3;
publicvoidbodyMove(){//对于接收4个方向转向的处理
if(bodyMoveSign==0){
if(img.headSprite.collidesWith(img.foodSprite,true)){
setfood();
else{
y++;
if(y>
20){
y=5;
map.mBackground.setCell(x,y-4,0);
if(x==changePointX[0]&
y-4==changePointY[0]){
bodyMoveSign=changePointSign[0];
for(inti=0;
changePointNum;
changePointX[i]=changePointX[i+1];
changePointY[i]=changePointY[i+1];
changePointSign[i]=changePointSign[i+1];
}
changePointNum--;
elseif(bodyMoveSign==1){
x++;
if(x>
16){
x=1;
elseif(bodyMoveSign==2){
y--;
if(y<
5){
y=20;
elseif(bodyMoveSign==3){
x--;
if(x<
1){
x=16;
publicvoidsetfood(){//定义FOOD坐标
foodX=r.nextInt(16*8)+8;
foodY=r.nextInt(16*8)+8;
img.foodSprite.setPosition(foodX,foodY);
publicvoidgameOver(){//当蛇头碰到蛇身,游戏结束
if(map.mBackground.getCell(headX/8,headY/8)==1){
isRun=false;
五、运行结果
六、测试分析与体会小结
本次大作业所开发的贪食蛇手机游戏,实现了手机游戏的一些基本和必需的功能。
如游戏的界面绘制,对于接收玩家的方向控制键设置等功能。
但游戏功能还存在着很多不足,首先,对游戏的动画设计不够熟悉,技巧性不强,界面的设置也不够美观。
这些对于玩家来说是非常重要,将直接决定本游戏的生存能力。
其次,这款游戏中无法设置贪食蛇是否碰壁就算游戏结束。
这次游戏的功能没能做到十全十美,是由于自身能力的不足和时间的限制,没有对游戏的开发进行进一步研究,还有很多地方需要改进。
通过这次贪食蛇手机游戏的开发,我初步熟悉了J2ME程序的编写方法,增加了对于MIDLET类与线程等知识的理解。
同时本次开发实践让我初步掌握J2ME软件开发所需的基本技能和常用工具,为以后从事J2ME软件开发打下基础。
最后感谢我的苏老师对于本门课程的教授与指导,使我们在这段时间受益匪浅。
七、程序源代码
1.Map.java
importjava.io.IOException;
importjavax.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- J2ME 课程设计 报告