java推箱子实验报告Word格式.docx
《java推箱子实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《java推箱子实验报告Word格式.docx(25页珍藏版)》请在冰点文库上搜索。
![java推箱子实验报告Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/b88ef488-b839-4cd1-a306-b8106c555527/b88ef488-b839-4cd1-a306-b8106c5555271.gif)
绘图
显示平台
分析对象的技巧在于它的重复利用及维护效率。
如果要把设计出来的程序在不同的显示平台上执行,就要作大幅度的更动甚至重写,这样就失去了面向对象属性,所以在本程序分析时将不变与易变的因素分别做成对象,如地图文件、小人与箱子的移动以及程序的运算逻辑就是不变的项目,而绘图及显示平台会因为环境而有所不同属于易变的项目。
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;
JButtonbtnrenew,btnlast,btnnext,btnchoose,btnfirst,btnover,btnmuc,btnback;
mainpanelpanel;
Soundsound;
JComboBoxjc=newJComboBox();
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("
更换音乐"
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=newJButton("
Restart"
btnback=newJButton("
Regretstep"
btnlast=newJButton("
Thelastlevel"
btnnext=newJButton("
Thenextlevel"
btnchoose=newJButton("
选关"
btnfirst=newJButton("
Thefirstpass"
btnover=newJButton("
Thefinalclosing"
btnmuc=newJButton("
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("
默认"
1"
2"
3"
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
00000000011100000000
00000000014100000000
00000011113100000000
00000014235111000000
00000011132341000000
00000000121111000000
00000000141000000000
00000000111000000000
00000000000000000000
(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();
mystack.push(11);
}
elseif(map[manY-2][manX]==2)
map[manY-2][manX]=3;
else{map[manY][manX]=8;
repaint();
elseif(map[manY-1][manX]==9)
if(map[manY-1][manX]==1)
map[manY][manX]=8;
voidbackup(intt)
intn=t;
if(n==10)
elseif(n==11)
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)
map[manY+1][manX]=5;
mystack.push(20);
elseif(map[manY+1][manX]==3)
if(map[manY+2][manX]==4)
map[manY+1][manX]=5;
map[manY+2][manX]=9;
mystack.push(21);
elseif(map[manY+2][manX]==2)
map[manY+2][manX]=3;
else{map[manY][manX]=5;
elseif(map[manY+1][manX]==9)
elseif(map[manY+1][manX]==1)