j2m推箱子设计论文.docx

上传人:b****6 文档编号:9273919 上传时间:2023-02-03 格式:DOCX 页数:30 大小:124.77KB
下载 相关 举报
j2m推箱子设计论文.docx_第1页
第1页 / 共30页
j2m推箱子设计论文.docx_第2页
第2页 / 共30页
j2m推箱子设计论文.docx_第3页
第3页 / 共30页
j2m推箱子设计论文.docx_第4页
第4页 / 共30页
j2m推箱子设计论文.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

j2m推箱子设计论文.docx

《j2m推箱子设计论文.docx》由会员分享,可在线阅读,更多相关《j2m推箱子设计论文.docx(30页珍藏版)》请在冰豆网上搜索。

j2m推箱子设计论文.docx

j2m推箱子设计论文

《面向对象程序设计II》

-—J2ME

课程设计论文

 

题目:

推箱子

学院:

计算机与信息工程学院

专业:

计算机科学与技术

班级:

计算机06-7班

姓名:

Xxxx

学号:

08

起止时间:

2008.12.21--2008.12.31

成绩:

 

课程设计任务书

一、设计题目:

《推箱子》

二、设计内容:

当大多数的人还将眼神停留在短信和彩铃上的时候,手机遇上游戏的际遇也在演绎它的精彩。

“推箱子”就是其中之一,本设计针对推箱子实现了新游戏,选关,恭喜过关,继续或重玩等过程。

可以清楚的演示各个画面的切换和一些游戏开发的类库。

三、设计要求:

1、开始显示初始化游戏界面,主界面显示各种键的功能以及菜单-新游戏和选关。

2、开始玩游戏,如果赢了可进入下一关或重来。

采用确定和取消来实现以上功能。

3、如果选关,则出现选关界面,按确定开始选关,取消则返回初始化界面。

四、工作计划:

时间

完成内容

提交文档

备注

第1天

查找资料,确定题目,选择方案

课程设计任务书

设计准备阶段

第2天

第3天

题目分析,设计算法

算法描述

设计阶段

第4天

功能模块的划分和设计

结构流程图等

第5天

第6天

实现具体数据结构和模块

第7天

程序设计与调试

运行并验证程序功能

第8天

第9天

检查程序

第10天

整理材料,撰写论文

课程设计论文

指导教师:

王艳涛

教研室主任:

2008年12月31日

摘要

J2ME平台被认为是最杰出的手机游戏平台,它为开发者、设备制造商、网络通信公司和消费者广泛接受。

它有一些非常重要的特征对所有组织都有益。

因为J2ME应用在不同设备上都是便携式的,他们常常可在网络上下载和执行。

本设计通过Canvas或gameCanvas才能画到屏幕上,通过他们以及各种类库来进行设计推箱子游戏,最后编程实现了全过程。

关键词:

J2ME面向对象CanvasgameCanvas推箱子

1设计内容

当大多数的人还将眼神停留在短信和彩铃上的时候,手机遇上游戏的际遇也在演绎它的精彩。

“推箱子”就是其中之一,本设计针对推箱子实现了新游戏,选关,恭喜过关,继续或重玩等过程。

可以清楚的演示各个画面的切换和一些游戏开发的类库。

2设计过程

2.1设计方案的论证

2.1.1设计方法

MIDlet的生命周期存在的三种状态,包括Paused、Active以及Destroyed,每一个MIDlet在任何时刻只可能处于其中的一个状态。

这三种状态的转换关系如图所示:

 

keyPressed():

获得按键值 ;paint():

来画图 ;线程run():

来实现刷屏幕等等;protected voidkeyPressed(int keyCode):

按下某个键;

protected voidkeyReleased(int keyCode):

释放某个键;

protected voidkeyRepeated(int keyCode):

一直按某个键;

键的代码由常量决定,特殊键被认为是游戏键,需要转为游戏键才能进行判断:

getGameAction(int keyCode);getKeyCode(int gameAction),映射关系为:

上下左右和手机上的上下左右键一致,GAME_A,B,C,D分别对应1,3,7,9键Canvas和gameCanvas两个都是画布类,是可以在手机屏幕上显示东西,gameCanvas加入了双缓冲等一些特性便于程序员简化游戏的编程。

