




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计说明书 NO.27推箱子小游戏1.课程设计的目的 随着科技水平的发展,人们的生活,工作节奏越来越快,同时人们的各方面的压力也越来越大。在社会的条件下,压力给人们带来很多烦恼,所以合理的解压,但又不会浪费很多时间的方式成为现代人的共同心愿。游戏随之产生,他的娱乐性和有趣性也越来越被大家所认可,小游戏可以安装在手机里,让人们无论何时何地都能玩到游戏。基于这样的目的, 我们在本次课程设计中为大家开发了一款适合休闲娱乐的小游戏推箱子趣味游戏。他不仅可以帮助人们消磨时间,还可以在一定程度上开发智力,通过课程设计,巩固Java基础知识,增进编程基本功,熟练eclipse 和 EditPlus 的使用方法,通过该系统的设计与开发,将所学知识真正的应用于实践当中,培养实际动手能力。并在设计实践过程中,学习到更深的知识,掌握先进的Java技术,从而来增强对一个系统设计的整体认识,熟悉软件开发过程,更深刻的理解软件工程的知识2.设计方案论证 2.1设计思路 经典的推箱子是一个来自日本的古老游戏,目的是在训练人的逻辑思考能力。在一个狭小的仓库中,要求把木箱从开始位置推放到指定的位置。在仓库有障碍物,稍不小心就会出现箱子无法移动或者通道被堵住的情况,而且箱子只能推,不能拉,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。本游戏一共50关,由易到难,每一关都有初化、按键处理、重置及退出功能。 (1)初始化包括屏幕初始化和每一关卡的初始化,屏幕被初始化宽80像素,高25像素。 (2)按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。(3)每一关都可以重置,按选项重新开始可以重置当前关。 (4)可以进行选关操作,按选项选关可以选择1-10关的任一关。 (5)可以返回至上一位置,按选项返回可以退回到上一位置,相当于悔一步。(6)按选项退出键可以在任何时候退出游戏。2.2系统总体设计在此游戏中本着娱乐为目的,游戏者不仅可以在玩游戏还可以享受音乐,游戏界面简单,操作容易,在玩游戏的同时还可以锻炼大家的反应速度及灵敏程度,在游戏中设置关数,级别由低到高,一关比一关难,提高大家的兴趣,玩家可以自由的选关,并设置了分数的存储系统。系统中又增加了音乐的设置可以让玩家享受音乐。通过对小人移动箱子是否到达墙边进行判断决定胜负及是否可以进入下一关。2.2.1系统模块图本程序包括5个模块,分别是初始化模块、画图模块、移动箱子模块、移动小 模块和功能控制模块,如图1所示。各个模块的功能描述如下: (1)初始化模块。 该模块包括屏幕初始化和游戏第一关的初始化。屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。 (2)画图模块。 该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。 (3)移动箱子模块。 该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。 (4)移动小人模块。 该模块用于控制小人移动,从而推动箱子到目的地。(5)功能控制模块。 该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。推箱子游戏 功能控制模块 移动小人模块 移动箱子模块 画图模块初始化模块图1 游戏运行界面2.22任务执行流程图 游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按退出键退出。如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则显示通关信息,如果想继续闯,按回车闯下一关,否则结束游戏。游戏同时还具有时间和步数的记录,在开始游戏之前首先把图片添加到pic目录下,程序会自动获取该目录下的所有文件。标有 数字 4 的位置表示 该位置是游戏主角的初始位置开始游戏第一关开始是否成功?否是显示通关信息是否继续闯选下一关是结束游戏否图2 游戏运行流程图3. 课程设计内容3.1程序中自定义类说明 (1)重来:重新开始当前关; (2)悔一步:返回上一移动状态(可以连续返回多步) ; (3)第一关:游戏系统默认开始关为第一关,此按钮可以将关从其它关跳跃到第一关; (4)上一关:返回到当前关的上一关; (5)下一关:返回到当前关的下一关; (6)最终关:跳跃到最后一关,即第五十关; (7)选关:选择想要玩的关; (8)音乐关(开) :默认为开,点击自动关闭音乐和开启音乐; (9)更换音乐:从不同的音乐中选取适合玩家的音乐。 3.2程序中主要方法说明 (1)界面框架与按钮设计界面设计中包括了,所有你所直观见到的图形界面,窗体的大小,下拉菜单中的功能菜单。使得玩家能够很直观的见到所有游戏中的功能,界面中有菜单, 包括:“选项”“设置音乐”“帮助”,按钮包括:“重来”“悔一步”“第一关”“上一关”“下一关”“最终关”“选关”“音乐”。 部分代码如下:Menu setmuc=new Menu(设置音乐);setmuc.add(nor);setmuc.add(qin);setmuc.add(po); 音乐调用代码如下:void mystop()midi.stop();midi.close();sign=false;boolean isplay()return sign; (2)地图的绘制形成地图以二维数组的形式进行存储的,不同的数字有着不同的含义。在地图当中不同的数字代表不同的含义我当时是将 09 解读成为不同的图形与图像。0代表地图以内的空位;1代表地图中的边缘;2代表地图以内的空位非点位;3代表地图中的箱子;4代表点位;5代表小人面部朝下;6代表小人面部朝左;7代表小人面部朝右;8代表小人面部朝上;9代表箱子已经到达点位。 (3)推箱子游戏的游戏性其主要功能是给用户一个友好的游戏界面,游戏中包括 50 关的地图,推箱 子这个游戏的50 个地图是事先完成的,将所有地图上面的信息以数字的形式储 存在一个 20*20 的二维数组当中;然后,每一关都按照数组重新绘制地图,这样就拥有了50 张地图。 (4)游戏规则的设置在游戏中要保证箱子不能重叠,箱子不能碰到墙壁,在设置过程中一定要将移动一次箱子的位置后位置的布尔值要设置为 true,不然移动一次箱子后不能再移动。 (5)小人与箱子移动的算法 移动中包括正移动,与悔一步的负移动。正移动:小人上下左右的移动是,归结起来上下左右是一个判断的算法,判断都是通过判断小人前面是否是空位箱子或者是墙,如果没有,就移动;有的话,据判断箱子是否可以移动,最后讨论箱子推过的,小人移动,以及被遮挡住点的图形变化,重新绘制地图,算法判断完毕.传出数据记录在一个栈当中,以备“悔一步”使用。负移动:通过记录在栈中的数据判断,前一步是的移动方向以及移动使用过的算法,逆向将代码重新运行,同时绘制地图以达到前一步的状态。 (6)移动的代码 在本游戏系统中,给人的视觉感受应该是能感受都动作的变化,逼真的人物 动作会使系统更有效。通过控制人物,箱子,空地,障碍物在数组中的位置的改变来控制移动动作。 (7)数据的应用 推箱子中的数据存储是很重要的,不然无法进行“悔一步”的操作本系统。采用栈的存储方式来存储并控制人物,箱子的移动和地图的变换,悔一步操作让 玩家有了反悔的一步,这节省玩家的时间,避免因错位导致重新开始。4. 设计结果与分析4.1 程序运行结果程序编译无错误,单击运行按钮,运行通过,开始时弹出该游戏的页面,然后开始游戏。一般的会显示出第一关的游戏,玩家可以根据自己的实际水平去操作,而后选择适于自己水平的关卡来玩。第一关如下图3所示图3 游戏第一关界面当玩家想选关时,可以根据自己的意愿去选关闯。选第50关,如下图4所示图4 游戏成功界面。图4 游戏第50关界面4.2尚需解决的问题游戏的背景音乐比较单一,可以通过在“选项”模式中添加“背景音乐导入”模块,导入玩家自己喜欢的音乐。在此次课程设计中,我遇到了一些问题,如:对于面向对象的方法了解不够透彻,运用到实际的软件开发中存在着困难;对于Java语言,只学习到了一些最基本的知识,这导致编写程序时经常出现一些语法错误,而且要在短时间内用Java语言来设计一个具体的系统是一个较大的挑战;还有对于正规开发一个系统的流程不熟悉,适应起来比较慢,编写各个模块相对应的操作时,自己感觉难以动手,这表明所学的知识不能灵活运用到实际中。 对于以上的问题,自己有清楚的认识,解决办法是需要大量阅读相关的书籍,对于书上以及网站上下载的资料中的Java实例必须有清楚的理解,还有就是多跟精通此方面的老师和同学交流,取其精华。对于实际动手能力与系统开发的流程的适应,必须多进行实际的练习与操作,才能有大的进步。5.设计体会 为期一周的课程设计很快就结束了,回顾这一周,累并快乐着。从老师开始给布置课程设计的题目、内容及要求到自己广泛借助互联网查阅资料并独立完成Java推箱子小应用程序;从两周前刚接到任务时的茫然与无助到两周后的清晰与明了;从对Java的编辑器EditPlus和eclipse初步了解到熟练运用,历经了太多的困难。对于环境变量的配置,我做到了知其然,知其所以然,对EditPlus的了解也完全上升了一个层次从课堂上老师教给的在dos 界面中输入Javac 文件名.java编译、Java 文件名 运行到在EditPlus中选中“工具”、“配置用户组“,设置编译和执行相关参数,按快捷键Ctrl+1编译、Ctrl+2运行,节省了大量时间,使编程效率有了很大的提高。 对于推箱子游戏,更是有了进一步的了解,其中用到了9张图片,用户可以通过改变图片来改变游戏的显示界面,当然,这个是不被允许的,因为每个程序的代码都有版权,但对于设计者而言,却可以更加清楚的了解代码的内部构造,达到熟能生巧的效果。 游戏的帮助和关于设计人性化,在写代码是遇到了很多问题,通过和同学们的交流以及在百度知道里的提问,最终达到了理想的效果通过此次课程设计,将我本周所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。通过对推箱子游戏的开发,使我对用eclipse开发平台和EditPlus编辑器有了一个比较清楚的认识,体会到理论和实践的重要性。6.参考文献1 张永常等.JAVA程序设计实践教程M.北京:清华大学出版社,2010,155-1582 梁勇.Java 语言程序设计M.北京:机械工业出版社,2011,89-913 郑莉.Java 程序设计M. 北京:清华大学出版社,2011,85-904 张广彬.Java课程设计M.北京:清华大学出版社,2011,189-1935 文杰书院.JAVA程序设计完全自学手册M.北京:机械工业出版社,2010,97-101 附录程序具体代码:(1)主界面设置代码如下:class mainFrame extends JFrame implements ActionListener,ItemListenerprivate static final long serialVersionUID = 1L;JLabel lb;JLabel lb2;JButton btnrenew,btnlast,btnnext,btnchoose,btnfirst,btnover,btnmuc,btnback;mainpanel panel;Sound sound;JComboBox jc=new JComboBox();MenuItem renew=new MenuItem(重新开始);MenuItem back=new MenuItem(悔一步);MenuItem last=new MenuItem(上一关);MenuItem next=new MenuItem(下一关);MenuItem choose=new MenuItem(选关);MenuItem exit=new MenuItem(退出);MenuItem qin=new MenuItem(琴萧合奏);MenuItem po=new MenuItem(泡泡堂);MenuItem guang=new MenuItem(灌篮高手);MenuItem nor=new MenuItem(默认);MenuItem eye=new MenuItem( eyes on me);MenuItem about=new MenuItem(关于推箱子.);mainFrame()super(推箱子v2.0);setSize(720,700);setVisible(true);setResizable(false);setLocation(150,10);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(推箱子,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(重来);btnback=new JButton(悔一步);btnlast=new JButton(上一关);btnnext=new JButton(下一关);btnchoose=new JButton(选关);btnfirst=new JButton(第关);btnover=new JButton(最终关);btnmuc=new JButton(音乐关);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(琴萧合奏);jc.addItem(泡泡堂);-*jc.addItem(灌篮高手);jc.addItem(eyes on me);jc.addItemListener(this);cont.add(jc);sound=new Sound();sound.loadSound();panel=new mainpanel();add(panel);panel.Tuixiangzi(panel.level);panel.requestFocus();validate();(2)音乐调用代码如下:class SoundString path=new String(musics);String file=new String(nor.mid);Sequence seq;Sequencer midi;boolean sign;void loadSound()try seq=MidiSystem.getSequence(new File(path+file);midi=MidiSystem.getSequencer();midi.open();midi.setSequence(seq);midi.start();midi.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);catch (Exception ex) ex.printStackTrace();sign=true;void mystop()midi.stop();midi.close();sign=false;boolean isplay()return sign;void setMusic(String e)file=e;(3)规则代码如下:public void createWall() for (int i = 5; i 12; i+) Node walls = new Node(i, 5); wallList.add(walls); for (int i = 11; i 4; i-) Node walls = new Node(i, 11); wallList.add(walls); wallList.add(new Node(5, 10); wallList.add(new Node(4, 10); wallList.add(new Node(4, 9); wallList.add(new Node(4, 8); wallList.add(new Node(4, 8); wallList.add(new Node(4, 7); wallList.add(new Node(5, 7); wallList.add(new Node(5, 6); wallList.add(new Node(7, 7); wallList.add(new Node(8, 7); wallList.add(new Node(9, 7); wallList.add(new Node(8, 9); wallList.add(new Node(8, 10); / 将墙壁的对象置为true for (int i = 0; i wallList.size(); i+) Node n = (Node) wallList.get(i); an.xn.y = true; public void moveDisable(Node n, int d1, int d2) switch (direction) case 4: n.x -= d1; break; case 1: n.y -= d2; break; case 2: n.x -= d1; break; case 3: n.y -= d2; break; / public void moveDisable(Node n1, Node n2, int d1, int d2) switch (direction) case 4: n1.x -= d1; n2.x -= d1; break; case 1: n1.y -= d2; n2.y -= d2; break; case 2: n1.x -= d1; n2.x -= d1; break; case 3: n1.y -= d2; n2.y -= d2; break; (4)物移动代码: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();else if(e.getSource()=btnback|e.getSource()=back)if(panel.isMystackEmpty()JOptionPane.showMessageDialog(this, 您还未移动!);elseswitch(panel.back()case 10:panel.backup(10);break;case 11:panel.backup(11);break;case 20:panel.backdown(20);break;case 21:panel.backdown(21);break;case 30:panel.backleft(30);break;case 31:panel.backleft(31);break;case 40:panel.backright(40);break;case 41:panel.backright(41);break;panel.requestFocus();else if(e.getSource()=nor)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 施工安全责任协议书范本与填写指南
- 2025年居民社区文化活动场地租赁协议
- 临时用工劳务协议书6篇
- 建筑工程施工安全责任协议范本
- 燃气表损坏协议书5篇
- 餐饮合作股权协议法律解析
- 企业战略合作协议书范本及条款模板
- 功能性纤维织物设计-洞察及研究
- 公民参与机制研究-洞察及研究
- 拓扑结构智能设计-洞察及研究
- 承包商全流程安全培训
- 输血科岗前培训课件
- 间质性肺炎护理查房内容课件
- 交通事故原因分析
- 深圳市企业职工养老保险养老金申请表
- IDC云数据中心机房运维服务解决方案
- 婴幼儿发展的一般规律及养育要点
- 大一统视阈下的边疆治理
- 2020ESPEN专家建议:围手术期营养管理
- 《教育心理学》课程教学大纲
- 中西医结合导论第一章中西医结合导论
评论
0/150
提交评论