java推箱子实验报告.docx
- 文档编号:26565292
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:24
- 大小:29.51KB
java推箱子实验报告.docx
《java推箱子实验报告.docx》由会员分享,可在线阅读,更多相关《java推箱子实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
java推箱子实验报告
Java设计报告
1.1设计背景:
经典的推箱子游戏是一个来自日本的古老游戏,目的是在训练逻辑思考能力。
在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。
一想起这款小游戏,就想起了我的童年,它陪我们这一代度过了一段美好且愉快的时光。
所以想到自己也写一个推箱子游戏,既可以享受过去的美好回忆,又可以锻炼自己的Java设计能力。
1.2设计目的:
综合运用在校期间所学到的理论知识和技能,并且结合课外参考资料,设计开发基于JAVA的推箱子小游戏,让自己能够熟悉并熟练应用系统的开发过程,培养独立思考能力,检验学习成果和实际动手能力,以及提高工程实践能力,为今后的工作打下坚实的根底。
1.3游戏需求:
玩家是通过对小人的移动操作来控制推动箱子的,并且玩家需要避过障碍物以及死角,才能将其推放到指定位置从而到达过关的目的。
如果玩家将箱子推入死角导致箱子无法移动或不能移动到指定位置那么闯关失败,可以通过悔步或重新开场等操作来重新挑战本关。
游戏功能需求如下所示:
游戏界面需求:
简洁美观的用户界面,可以带给用户自然清晰的画面。
游戏容需求:
:
小人需要前、后、左、右四图片,移动中的箱子与终点上的箱子要所有区别,因此需要两不同的图片以示区别。
键盘处理事件:
控制小人与箱子的移动,可通过键盘方向键〔上、下、左、右键〕对小人进展上、下、左、右的移动,并且能够推动箱子。
显示需求:
当所有箱子都到达指定位置后即可过关,假设进入死角那么无法过关,需要进展悔步或重新开场的操作。
可以由玩家喜欢选择关卡进展游戏。
2.1游戏设计分析
从面向对象的观念出发,本程序可分为以下几个对象:
地图文件的引用 小人与箱子的移动 程序运算逻辑 绘图显示平台
分析对象的技巧在于它的重复利用及维护效率。
如果要把设计出来的程序在不同的显示平台上执行,就要作大幅度的更动甚至重写,这样就失去了面向对象属性,所以在本程序分析时将不变与易变的因素分别做成对象,如地图文件、小人与箱子的移动以及程序的运算逻辑就是不变的工程,而绘图及显示平台会因为环境而有所不同属于易变的工程。
2.2.1.地图文件的引用
在设计游戏程序时,通常都是把游戏的画面布局数据存放在一个地图文件中。
程序通过读取地图文件中的数据来获取画面的布局安排。
地图文件是20*20的变量数组文件,在地图不同的数字代表不同的意义。
把这组数据保存到一个文件中,这个文件就是地图文件了。
2.2.2.程序运逻辑
程序中逻辑运算包含小人与箱子的移动、键盘事件的响应、保存数据以实现悔步以及重新开场的操作等等。
2.2.3.绘图
绘图主要是用于在小人与箱子的移动后,原位置由草地填补,以此来表示小人与箱子的移动以及其画面的连贯性。
2.2.4.显示平台
"可移植性高〞是Java的属性之一,Java的应用涉及许多领域,如手机、单机程序及浏览器等,不同的平台对于它的设定不尽一样,假设将显示平台独立为一个类,将有助于主程序的完整性及移植程序的快速性。
3.详细设计
界面图如下:
〔1〕界面框架与按钮设计
界面设计中包括了所有玩家可以直观见到的图形界面,窗体的大小,界面中的功能按钮,让玩家可以方便使用操作。
界面中的按钮包括:
"Regretstep〞,"Restart〞,"Thelastlevel〞,"Thenextlevel〞,"Thefirstpass〞,"Select〞。
并且各个按钮的名称与相关功能为:
"Regretstep〞:
返回上一移动状态〔可以连续返回多步〕;
"Restart〞:
重新开场当前关;
"Thelastlevel〞:
返回到当前关的上一关;"Thenextlevel〞:
跳转到当前关的下一关;
"Thefirstpass〞:
游戏系统默认开场关为第一关,此按钮让玩家可以方便从其它关卡直接跳转到第一关;
"Select〞:
选择想要挑战的关卡。
publicclassTuixiangzi
{
publicstaticvoidmain(String[]args)
{
newmainFrame();
}
}
classmainFrameextendsJFrameimplementsActionListener,ItemListener
{
JLabellb;
JLabellb2;
uttonbtnrenew,btnlast,btnnext,btnchoose,btnfirst,btnover,btnmuc,btnback;
mainpanelpanel;
Soundsound;
oBoxjc=newoBox();
MenuItemrenew=newMenuItem("Restart");
MenuItemback=newMenuItem("Regretstep");
MenuItemlast=newMenuItem("Thelastlevel");
MenuItemnext=newMenuItem("Thenextlevel");
MenuItemchoose=newMenuItem("选关");
MenuItemexit=newMenuItem("退出");
MenuItemqin=newMenuItem("1");
MenuItempo=newMenuItem("2");
MenuItemguang=newMenuItem("3");
MenuItemnor=newMenuItem("默认");
MenuItemeye=newMenuItem("4");
MenuItemabout=newMenuItem("关于推箱子...");
mainFrame()
{
super("推箱子v2.0");
setSize(720,720);
setVisible(true);
setResizable(false);
setLocation(300,20);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Containercont=getContentPane();
cont.setLayout(null);
cont.setBackground(Color.black);
Menuchoice=newMenu("选项");choice.add(renew);choice.add(last);choice.add(next);choice.add(choose);choice.add(back);
choice.addSeparator();choice.add(exit);
renew.addActionListener(this);
last.addActionListener(this);
next.addActionListener(this);
choose.addActionListener(this);
exit.addActionListener(this);
back.addActionListener(this);
Menusetmuc=newMenu("设置音乐");
setmuc.add(nor);setmuc.add(qin);setmuc.add(po);setmuc.add(guang);setmuc.add(eye);
nor.addActionListener(this);
qin.addActionListener(this);
po.addActionListener(this);
guang.addActionListener(this);
eye.addActionListener(this);
Menuhelp=newMenu("帮助");
help.add(about);
about.addActionListener(this);
MenuBarbar=newMenuBar();
bar.add(choice);bar.add(setmuc);bar.add(help);
setMenuBar(bar);
nor.setEnabled(false);
lb=newJLabel("JAVA推箱子v2.0版!
!
!
",SwingConstants.CENTER);
lb2=newJLabel("更换音乐",SwingConstants.CENTER);
add(lb);add(lb2);
lb.setBounds(100,20,400,20);
lb.setForeground(Color.white);
lb2.setBounds(625,500,55,20);
lb2.setForeground(Color.white);
btnrenew=newutton("Restart");
btnback=newutton("Regretstep");
btnlast=newutton("Thelastlevel");
btnnext=newutton("Thenextlevel");
btnchoose=newutton("选关");
btnfirst=newutton("Thefirstpass");
btnover=newutton("Thefinalclosing");
btnmuc=newutton("Themusic");
add(btnrenew);add(btnlast);add(btnnext);add(btnchoose);add(btnfirst);add(btnover);add(btnmuc);add(btnback);
btnrenew.setBounds(625,100,80,30);
btnrenew.addActionListener(this);
btnback.setBounds(625,150,80,30);
btnback.addActionListener(this);
btnfirst.setBounds(625,200,80,30);
btnfirst.addActionListener(this);
btnlast.setBounds(625,250,80,30);
btnlast.addActionListener(this);
btnnext.setBounds(625,300,80,30);
btnnext.addActionListener(this);
btnover.setBounds(625,350,80,30);
btnover.addActionListener(this);
btnchoose.setBounds(625,400,80,30);
btnchoose.addActionListener(this);
btnmuc.setBounds(625,450,80,30);
btnmuc.addActionListener(this);
jc.setBounds(625,530,80,20);
jc.addItem("默认");
jc.addItem("1");
jc.addItem("2");
jc.addItem("3");
jc.addItem("4");
jc.addItemListener(this);
cont.add(jc);
sound=newSound();
sound.loadSound();
panel=newmainpanel();
add(panel);
panel.Tuixiangzi(panel.level);
panel.requestFocus();
validate();
}
〔2〕地图的绘制形成
地图以二维数组的形式进展存储,不同的数家代表了不同的含义。
在本小游戏的地图文件中,0~9这十个数字的定义如下所示:
编号0:
代表未定义的区域;
编号1:
代表障碍物〔或者边界〕;
编号2:
代表草地;
编号3:
代表箱子〔未到指定位置〕;
编号4:
代表目的地;
编号5:
代表小人向下移动方向;
编号6:
代表小人向左移动方向;
编号7:
代表小人向右移动方向;
编号8:
代表小人向上移动方向;
编号9:
代表到达指定位置时的箱子。
以下列图为数字对应的实际界面
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000011100000000
00000000014100000000
00000011113100000000
00000014235111000000
00000011132341000000
00000000121111000000
00000000141000000000
00000000111000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
000
〔3〕推箱子小游戏的游戏性
其主要功能是给用户一个良好的游戏界面,游戏中包括50关的地图文件。
地图文件是是先写好的,所有界面信息以数家的形式存放在一个20*20的二维数组当中并且把这些地图文件统一放在一个地图文件中,便于程序调用地图文件。
然后,每一关就会按照这些数组数据重新绘制地图,从而到达小游戏的可用性及其相应的目的。
〔4〕小人与箱子移动的算法
小人与箱子的移动中包括了正移动以及"Regretstep〞的负移动。
正移动:
小人向上、下、左、右的移动是一个判断算法,其判断都是通过判断小人前面是否是草地或者是箱子亦或者是障碍物〔或者边界〕。
如果是障碍物或者是边界,就不能够进展移动;如果是没有箱子或者是障碍物,就可以自由移动;又如果是有箱子,就要判断是否可以移动箱子,最后再讨论箱子被推过的位置,小人移动的位置,以及它们的原位置和被遮挡住的新位置的图形变化等等,需要运用算法使其重新绘制地图,填补空白。
算法判断完毕后,传出数据并且将其记录在一个堆栈中,以备"Regretstep〞时使用。
负移动:
通过记录在堆栈中的数据来判断,前一步小人的移动方向以及移动中使用过的算法,逆向将代码重新运行,同时绘制并刷新地图以到达前一步的状态。
voidmoveup()
{
if(map[manY-1][manX]==2||map[manY-1][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
elsemap[manY][manX]=2;
map[manY-1][manX]=8;
repaint();manY--;mystack.push(10);
}
elseif(map[manY-1][manX]==3)
{
if(map[manY-2][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
elsemap[manY][manX]=2;
map[manY-1][manX]=8;
map[manY-2][manX]=9;
repaint();manY--;mystack.push(11);
}
elseif(map[manY-2][manX]==2)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
elsemap[manY][manX]=2;
map[manY-1][manX]=8;
map[manY-2][manX]=3;
repaint();manY--;mystack.push(11);
}
else{map[manY][manX]=8;repaint();}
}
elseif(map[manY-1][manX]==9)
{
if(map[manY-2][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
elsemap[manY][manX]=2;
map[manY-1][manX]=8;
map[manY-2][manX]=9;
repaint();manY--;mystack.push(11);
}
elseif(map[manY-2][manX]==2)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
elsemap[manY][manX]=2;
map[manY-1][manX]=8;
map[manY-2][manX]=3;
repaint();manY--;mystack.push(11);
}
else{map[manY][manX]=8;repaint();}
}
if(map[manY-1][manX]==1)
{
map[manY][manX]=8;repaint();
}
}
voidbackup(intt)
{
intn=t;
if(n==10)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
{
map[manY][manX]=4;
}
elsemap[manY][manX]=2;
}
elseif(n==11)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
{
map[manY][manX]=9;
}
elsemap[manY][manX]=3;
if(maptmp[manY-1][manX]==4||maptmp[manY-1][manX]==9)
{
map[manY-1][manX]=4;
}
elsemap[manY-1][manX]=2;
}
map[manY+1][manX]=8;
repaint();manY++;
}
voidmovedown()
{
if(map[manY+1][manX]==2||map[manY+1][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
elsemap[manY][manX]=2;
map[manY+1][manX]=5;
repaint();manY++;mystack.push(20);
}
elseif(map[manY+1][manX]==3)
{
if(map[manY+2][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
elsemap[manY][manX]=2;
map[manY+1][manX]=5;
map[manY+2][manX]=9;
repaint();manY++;mystack.push(21);
}
elseif(map[manY+2][manX]==2)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
elsemap[manY][manX]=2;
map[manY+1][manX]=5;
map[manY+2][manX]=3;
repaint();manY++;mystack.push(21);
}
else{map[manY][manX]=5;repaint();}
}
elseif(map[manY+1][manX]==9)
{
if(map[manY+2][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
elsemap[manY][manX]=2;
map[manY+1][manX]=5;
map[manY+2][manX]=9;
repaint();manY++;mystack.push(21);
}
elseif(map[manY+2][manX]==2)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
elsemap[manY][manX]=2;
map[manY+1][manX]=5;
map[manY+2][manX]=3;
repaint();manY++;mystack.push(21);
}
else{map[manY][manX]=5;repaint();}
}
elseif(map[manY+1][manX]==1)
{
map[manY][manX]=5;repaint();
}
}
voidbackdown(intt)
{
intn=t;
if(n==20)
{
if(maptmp[manY][manX]==4||maptm
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 箱子 实验 报告