Graphics是图像类,作用是让你绘制图像,但是绘制的图像是不能直接显示的。

2.1.2设计背景

首先,一定要有个主应用程序类,相信大家都应改知道;其次,不可避免,一定要有画布,为了把程序的画面呈现出来;其中,我觉得还是把地图跟画布分开,这样对地图管理比较容易,而且增加或修改地图比较方便;然后一定要有主角对吧,总要找个推箱子的人;说到箱子,也许箱子也需要管理吧。

先抛开箱子(BoxSprite)和推箱子的人(PlayerSprite)两个类,把全部经历集中到绘制地图上(其实不过是第一幅地图)。

  这其中需要先了解几个类,GameCanvas、LayerManager和TiledLayer等几个类。

我们这里主要用TiledLayer这种方法构造背景。

  GameCanvas类:

GameCanvas实际上就是屏幕上一个可绘制区域。

但每个GameCanvas类都有一个独立的buffer,从而不但减少了堆的使用率,也可以使用单独的堆控制程序。

  LayerManager类:

这个类用来管理图像的各个层,它将按正确的位置和次序渲染所有在它控制下的土层。

  TiledLayer类:

通过使用这个函数可以定义游戏背景的特定区域,并且可以重复利用它们生成一个完整的图像。

2.1.3设计细节

我们要做的是让一个小人推箱子,操作方法就是通过四方向键对松鼠进行上,下,左,右的移动。

操作很简单,就是四方向移动,小人移动,箱子也移动,所以对按键处理也比较简单些。

当箱子到达某个位置时,就会产生游戏过关事件。

需要一个逻辑判断。

那么我们仔细想一下,这些所有的事件都发生在一张地图中。

这张地图就包括了箱子的初始化位置,箱子最终放置的位置,和障碍等。

每一关地图都要更换。

这些位置也要变。

所以我们发现每关的地图数据是最关键的。

它决定了每关的不同场景和物体位置。

现如下流程图进行说明:

 

图2程序流程图

2.2概要设计

本程序共AllMap.java,Continue.java,GameChoose.java,GameMain.java,GameMidlet.java,ImageAction.java,Map.java6个java源文件:

AllMap.java:

设计了所有推箱子的地图数组;

Continue.java:

游戏是否继续;

GameChoose.java:

选关;

GameMain.java:

主游戏进入游戏状态;

GameMidlet.java:

该文件是MIDlet父类的子类;

ImageAction.java;图片运行及显示;

Map.java:

设置地图长,宽,高等参数及游戏角色;

2.3界面设计图

(1)开始显示初始化游戏界面,主界面显示各种键的功能以及菜单-新游戏和选关。

(如图3所示)

(2)如果选关,则出现选关界面,按确定开始选关,进入游戏界面,取消则返回初始化界面。

(如图4所示)

(3)开始玩游戏,如果赢了可进入下一关或重来。

采用确定和取消来实现以上功能。

(如图5、图6所示)

 

图3初始化界面图4选关界面

图5开始游戏界面图6过关出现的界面

图7系统结构框图

2.4代码实现

/*

*GameMidlet.java

*/

packagegamepackage;

importjavax.microedition.midlet.*;

importjavax.microedition.lcdui.*;

