




免费预览已结束,剩余11页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java设计报告 1.1设计背景:经典的推箱子游戏是一个来自日本的古老游戏,目的是在训练逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。一想起这款小游戏,就想起了我的童年,它陪我们这一代度过了一段美好且愉快的时光。所以想到自己也写一个推箱子游戏,既可以享受过去的美好回忆,又可以锻炼自己的Java设计能力。1.2设计目的:综合运用在校期间所学到的理论知识和技能,并且结合课外参考资料,设计开发基于JAVA的推箱子小游戏,让自己能够熟悉并熟练应用系统的开发过程,培养独立思考能力,检验学习成果和实际动手能力,以及提高工程实践能力,为今后的工作打下坚实的基础。1.3游戏需求:玩家是通过对小人的移动操作来控制推动箱子的,并且玩家需要避过障碍物以及死角,才能将其推放到指定位置从而达到过关的目的。如果玩家将箱子推入死角导致箱子无法移动或不能移动到指定位置则闯关失败,可以通过悔步或重新开始等操作来重新挑战本关。游戏功能需求如下所示:游戏界面需求:简洁美观的用户界面,可以带给用户自然清晰的画面。游戏内容需求:小人需要前、后、左、右四张图片,移动中的箱子与终点上的箱子要所有区别,因此需要两不同的图片以示区别。键盘处理事件:控制小人与箱子的移动,可通过键盘方向键(上、下、左、右键)对小人进行上、下、左、右的移动,并且能够推动箱子。显示需求:当所有箱子都到达指定位置后即可过关,若进入死角则无法过关,需要进行悔步或重新开始的操作。可以由玩家喜欢选择关卡进行游戏。2.1游戏设计分析从面向对象的观念出发,本程序可分为以下几个对象:l地图文件的引用l小人与箱子的移动l程序运算逻辑l绘图 显示平台分析对象的技巧在于它的重复利用及维护效率。如果要把设计出来的程序在不同的显示平台上执行,就要作大幅度的更动甚至重写,这样就失去了面向对象属性,所以在本程序分析时将不变与易变的因素分别做成对象,如地图文件、小人与箱子的移动以及程序的运算逻辑就是不变的项目,而绘图及显示平台会因为环境而有所不同属于易变的项目。2.2.1.地图文件的引用在设计游戏程序时,通常都是把游戏的画面布局数据存放在一个地图文件中。程序通过读取地图文件中的数据来获取画面的布局安排。地图文件是20*20的变量数组文件,在地图不同的数字代表不同的意义。把这组数据保存到一个文件中,这个文件就是地图文件了。2.2.2.程序运逻辑程序中逻辑运算包含小人与箱子的移动、键盘事件的响应、保存数据以实现悔步以及重新开始的操作等等。2.2.3.绘图绘图主要是用于在小人与箱子的移动后,原位置由草地填补,以此来表示小人与箱子的移动以及其画面的连贯性。2.2.4.显示平台“可移植性高”是Java的属性之一,Java的应用涉及许多领域,如手机、单机程序及浏览器等,不同的平台对于它的设定不尽相同,若将显示平台独立为一个类,将有助于主程序的完整性及移植程序的快速性。3.详细设计界面图如下:(1)界面框架与按钮设计界面设计中包括了所有玩家可以直观见到的图形界面,窗体的大小,界面中的功能按钮,让玩家可以方便使用操作。界面中的按钮包括:“Regret step”,“Restart”,“The last level”,“The next level”,“The first pass”,“Select”。并且各个按钮的名称与相关功能为:“Regret step”:返回上一移动状态(可以连续返回多步);“Restart”:重新开始当前关;“The last level”:返回到当前关的上一关;“The next level”:跳转到当前关的下一关;“The first pass”:游戏系统默认开始关为第一关,此按钮让玩家可以方便从其它关卡直接跳转到第一关;“Select”:选择想要挑战的关卡。public class Tuixiangzipublic static void main(String args)new mainFrame();class mainFrame extends JFrame implements ActionListener,ItemListenerJLabel lb;JLabel lb2;JButton btnrenew,btnlast,btnnext,btnchoose,btnfirst,btnover,btnmuc,btnback;mainpanel panel;Sound sound;JComboBox jc=new JComboBox();MenuItem renew=new MenuItem( Restart);MenuItem back=new MenuItem( Regret step);MenuItem last=new MenuItem( The last level);MenuItem next=new MenuItem( The next level);MenuItem choose=new MenuItem( 选关);MenuItem exit=new MenuItem( 退出);MenuItem qin=new MenuItem( 1);MenuItem po=new MenuItem( 2);MenuItem guang=new MenuItem( 3);MenuItem nor=new MenuItem( 默认);MenuItem eye=new MenuItem( 4);MenuItem about=new MenuItem( 关于推箱子.);mainFrame()super(推箱子v2.0);setSize(720,720);setVisible(true);setResizable(false);setLocation(300,20);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Container cont=getContentPane();cont.setLayout(null);cont.setBackground(Color.black);Menu choice=new Menu( 选项);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);Menu setmuc=new Menu( 设置音乐);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);Menu help=new Menu( 帮助);help.add(about);about.addActionListener(this);MenuBar bar=new MenuBar();bar.add(choice);bar.add(setmuc);bar.add(help);setMenuBar(bar); nor.setEnabled(false);lb=new JLabel(JAVA推箱子v2.0版!,SwingConstants.CENTER);lb2=new JLabel(更换音乐,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=new JButton(Restart);btnback=new JButton(Regret step);btnlast=new JButton(The last level);btnnext=new JButton(The next level);btnchoose=new JButton(选关);btnfirst=new JButton(The first pass);btnover=new JButton(The final closing);btnmuc=new JButton(The music);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=new Sound();sound.loadSound();panel=new mainpanel();add(panel);panel.Tuixiangzi(panel.level);panel.requestFocus();validate();(2)地图的绘制形成地图以二维数组的形式进行存储,不同的数家代表了不同的含义。在本小游戏的地图文件中,09这十个数字的定义如下所示:编号0:代表未定义的区域;编号1:代表障碍物(或者边界);编号2:代表草地;编号3:代表箱子(未到指定位置);编号4:代表目的地;编号5:代表小人向下移动方向;编号6:代表小人向左移动方向;编号7:代表小人向右移动方向;编号8:代表小人向上移动方向;编号9:代表到达指定位置时的箱子。下图为数字对应的实际界面000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110000000000000000014100000000000000111131000000000000001423511100000000000011132341000000000000001211110000000000000014100000000000000000111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 (3)推箱子小游戏的游戏性其主要功能是给用户一个良好的游戏界面,游戏中包括50关的地图文件。地图文件是是先写好的,所有界面信息以数家的形式存放在一个20*20的二维数组当中并且把这些地图文件统一放在一个地图文件中,便于程序调用地图文件。然后,每一关就会按照这些数组数据重新绘制地图,从而达到小游戏的可用性及其相应的目的。(4)小人与箱子移动的算法小人与箱子的移动中包括了正移动以及“Regret step”的负移动。正移动:小人向上、下、左、右的移动是一个判断算法,其判断都是通过判断小人前面是否是草地或者是箱子亦或者是障碍物(或者边界)。如果是障碍物或者是边界,就不能够进行移动;如果是没有箱子或者是障碍物,就可以自由移动;又如果是有箱子,就要判断是否可以移动箱子,最后再讨论箱子被推过的位置,小人移动的位置,以及它们的原位置和被遮挡住的新位置的图形变化等等,需要运用算法使其重新绘制地图,填补空白。算法判断完毕后,传出数据并且将其记录在一个堆栈中,以备“Regret step”时使用。负移动:通过记录在堆栈中的数据来判断,前一步小人的移动方向以及移动中使用过的算法,逆向将代码重新运行,同时绘制并刷新地图以达到前一步的状态。void moveup()if(mapmanY-1manX=2|mapmanY-1manX=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanY-1manX=8;repaint();manY-;mystack.push(10);else if(mapmanY-1manX=3)if(mapmanY-2manX=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanY-1manX=8;mapmanY-2manX=9;repaint();manY-;mystack.push(11);else if(mapmanY-2manX=2)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanY-1manX=8;mapmanY-2manX=3;repaint();manY-;mystack.push(11);else mapmanYmanX=8;repaint();else if(mapmanY-1manX=9)if(mapmanY-2manX=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanY-1manX=8;mapmanY-2manX=9;repaint();manY-;mystack.push(11);else if(mapmanY-2manX=2)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanY-1manX=8;mapmanY-2manX=3;repaint();manY-;mystack.push(11);else mapmanYmanX=8;repaint();if(mapmanY-1manX=1)mapmanYmanX=8;repaint();void backup(int t)int n=t;if(n=10)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;else if(n=11)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=9;else mapmanYmanX=3;if(maptmpmanY-1manX=4|maptmpmanY-1manX=9)mapmanY-1manX=4;else mapmanY-1manX=2;mapmanY+1manX=8;repaint();manY+;void movedown()if(mapmanY+1manX=2|mapmanY+1manX=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanY+1manX=5;repaint();manY+;mystack.push(20);else if(mapmanY+1manX=3)if(mapmanY+2manX=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanY+1manX=5;mapmanY+2manX=9;repaint();manY+;mystack.push(21);else if(mapmanY+2manX=2)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanY+1manX=5;mapmanY+2manX=3;repaint();manY+;mystack.push(21);else mapmanYmanX=5;repaint();else if(mapmanY+1manX=9)if(mapmanY+2manX=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanY+1manX=5;mapmanY+2manX=9;repaint();manY+;mystack.push(21);else if(mapmanY+2manX=2)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanY+1manX=5;mapmanY+2manX=3;repaint();manY+;mystack.push(21);else mapmanYmanX=5;repaint();else if(mapmanY+1manX=1)mapmanYmanX=5;repaint();void backdown(int t)int n=t;if(n=20)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;else if(n=21)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=9;else mapmanYmanX=3;if(maptmpmanY+1manX=4|maptmpmanY+1manX=9)mapmanY+1manX=4;else mapmanY+1manX=2;mapmanY-1manX=5;repaint();manY-;(5)移动的代码在本小游戏系统中,小人与箱子的移动应该是能带给玩家较为逼真的视觉感受,这样才能体现系统的有效性与娱乐性。玩家通过控制小人,推动箱子在草地上避过障碍物与边界死角来到达指定的终点位置。void moveleft()if(mapmanYmanX-1=2|mapmanYmanX-1=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanYmanX-1=6;repaint();manX-;mystack.push(30);else if(mapmanYmanX-1=3)if(mapmanYmanX-2=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanYmanX-1=6;mapmanYmanX-2=9;repaint();manX-;mystack.push(31);else if(mapmanYmanX-2=2)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanYmanX-1=6;mapmanYmanX-2=3;repaint();manX-;mystack.push(31);else mapmanYmanX=6;repaint();else if(mapmanYmanX-1=9)if(mapmanYmanX-2=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanYmanX-1=6;mapmanYmanX-2=9;repaint();manX-;mystack.push(31);else if(mapmanYmanX-2=2)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanYmanX-1=6;mapmanYmanX-2=3;repaint();manX-;mystack.push(31);else mapmanYmanX=6;repaint();else if(mapmanYmanX-1=1)mapmanYmanX=6;repaint();void backleft(int t)int n=t;if(n=30)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;else if(n=31)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=9;else mapmanYmanX=3;if(maptmpmanYmanX-1=4|maptmpmanYmanX-1=9)mapmanYmanX-1=4;else mapmanYmanX-1=2;mapmanYmanX+1=6;repaint();manX+;void moveright()if(mapmanYmanX+1=2|mapmanYmanX+1=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanYmanX+1=7;repaint();manX+;mystack.push(40);else if(mapmanYmanX+1=3)if(mapmanYmanX+2=4)if(maptmpmanYmanX=4)mapmanYmanX=4;else mapmanYmanX=2;mapmanYmanX+1=7;mapmanYmanX+2=9;repaint();manX+;mystack.push(41);else if(mapmanYmanX+2=2)if(maptmpmanYmanX=4)mapmanYmanX=4;else mapmanYmanX=2;mapmanYmanX+1=7;mapmanYmanX+2=3;repaint();manX+;mystack.push(41);else mapmanYmanX=7;repaint();else if(mapmanYmanX+1=9)if(mapmanYmanX+2=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;else mapmanYmanX=2;mapmanYmanX+1=7;mapmanYmanX+2=9;repaint();manX+;mystack.push(41);else if(mapmanYmanX+2=2)if(maptmpmanYmanX=4|
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 禽类养殖与食品加工企业战略合作协议
- 离婚自愿净身出户财产分割与权益保障协议
- 音乐产业版权运营白皮书:2025年音乐科技创新应用案例分析
- 文化创意竞赛项目秘密信息保护及创意成果合同
- 婚姻终止后的房产分割与子女抚养权协议模板
- 基于婚姻解除的房产权益分配专项协议范本
- 餐厅经营场所租赁合同:附带特色餐饮项目加盟条款
- 固安县2024-2025学年第一学期六年级数学期末学业评价试题含参考答案
- 地产营销策划合同模板(3篇)
- 甘肃省2023年高二学业水平合格性考试物理考点及答案
- 【财务会计论文】会计电算化的优化策略论文(共10篇)(共25149字)
- 1.1.2 茶树无性繁殖
- 电梯控制技术实训报告总结
- DB11∕T 3035-2023 建筑消防设施维护保养技术规范
- 【云南白药公司财务报表研究国内外文献综述4000字】
- 国际音标卡片(打印版)
- 2024年高等教育教育类自考-00285中国福利思想笔试历年真题荟萃含答案
- 蛋白质相互作用传递信息蛋白质
- 马克思主义劳动观的内涵
- 《金属热处理》课件
- 学生上下学交通方式台账
评论
0/150
提交评论