admin管理员组文章数量:1567042
2024年1月13日发(作者:)
精品文档
Java设计报告
1.1设计背景:
经典的推箱子游戏是一个来自日本的古老游戏, 目的是在训练逻辑思考能力。 在一个狭
小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住 的情况,所以需要巧妙的利用有限的空间和通道, 合理安排移动的次序和位置,才能顺利的 完成任i欢迎下载
精品文档
务。 一想起这款小游戏,就想起了我的童年,它陪我们这一代度过了一段美好且愉
快的时光。所以想到自己也写一个推箱子游戏,
己的Java设计能力。
既可以享受过去的美好回忆, 又可以锻炼自
1.2设计目的:
综合运用在校期间所学到的理论知识和技能,并且结合课外参考资料,设计开发基于
的推箱子小游戏,让自己能够熟悉并熟练应用系统的开发过程,
JAVA
培养独立思考能力, 检验学
习成果和实际动手能力,以及提高工程实践能力,为今后的工作打下坚实的基础。
1.3游戏需求:
玩家是通过对小人的移动操作来控制推动箱子的,
将其推放到指定位置从而达到过关的目的。
并且玩家需要避过障碍物以及死角, 才能
如果玩家将箱子推入死角导致箱子无法移动或不
能移动到指定位置则闯关失败,可以通过悔步或重新开始等操作来重新挑战本关。
游戏功能需求如下所示:
游戏界面需求:简洁美观的用户界面,可以带给用户自然清晰的画面。
游戏内容需求::小人需要前、后、左、右四张图片,移动中的箱子与终点上的箱子要所有区 别,因此需要两不同的图片以示区别。
键盘处理事件:控制小人与箱子的移动,可通过键盘方向键(上、下、左、右键)对小人进 行上、下、左、右的移动,并且能够推动箱子。
显示需求:当所有箱子都到达指定位置后即可过关,若进入死角则无法过关,需要进行悔步 或重新开始的操作。可以由玩家喜欢选择关卡进行游戏。
2.1游戏设计分析
从面向对象的观念出发,本程序可分为以下几个对象:
地图文件的引用 小人与箱子的移动 程序运算逻辑 绘图 显示平台
分析对象的技巧在于它的重复利用及维护效率。
上执行,就要作大幅度的更动甚至重写,
将不变与易变的因素分别做成对象,
如果要把设计出来的程序在不同的显示平台
这样就失去了面向对象属性,所以在本程序分析时
如地图文件、小人与箱子的移动以及程序的运算逻辑就
是不变的项目,而绘图及显示平台会因为环境而有所不同属于易变的项目。
2.2.1. 地图文件的引用
在设计游戏程序时,通常都是把游戏的画面布局数据存放在一个地图文件中。
地图文件中的数据来获取画面的布局安排。
地图文件是20*20的变量数组文件,在地图不同的数字代表不同的意义。
一个文件中,这个文件就是地图文件了。
把这组数据保存到
程序通过读取
2.2.2. 程序运逻辑
程序中逻辑运算包含小人与箱子的移动、
始的操作等等。
键盘事件的响应、保存数据以实现悔步以及重新开
2欢迎下载
精品文档
2.2.3. 绘图
绘图主要是用于在小人与箱子的移动后,
以及其画面的连贯性。
原位置由草地填补,以此来表示小人与箱子的移动
2.24显示平台
“可移植性高”是 Java的属性之一,Java的应用涉及许多领域,如手机、单机程序及浏览 器等,不同的平台对于它的设定不尽相同,
完整性及移植程序的快速性。
若将显示平台独立为一个类, 将有助于主程序的
3•详细设计
界面图如下:
(1)界面框架与按钮设计
界面设计中包括了所有玩家可以直观见到的图形界面, 窗体的大小,界面中的功能按钮, 让
玩家可以方便使用操作。 界面中的按钮包括:“Regret step ",“Restart ",“The last level ”,
3欢迎下载
精品文档
“The next level ”,“The first pass”,“Select ”。并且各个按钮的名称与相关功能为:
“Regret step ”:返回上一移动状态(可以连续返回多步)
“Restart ”:重新开始当前关;
“The last level ”:返回到当前关的上一关; “The next level ”:跳转到当前关的下一 关;
“The first pass ”:游戏系统默认开始关为第一关,此按钮让玩家可以方便从其它关卡直
接跳转到第一关;
“Select ”:选择想要挑战的关卡。
;
public class Tuixiangzi
{
public static void main(String[] args)
{
newmainFrame();
}
}
class mainFrame extends JFrame implements ActionListener,ltemListener
{
JLabel lb;
JLabel Ib2;
JButton btnrenew,btnlast,btnnext,btnchoose,btnfirst,btnover,btnmuc,btnback;
mainpanel panel;
Sound sound;
JComboBox jc= newJComboBox();
MenuItem renew= new Menuitem(” Restart");
MenuItem back= newMenultem(” Regret step");
Menuitem last= newMenultem(” The last level");
Menuitem next= newMenultem(” The next level");
Menuitem choose= new Menultem(" 选关");
Menuitem exit= newMenultem(" 退出");
Menultem qin= newMenultem(" 1");
Menuitem po= new Menultem(" 2");
Menuitem guang= new Menuitem(" 3");
Menuitem nor= newMenuitem(" 默认");
Menuitem eye= newMenuitem(" 4");
Menuitem about= new Menuitem(" 关于推箱子...");
mainFrame()
{
super ("推箱子 v2.0");
setSize(720,720);
setVisible( true );
setResizable( false );
setLocation(300,20);
setDefaultCloseOperation(JFrame.
Container cont=getContentPane();
out( null );
EXlT_ON_CLC)SE
4欢迎下载
精品文档
kground(Color.
black);
Menu choice= newMenu(” 选项");
(renew);(last);(next);(choose);(back)
J
arator();(exit);
ionListener( this );
ionListener(
ionListener(
this );
this );
ionListener( this );
ionListener(
ionListener(
Menu setmuc= newMenu("
this );
this );
设置音乐”);
(nor);(qin);(po);(guang);(eye);
ionListener(
ionListener(
this );
this );
ionListener( this );
ionListener( this );
ionListener( this );
Menu help= new Menu("
(about);
ionListener( this );
帮助");
MenuBar bar= newMenuBar();
(choice);(setmuc);(help);
setMenuBar(bar);
bled( false );
lb= new JLabel("JAVA 推箱子 v2.0 版!
! ! ",SwingConstants.
CENTER
lb2= newJLabel("更换音乐",SwingConstants.
CENTER
add(lb);add(lb2);
nds(100,20,400,20);
eground(Color.
white);
nds(625,500,55,20);
eground(Color.
white);
btnrenew= new JButton("Restart");
btnback= newJButton("Regret step");
btnlast= newJButton("The last level");
btnnext= newJButton("The next level");
btnchoose= new JButton(” 选关");
btnfirst= new JButton("The first pass");
btnover= newJButton("The final closing");
btnmuc=new JButton("The music");
add(btnrenew);add(btnlast);add(btnnext);add(btnchoose);add(btnfirst);add(btnover);add(b tnmuc);add(btnback);
nds(625,100,80,30);
ionListener( this ); nds(625,150,80,30);
ionListener( this ); nds(625,200,80,30); ionListener( this );
nds(625,250,80,30); ionListener( this ); nds(625,300,80,30);
5欢迎下载
精品文档
ionListener( this );
nds(625,350,80,30); ionListener( this );
nds(625,400,80,30); ionListener( this );
nds(625,450,80,30); ionListener( this ); nds(625,530,80,20);
m(” 默认"); m('T); m("2"); m("3"); m("4");
mListener( this ); (jc);
sound=new Sound(); sound .lo adSound(); panel= new mainpanel(); add(panel);
ngzi(); tFocus(); validate();
}
(2 )地图的绘制形成
地图以二维数组的形式进行存储, 0~9这不同的数家代表了不同的含义。
十个数字的定义如下所示: 编号0:代表未定义的区域;
编号1 :代表障碍物(或者边界)
编号2:代表草地;
编号3:代表箱子(未到指定位置)
编号4:代表目的地;
编号5:代表小人向下移动方向;
编号6:代表小人向左移动方向;
编号7:代表小人向右移动方向;6欢迎下载
在本小游戏的地图文件中,
精品文档
编号&代表小人向上移动方向; 编号9:代表到达指定位置时的箱子。
F图为数字对应的实际界面
00000000
00000000
00000000
00000000
00000000
00000000
00000000
11000000
41000000
11000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
88888888888888888888
(3 )推箱子小游戏的游戏性
其主要功能是给用户一个良好的游戏界面,游戏中包括
写好的,所有界面信息以数家的形式存放在一个
50关的地图文件。地图文件是是先
20*20的二维数组当中并且把这些地图文件
从屈jW! ! !
统一放在一个地图文件中, 便于程序调用地图文件。 然后,每一关就会按照这些数组数据重 新绘制地图,从而达到小游戏的可用性及其相应的目的。
(4 )小人与箱子移动的算法
小人与箱子的移动中包括了正移动以及" Regret step ”的负移动。
正移动:小人向上、下、左、右的移动是一个判断算法,其判断都是通过判断小人前面是否 是草地或者是箱子亦或者是障碍物(或者边界) 。如果是障碍物或者是边界,就不能够进行
又如果是有箱子,就要判断是否可 移动;如果是没有箱子或者是障碍物,就可以自由移动;
以移动箱子,最后再讨论箱子被推过的位置,
住的新位置的图形变化等等,
小人移动的位置, 以及它们的原位置和被遮挡
填补空白。算法判断完毕后, 需要运用算法使其重新绘制地图,
传出数据并且将其记录在一个堆栈中,以备" Regret step ”时使用。
负移动:通过记录在堆栈中的数据来判断, 前一步小人的移动方向以及移动中使用过的算法,
逆向将代码重新运行,同时绘制并刷新地图以达到前一步的状态。
void moveup()
{
if(map[manY-1][manX]==2||map[manY-1][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9) map[manY][manX]=4;
7欢迎下载
精品文档
else map[manY][manX]=2;
map[manY-1][manX]=8;
repaint();manY--;(10);
}
else if(map[manY-1][manX]==3)
{
if(map[manY-2][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9) map[manY][manX]=4;
else map[manY][manX]=2;
map[manY-1][manX]=8;
map[manY-2][manX]=9;
repaint();manY--;(11);
}
else if(map[manY-2][manX]==2)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9) map[manY][manX]=4;
else map[manY][manX]=2;
map[manY-1][manX]=8;
map[manY-2][manX]=3;
repaint();manY--;(11);
}
else {map[manY][manX]=8;repaint();}
}
else if(map[manY-1][manX]==9)
{
if(map[manY-2][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9) map[manY][manX]=4;
else map[manY][manX]=2;
map[manY-1][manX]=8;
map[manY-2][manX]=9;
repaint();manY--;(11);
}
else if(map[manY-2][manX]==2)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
else map[manY][manX]=2;
map[manY-1][manX]=8;
map[manY-2][manX]=3;
repaint();manY--;(11);
}
else {map[manY][manX]=8;repaint();}
8欢迎下载
精品文档
}
if(map[manY-1][manX]==1)
{
map[manY][manX]=8;repaint();
}
}
void backup(int t)
{
int n=t;
if(n==10)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
{
map[manY][manX]=4;
}
else map[manY][manX]=2;
}
else if(n==11)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
{
map[manY][manX]=9;
}
else map[manY][manX]=3;
if(maptmp[manY_1][manX]==4||maptmp[manY_1][manX]==9) {
map[manY-1][manX]=4;
}
else map[manY-1][manX]=2;
}
map[manY+1][manX]=8;
repaint();manY++;
}
void movedown()
{
if(map[manY+1][manX]==2||map[manY+1][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9) map[manY][manX]=4;
else map[manY][manX]=2;
map[manY+1][manX]=5;
repaint();manY++;(20);
}
else if(map[manY+1][manX]==3)
{
if(map[manY+2][manX]==4)
9欢迎下载
精品文档
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9) map[manY][manX]=4;
else map[manY][manX]=2;
map[manY+1][manX]=5;
map[manY+2][manX]=9;
repaint();manY++;(21);
}
else if(map[manY+2][manX]==2)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9) map[manY][manX]=4;
else map[manY][manX]=2;
map[manY+1][manX]=5;
map[manY+2][manX]=3;
repaint();manY++;(21);
}
else {map[manY][manX]=5;repaint();}
}
else if(map[manY+1][manX]==9)
{
if(map[manY+2][manX]==4)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9) map[manY][manX]=4;
else map[manY][manX]=2;
map[manY+1][manX]=5;
map[manY+2][manX]=9;
repaint();manY++;(21);
}
else if(map[manY+2][manX]==2)
{
if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)
map[manY][manX]=4;
10欢迎下载
版权声明:本文标题:java推箱子实验报告 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1705110798a123541.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论