J2ME课程设计报告.docx
《J2ME课程设计报告.docx》由会员分享,可在线阅读,更多相关《J2ME课程设计报告.docx(25页珍藏版)》请在冰豆网上搜索。
![J2ME课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/23/05a8dda3-ea5d-4b83-969e-d356d136534f/05a8dda3-ea5d-4b83-969e-d356d136534f1.gif)
J2ME课程设计报告
J2ME大作业
专业:
软件工程
课程名称:
j2me
课题名称:
贪食蛇
学号:
08201328
姓名:
杨之光
一、绪论
J2ME是为了能够开发运行在小型设备、独立设备、互联移动设备、嵌入式设备上的JAVA应用程序而被提出的。
J2ME是建立在一个由概要描述、配置、JAVA虚拟机和操作系统等部分组成的标准架构之上的,这些内容共同组成了完整的J2ME实时运行环境。
它的技术核心是由一个JAVA虚拟机(JVM)及一套适合运行在上述设备环境上的API接口构成。
J2ME在1999年的JavaOne开发人员大会上初次亮相,它的目标是面向智能无线设备和小型计算设备的开发人员,这些开发人员需要在他们的产品中整合跨平台的能力。
无线设备和小型计算设备的消费者期望这些设备能够有较高的性能。
他们希望小型计算设备有快速的响应时间,与同种设备相兼容,拥有功能完备的应用程序。
消费者希望桌面计算机和笔记本电脑上的软件和功能同样能够运行在移动电话和个人数字助理上。
为了满足他们的需求,开发人员必须重新考虑他们设计计算机系统的方式。
开发人员需要利用商业计算机上现有的前端和后端软件的计算能力,并将这些能力传递到微型、移动和无线的计算设备上。
J2ME能够以最小的修改来实现这种传递,如果应用程序的设计是可伸缩的,应用程序就可以适应小型计算设备上有限的资源。
J2ME为在小型电子设备上创建性能卓越的网络应用提供了一套完整的解决方案,能很好的解决软件跨平台的兼容性和安全性的问题。
贪吃蛇,是个简单的小游戏,但却能给人以放松,让我们从繁重的日常生活中解脱出来.而只有我们的身心得到了娱乐才能更好的投入到新的工作.现在的人,不管是已经工作的,还是还未进入社会的学生,都面临着很大的压力,而这样一款能让我们随时随地都能享受的游戏,其魅力还是不可估量的.
手机吞吃蛇游戏基于JAVA平台编写,采用J2ME技术开发的一款手机游戏。
二、大作业题目
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,
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,
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,
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,
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,
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,
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,
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;iintcolumn=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("/body.png");
food=Image.createImage("/food.png");
}catch(IOExceptione){
e.printStackTrace();
}
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<8){
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)!
=0){
canpassSign=1;
if(headMoveSign-canpassSign!
=2){
headMoveSign=canpassSign;
changePointX[changePointNum]=headX/8;
changePointY[changePointNum]=headY/8;
changePointSign[changePointNum]=canpassSign;
changePointNum++;
}
}
elseif((keyState&UP_PRESSED)!
=0){
canpassSign=2;
if(headMoveSign-canpassSign!
=-2){
headMoveSign=canpassSign;
changePointX[changePointNum]=headX/8;
changePointY[changePointNum]=headY/8;
changePointSign[changePointNum]=canpassSign;
changePointNum++;
}
}
elseif((keyState&LEFT_PRESSED)!
=0){
canpassSign=3;
if(headMoveSign-canpassSign!
=-2){
headMoveSign=canpassSign;
changePointX[changePointNum]=headX/8;
changePointY[changePointNum]=headY/8;
changePointSign[changePointNum]=canpassSign;
changePointNum++;
}
}
}
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;ichangePointX[i]=changePointX[i+1];
changePointY[i]=changePointY[i+1];
changePointSign[i]=changePointSign[i+1];
}
changePointNum--;
}
}
elseif(bodyMoveSign==1){
if(img.headSprite.collidesWith(img.foodSprite,true)){
setfood();
}
else{
x++;
}
if(x>16){
x=1;
}
map.mBackground.setCell(x,y-4,0);
if(x==changePointX[0]&y-4==changePointY[0]){
bodyMoveSign=changePointSign[0];
for(inti=0;ichangePointX[i]=changePointX[i+1];
changePointY[i]=changePointY[i+1];
changePointSign[i]=changePointSign[i+1];
}
changePointNum--;
}
}
elseif(bodyMoveSign==2){
if(img.headSprite.collidesWith(img.foodSprite,true)){
setfood();
}
else{
y--;
}
if(y<5){
y=20;
}
map.mBackground.setCell(x,y-4,0);
if(x==changePointX[0]&y-4==changePointY[0]){
bodyMoveSign=changePointSign[0];
for(inti=0;ichangePointX[i]=changePointX[i+1];
changePointY[i]=changePointY[i+1];
changePointSign[i]=changePointSign[i+1];
}
changePointNum--;
}
}
elseif(bodyMoveSign==3){
if(img.headSprite.collidesWith(img.foodSprite,true)){
setfood();
}
else{
x--;
}
if(x<1){
x=16;
}
map.mBackground.setCell(x,y-4,0);
if(x==changePointX[0]&y-4==changePointY[0]){
bodyMoveSign=changePointSign[0];
for(inti=0;ichangePointX[i]=changePointX[i+1];
changePointY[i]=changePointY[i+1];
changePointSign[i]=changePointSign[i+1];
}
changePointNum--;
}
}
}
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.