推箱子游戏设计与实现Word下载.docx
《推箱子游戏设计与实现Word下载.docx》由会员分享,可在线阅读,更多相关《推箱子游戏设计与实现Word下载.docx(23页珍藏版)》请在冰点文库上搜索。
![推箱子游戏设计与实现Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/a8081e92-3bd5-4dc6-ab2c-978d34748edb/a8081e92-3bd5-4dc6-ab2c-978d34748edb1.gif)
KeyWords:
JAVARelievepressurePushboxGame
1.可行性研究
设计目的
灵活运用自己在学校学习期间所学到的理论知识和实际动手技能,并结合自己于课外查找到的资料,该推箱子游戏设计并开发基于JAVA,使自己能够熟悉和熟练应用开发过程及相关技能,培养独立思考能力,测试学习结果,实践和提高编程能力,并为今后的工作打下坚实基础的实际能力。
可行性研究前提
基本需求:
系统开发的总体任务是综合体现游戏本身的可操作性、美观性和及时性。
在游戏的开发过程中谨遵软件工程规范,可采用结构化或面向对象分析的设计方法。
主要是实现Windows的GUI程序开发,对游戏中的图形图像通过键盘进行控制。
玩家可通过控制键盘上的上下左右方向按键来对游戏中的人物进行移动操作。
主要开发目标:
采用结构化的设计方法,开发出一个操作简单、界面简洁且美观、适合人们用以休闲娱乐的小游戏,实现Windows的GUI程序开发,并期望能够通过此次游戏开发过程全面提高个人自身的综合素质。
条件假定和限制:
由于对编程语言的学习以及理解还不是很到位,因此本游戏可能会在诸多方面存在一些问题以及不足之处。
可行性研究所采用的方法和步骤:
通过研究分析推箱子小游戏所需要的具体功能以及这些功能实现的方法、确定主体结构。
利用所学到的知识,以最简洁、最容易的办法,边开发边测试边修改,实现一个初级游戏软件。
评价尺度:
由于本软件是一个初级产品,因此对其要求并不是太苛刻,所以只需要能够达到推箱子小游戏的一般功能即可。
可行性分析
管理可行性:
这款推箱子游戏软件的设计目的是为了提高自身素质以及检查自己在校期间所学习JAVA的相关知识的成果,运用JAVA语言编写后,在EditPlus编译器中运行简单明了,所有功能全部根据基本需求所做,从而得以便于管理,所以在这方面是可以实现的。
经济可行性:
由于本游戏的主要背景是毕业设计,不注重其直接可能产生的经济效益和其后的发展方向,其关键在于注重个人自身独立编写JAVA程序的水平以及其能力的提高,对自身的经济要求也不高,只要有一台能运行JAVA软件和EditPlus编译器的电脑即可,所以可以不用考虑经济方面的相关问题。
技术可行性:
对于本游戏,可以使用如VB,Java,Delphi等诸多相关的编程语言进行编写,但是考虑到编写程序的难易程度、个人自身对编译语言的了解程度以及完成的便利性等方面因素,故本游戏选择了以JAVA程序语言作为编程语言。
需要对变量定义、变量初始化、界面初始化、游戏初始化等,然后就可以进入游戏,处理游戏过程中的各种操作。
社会可行性:
本游戏的开发仅作为毕业课程设计使用,仅用来巩固先前所学的知识,是以个人为单位的,可供个人或他人平常娱乐解压所用,无需考虑该游戏有可能造成的社会影响,因此可以不用考虑到法律、版权等多方面的社会因素,所以在这方面也是完全可行的。
结论意见
综上所述,本游戏软件程序的技术基本成熟。
经过出于管理可行性、经济可行性、技术可行性和社会可行性这四大方面的分析,在这些方面上均无重大问题,因此能够达到此次设计所预期的目的,所以可开始着手编写本次游戏程序。
2.需求分析
引言
对软件需求的透彻理解,对于软件开发工作能否成功是起着至关重要的作用,需求说明的任务是发现、规范的过程,这有益于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,有助于采用工程方法开发软件,提高软件的质量,还有利于开发人员、维护人员、管理人员之间的交流以及协作,并且可以作为工作成果的原始依据;
再者,亦可在向潜在用户传递软件功能、性能需求,使其能够判断该软件是否与自己的需求相符合。
游戏需求
玩家是通过对小人的移动操作来控制推动箱子的,并且玩家需要避过障碍物以及死角,才能将其推放到指定位置从而达到过关的目的。
如果玩家将箱子推入死角导致箱子无法移动或不能移动到指定位置则闯关失败,可以通过悔步或重新开始等操作来重新挑战本关。
游戏功能需求如下所示:
游戏界面需求:
简洁美观的用户界面,可以带给用户自然清晰的画面。
游戏内容需求:
良好的小人与箱子设计,可以给玩家带来更真实的感觉。
小人需要前、后、左、右四张图片,移动中的箱子与终点上的箱子要所有区别,因此需要两不同的图片以示区别。
键盘处理事件:
控制小人与箱子的移动,可通过键盘方向键(上、下、左、右键)对小人进行上、下、左、右的移动,并且能够推动箱子。
显示需求:
当所有箱子都到达指定位置后即可过关,若进入死角则无法过关,需要进行悔步或重新开始的操作。
可以由玩家喜欢选择关卡进行游戏。
软硬件需求
硬件环境需求:
CPU:
PentiumIII600以上;
内存要求:
2GB以上;
内存剩余资源:
128MB以上;
软件环境:
JDK及其以上的版本。
接口控制
本小游戏需要通过键盘进行操作,在Windows的操作系统下,利用键盘的上、下、左、右方向按键控制小人的行动来推动箱子,要使用键盘的接口实现。
方案论证
学校开设的关于学习编程语言的课程有C++语言、Java程序语言等,皆可用于编写推箱子小游戏的程序。
C++语言的优点
C++语言是对C语言的扩充,扩充的绝大部分来自着名语言中的最佳特性:
从SIMULA67中吸取了类,从ALGOL68中吸取了运算符一名多用、引用和在分程序中任何地方说明变量,综合了Ada的类属和Clu的模块特点,从BCPL中吸取异常处理,从BCPL中吸取了用细设计
游戏总体结构与代码
推箱子的小游戏界面如图所示:
图小游戏界面
由图可以看出,本小游戏的界面简洁、直观,从界面中可以直接得到本小游戏的相关功能操作信息。
(1)界面框架与按钮设计
界面设计中包括了所有玩家可以直观见到的图形界面,窗体的大小,界面中的功能按钮,让玩家可以方便使用操作。
界面中的按钮包括:
“悔一步”,“重来”,“上一关”,“下一关”,“第1关”,“最终关”,“选关”。
并且各个按钮的名称与相关功能为:
“悔一步”:
返回上一移动状态(可以连续返回多步);
“重来”:
重新开始当前关;
“上一关”:
返回到当前关的上一关;
“下一关”:
跳转到当前关的下一关;
“第1关”:
游戏系统默认开始关为第一关,此按钮让玩家可以方便从其它关卡直接跳转到第一关;
“最终关”:
可以跳转到最后一关,即游戏系统默认的最后一个关。
“选关”:
选择想要挑战的关卡。
其中,这个部分的部分代码为:
publicclassTuixiangzi
{
publicstaticvoidmain(String[]args)
{
newmainFrame();
}
}
classmainFrameextendsJFrameimplementsActionListener,ItemListener
JLabellb;
JLabellb2;
JButtonbtnrenew,btnlast,btnnext,btnchoose,btnfirst,btnover,btnmuc,btnback;
mainpanelpanel;
Soundsound;
JComboBoxjc=newJComboBox();
MenuItemrenew=newMenuItem("
重新开始"
);
MenuItemback=newMenuItem("
悔一步"
MenuItemlast=newMenuItem("
上一关"
MenuItemnext=newMenuItem("
下一关"
MenuItemchoose=newMenuItem("
选关"
MenuItemexit=newMenuItem("
退出"
MenuItemqin=newMenuItem("
琴萧合奏"
MenuItempo=newMenuItem("
泡泡堂"
MenuItemguang=newMenuItem("
灌篮高手"
MenuItemnor=newMenuItem("
默认"
MenuItemeye=newMenuItem("
eyesonme"
MenuItemabout=newMenuItem("
关于推箱子..."
mainFrame()
super("
推箱子"
setSize(720,720);
setVisible(true);
setResizable(false);
setLocation(300,20);
setDefaultCloseOperation;
Containercont=getContentPane();
(null);
;
Menuchoice=newMenu("
选项"
(renew);
(last);
(next);
(choose);
(back);
();
(exit);
(this);
Menusetmuc=newMenu("
设置音乐"
(nor);
(qin);
(po);
(guang);
(eye);
Menuhelp=newMenu("
帮助"
(about);
MenuBarbar=newMenuBar();
(choice);
(setmuc);
(help);
setMenuBar(bar);
(false);
lb=newJLabel("
毕业设计JAVA推箱子游戏版。
"
;
lb2=newJLabel("
更换音乐"
add(lb);
add(lb2);
(100,20,400,20);
(625,500,55,20);
btnrenew=newJButton("
重来"
btnback=newJButton("
悔一步"
btnlast=newJButton("
上一关"
btnnext=newJButton("
下一关"
btnchoose=newJButton("
选关"
btnfirst=newJButton("
第1关"
btnover=newJButton("
最终关"
btnmuc=newJButton("
音乐关"
add(btnrenew);
add(btnlast);
add(btnnext);
add(btnchoose);
add(btnfirst);
add(btnover);
add(btnmuc);
add(btnback);
(625,100,80,30);
(625,150,80,30);
(625,200,80,30);
(625,250,80,30);
(625,300,80,30);
(625,350,80,30);
(625,400,80,30);
(625,450,80,30);
(625,530,80,20);
("
默认"
琴萧合奏"
泡泡堂"
灌篮高手"
eyesonme"
(jc);
sound=newSound();
panel=newmainpanel();
add(panel);
validate();
(2)地图的绘制形成
地图以二维数组的形式进行存储,不同的数家代表了不同的含义。
在本小游戏的地图文件中,0~9这十个数字的定义如下所示:
编号0:
代表未定义的区域;
编号1:
代表障碍物(或者边界);
编号2:
代表草地;
编号3:
代表箱子(未到指定位置);
编号4:
代表目的地;
编号5:
代表小人向下移动方向;
编号6:
代表小人向左移动方向;
编号7:
代表小人向右移动方向;
编号8:
代表小人向上移动方向;
编号9:
代表到达指定位置时的箱子。
例如下图所示(左边是二维数组的地图文件,右边是相对应的小游戏界面):
图地图文件与相应界面
(3)推箱子小游戏的游戏性
其主要功能是给用户一个良好的游戏界面,游戏中包括50关的地图文件。
地图文件是预先写好的,所有界面信息以数字的形式存放在一个20*20的二维数组当中并且把这些地图文件统一放在一个地图文件中,使得程序方便调用地图文件。
然后,每一关就会按照这些数组数据重新绘制地图,从而达到小游戏的可用性及其相应的目的。
(4)小人与箱子移动的算法
小人与箱子的移动中包括了正移动以及“悔一步”的负移动。
正移动:
小人向上、下、左、右的移动是一个判断算法,其判断都是通过判断小人前面是否是草地或者是箱子亦或者是障碍物(或者边界)。
如果是障碍物或者是边界,就不能够进行移动;
如果是没有箱子或者是障碍物,就可以自由移动;
又如果是有箱子,就要判断是否可以移动箱子,最后再讨论箱子被推过的位置,小人移动的位置,以及它们的原位置和被遮挡住的新位置的图形变化等等,需要运用算法使其重新绘制地图,填补空白。
算法判断完毕后,传出数据并且将其记录在一个堆栈中,以备“悔一步”时使用。
负移动:
通过记录在堆栈中的数据来判断,前一步小人的移动方向以及移动中使用过的算法,逆向将代码重新运行,同时绘制并刷新地图以达到前一步的状态。
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--;
(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();
(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;
(20);
elseif(map[manY+1][manX]==3)
if(map[manY+2][manX]==4)