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