publicclassGameMidletextendsMIDlet{

//继承MIDlet类的GameMidlet

privateDisplaydisplay=null;

privateGameChoosechoice=null;

publicGameMidlet(){

choice=newGameChoose(this);

display=Display.getDisplay(this);

//要使组件能在屏幕上显示

}

publicvoidstartApp(){

//

display.setCurrent(choice);//把choice设置为当前界面

}

publicvoidpauseApp(){

//暂停

}

publicvoidplay(Displayabledisplayable){

display.setCurrent(displayable);//把displayable设置为当前界面

}

publicvoiddestroyApp(booleanunconditional){//销毁}}

代码实现的过程步骤如下:

1.确定软件的功能:

让玩家通过按上下左右键推箱子。

2.定义软件的核心数据结构:

我们定义一个二维数组来记录屏幕上各点的状态。

  

3.对整个软件进行功能模块划分。

(1)初始化:

在屏幕上输出初始画界面,把数组的元素初始化为0。

并根据各关的要求在屏幕上输出墙、箱子、目的地和人。

并用数组记录各点的状态。

(2)进入游戏循环:

这个游戏主循环是等待按键。

当接受到上下左右键时执行相关操作:

接受键1时退出游戏;按回车进入游戏。

(3)判断是否过关:

用一个链表把每关的初始化函数传给Gamemain函数。

链表主要记录屏幕上的哪些点是目的地,并记录目的地的位置。

Gamemain函数每执行一次操作后就判断屏幕上的目的地是不是都有箱子了。

3设计总结

在本次编程过程中,自己做了很多工作,可以说像自己的孩子一样,很辛苦但是很甜蜜。

推箱子游戏有不足之处:

没有实现撤销功能—就是说在意识到自己放错位置之后,不能返回了,而且只有过关才能选择继续或重玩,输了就不能重玩。

这是本次设计的遗憾之处,但是通过本次设计,对j2me有了更深层次的理解和认识。

对其中的很多类库以及很多方法都更为了解与掌握了。

苦中有甜,总之收益非浅、收益良多,在同学的帮助下才能够顺利的编程工作才得以如期完成,我以后会好好学习的,让今天所学的深深印在脑海中,会更加的使自己更完善的理解知识,谢谢老师!

参考文献

[1]崔尚志.Mobile手机应用开发.机械工业出版社.1989:

60-98

[2]张强,陆文华.J2ME手机开发入门.1993,29(6):

263-268

[3]王梦瑶.WindowsMobile平台应用与开发.清华大学出版社.1992:

8-13

[4]J.R.McDnonell,D.Wagen.EvolvingRecurrentPercepptionsTimeModeling.IEEETrans.onNeuralNetwoks.1994,5

(1):

24-38

附录:

程序源代码

/*

*GameMidlet.java

*/

packagegamepackage;

importjavax.microedition.midlet.*;

importjavax.microedition.lcdui.*;

publicclassGameMidletextendsMIDlet{

privateDisplaydisplay=null;

privateGameChoosechoice=null;

publicGameMidlet(){

choice=newGameChoose(this);

display=Display.getDisplay(this);}

publicvoidstartApp(){

display.setCurrent(choice);}

publicvoidpauseApp(){}

publicvoidplay(Displayabledisplayable){

display.setCurrent(displayable);}

publicvoiddestroyApp(booleanunconditional){}

/*GameMain.java

*/

packagegamepackage;

importjavax.microedition.lcdui.*;

importjavax.microedition.lcdui.game.*;

publicclassGameMainextendsGameCanvasimplementsRunnable{

privatebooleanrunningFlag=true;

privatebooleancancel=false;

privateintindex;

privateGameChoosechoice=null;

privateMapmap;

privateGraphicsg;

privateContinuecon;

publicGameMain(GameChoosechoice){

this(choice,0);}

publicGameMain(GameChoosechoice,intindex){

super(false);

g=getGraphics();

map=newMap(this,g,index);

this.choice=choice;

this.index=index;

con=newContinue();}

publicvoidstop(){

runningFlag=false;}

publicvoidcommandAction(Commandcmd,Displayabledisplayable){

publicvoidstart(){

Threadthread=newThread(this);

thread.start();}

publicvoidkeyPressed(intkeyCode){

intkey=getGameAction(keyCode);

if(map.isFinish()){

switch(key){

caseGameCanvas.LEFT:

caseGameCanvas.RIGHT:

if(con.ok==true){

con.ok=false;

}else

{con.ok=true;}

break;

caseGameCanvas.FIRE:

if(con.ok==true){

index++;

if(index==42){

index=0;}}

con.ok=true;

map.initMap(index);

break;

default:

if(keyCode==-7){

stop()}}

}else{

if(cancel==false){

switch(key){

caseGameCanvas.DOWN:

map.getKey(3);

break;

caseGameCanvas.UP:

map.getKey

(1);

break;

caseGameCanvas.LEFT:

map.getKey

(2);

break;

caseGameCanvas.RIGHT:

map.getKey(4);

break;

default:

switch(keyCode){

case49:

index--;

if(index==-1){

index=41;}

map.initMap(index);

break;

case51:

index++;

if(index==42){

index=0;}

map.initMap(index);

break;

case-7:

cancel=true;

break;}}

}else{

switch(key){

caseGameCanvas.LEFT:

caseGameCanvas.RIGHT:

if(con.ok2==true){

con.ok2=false;

}else{

con.ok2=true;}

break;

caseGameCanvas.FIRE:

if(con.ok2==true){

stop();

}else{

cancel=false;}

con.ok2=true;

break;}}}}

privatevoidsetBackground(){

g.setColor(0x6A4055);

g.fillRect(0,0,getWidth(),getHeight());

g.setColor(0xF89433);

g.drawLine(0,20,getWidth(),20);

g.drawString("你正在攻克第"+(index+1)+"关",getWidth()/2,18,Graphics.HCENTER|Graphics.BOTTOM);

g.drawRect(0,0,getWidth()-2,getHeight()-3);

g.drawRect(1,1,getWidth()-3,getHeight()-4);}

publicvoidrun(){

while(runningFlag){

if(map.isFinish()){

con.paint(g);

}else{

if(cancel==false){

setBackground();

map.paint();

}else{

con.paint1(g);}}

flushGraphics();

try{

Thread.sleep(100);

}catch(InterruptedExceptione){

e.printStackTrace();}}

choice.init();

choice.show();}}

/*

*GameChoose.java

*/

packagegamepackage;

importjavax.microedition.lcdui.*;

publicclassGameChooseextendsCanvas{

privateGameMidletmidlet=null;

privatebooleanok;

privatebooleanselect;

privatebooleanok2;

privateintselect2;

privateintindex;

privateintw,h;

privateGameMaingame=null;

publicGameChoose(GameMidletmidlet){

this.midlet=midlet;

init();}

publicvoidinit(){

reset();}

publicvoidreset(){

ok=true;

select=false;

ok2=false;

select2=0;

index=-1;}

publicvoidshow(){

midlet.play(this);}

publicvoidpaint(Graphicsg){

h=getHeight();

w=getWidth();

g.setColor(0xffffff);

g.fillRect(0,0,w,h);

g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_MEDIUM));

g.setColor(0xFCA204);

g.fillRect(0,0,w,18);

g.setColor(0x000000);

g.drawLine(0,18,w,18);

g.drawString("推箱子",w/2,16,Graphics.HCENTER|Graphics.BOTTOM);

g.drawString("8↑2↓4←6→",w/2,50,Graphics.HCENTER|Graphics.BOTTOM);

g.drawString("右上按钮退出",w/2,70,Graphics.HCENTER|Graphics.BOTTOM);

g.drawString("1上一关节3下一关",w/2,90,Graphics.HCENTER|Graphics.BOTTOM);

g.setColor(0x046DFB);

g.fillRect(0,h-22,w,22);

g.setColor(0x000000);

g.drawLine(0,h-22,w,h-22);

g.fillTriangle(3,h-11,11,h-15,11,h-7);

g.fillTriangle(w-3,h-11,w-11,h-15,w-11,h-7);

if(ok){

g.setColor(0x0452BC);

g.fillRect(14,h-22,w/2-14,22);

g.setColor(0xffffff);

g.drawString("新游戏",w/4+7,h-3,Graphics.HCENTER|Graphics.BOTTOM);

g.setColor(0x000000);

g.drawString("选关",3*w/4-7,h-3,Graphics.HCENTER|Graphics.BOTTOM);

}else{

g.setColor(0x0452BC);

g.fillRect(w/2,h-22,w/2-14,22);

g.setColor(0x000000);

g.drawString("新游戏",w/4+7,h-3,Graphics.HCENTER|Graphics.BOTTOM);

g.setColor(0xffffff);

g.drawString("选关",3*w/4-7,h-3,Graphics.HCENTER|Graphics.BOTTOM);

}

if(select==true){

g.setColor(0xffffff);

g.fillRect(25,40,130,100);

g.setColor(0x046DFB);

g.fillRect(27,118,126,20);

g.setColor(0xFFA800);

g.drawRect(25,40,130,100);

g.setColor(0xFFA800);

g.drawRect(27,42,126,96);

g.setColor(0x000000);

g.fillTriangle(30,128,36,125,36,131);

g.fillTriangle(150,128,146,125,146,131);

g.setColor(0x000000);

g.drawString("选关",60,80,Graphics.HCENTER|Graphics.BOTTOM);

g.drawString("(1~40)",60,100,Graphics.HCENTER|Graphics.BOTTOM);g.set

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 远程网络教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1