收藏 分享(赏)

推箱子--Java课程设计.doc

上传人:weiwoduzun 文档编号:4406612 上传时间:2018-12-27 格式:DOC 页数:50 大小:905.53KB
下载 相关 举报
推箱子--Java课程设计.doc_第1页
第1页 / 共50页
推箱子--Java课程设计.doc_第2页
第2页 / 共50页
推箱子--Java课程设计.doc_第3页
第3页 / 共50页
推箱子--Java课程设计.doc_第4页
第4页 / 共50页
推箱子--Java课程设计.doc_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、 面向对象程序设计课程设计报告题 目: 经典推箱子趣味游戏设计与实现 院 (系): 信息科学与工程学院 专业班级: 计算机科学与技术 1201 班 学生姓名: 程伟 学 号: 20121183011 指导教师: 吴奕 20 14 年 12 月 29 日至 20 15 年 1 月 9 日华中科技大学武昌分校制面向对象程序设计 课程设计任务书一、设计(调查报告/论文) 题目经典推箱子趣味游戏设计与实现二、设计(调查报告/论文)主要内容内容:本游戏要求用户将游戏地图中所有放置着的箱子推到指定的地点来完成游戏,用户通过绕开地图中的障碍物将可移动的箱子推到目的地,游戏的难度在于要求用户通过合理的路径安排

2、来使所有的箱子最后都到达目的地。游戏一共 50 关,随着关数的升高,游戏的难度随之增大。基本功能与要求:1 初始化游戏界面设计2 地图的绘制3 每一关都按照数组重新绘制地图4 小人与箱子的移动5 完成“悔一步“的操作。三、原始资料1.面向对象程序设计课程设计指导书2. 耿祥义JAVA 大学实用教程北京:清华大学出版社,2009四、要求的设计(调查/论文)成果1.课程设计报告2.课程设计软件五、进程安排布置任务,查找资料、需求分析 1 天总体设计 1 天详细设计 1.5 天编制源程序实现 3.5 天测试与修改 1 天撰写课设报告 2 天六、主要参考资料1 张广彬. Java 课程设计案例精编(第

3、二版).北京:清华大学出版社, 2011. 2 耿祥义. Java 课程设计(第二版).北京:清华大学出版社, 2008.3 耿祥义JAVA 大学实用教程北京:清华大学出版社,20094 邹林达陈国君 Java2 程序设计基础北京:清华大学出版社,20105 邹林达Java2 程序设计基础实验指导北京:清华大学,2010指导教师(签名):20 年 月 日目 录1需 求 与 总 体 设 计 11.1需 求 分 析 11.2总 体 设 计 22详细设计 42.1 mainFrame类 42.2 mainpanel类 52.3 Sound类 72.4 Readmap类 73 编码实现 93.1游 戏

4、 源 码 94系统测试 42总 结 4501需 求 与 总 体 设 计1.1需 求 分 析1.1.1功能结构图推箱子游戏的功能结构图如图 1.1 所示。在系统中,编写 4 个 Java 类:mainFrame,mainpanel,Sound,Readmap;分别对应初始化游戏界面,游戏操作,背景音乐,绘制地图。 推箱子游戏初始化游戏界面 绘制地图游戏操作 背景音乐上一曲上移 下移左移 右移下一曲选择关卡 ( 1 5 0 )人物移动 箱子移动图 1.111.1.2 UML类图推箱子系统除了上述 4 个 Java 类外,还需要 Java 系统提供的一些重要的类。这些类之间的 UML 图如图 1.2

5、 所示。图 1.21.2总 体 设 计1.2.1 mainFrame类mainFrame 类负责创建系统的主窗口。mainFrame 类有多种重要类型的对象,这些对象构成了游戏界面的简明与美观,并且通过监听实现方法赋予了这些组件的相应功能。MainFrame 类通过调用 Readmap 类来实现将地图绘制在游戏主界面,通过调用Sound 类来实现对背景音乐的管理,实现音乐开关以及选择上一曲下一曲的操作。设计中包括了所有你所能直观见到的图形界面,窗体的大小,下拉菜单中的功能菜单,使得玩家能够很直观的见到所有游戏中的功能.界面中有菜单, 包括:“选项“设置音乐“帮助“。按钮包括:“重来“悔一步“第

6、一关“上一关“下一关“最终关“选关“音乐“等。1.2.2 mainpanel 类Mainpanel 类中集成了小人与箱子的移动规则,并且还包含了对键盘操作移动的响应方法。在本游戏系统中,给人的视觉感受应该是能感受都动作的变化,逼真的人物动作会使系统更有效.通过控制人物,箱子,空地,障碍物在数组中的位置的改变来控制移2动动作.小人与箱子移动的算法移动中包括正移动,与“悔一步“的负移动. 正移动:小人上下左右的移动是由本组咸英智组员所做,归结起来上下左右是一个判断的算法,判断都是通过判断小人前面是否是空位箱子或者是墙,如果没有就移动;有的话,据判断箱子是否可以移动,最后讨论箱子推过的,小人移动,以

7、及被遮挡住点的图形变化,重新绘制地图,算法判断完毕. 1.2.3 Sound 类Sound 类主要功能是播放背景音乐,包含了一些对音乐的操作方法。在玩游戏的同时听一听动听的音乐,有助于舒缓疲劳,放松心情。1.2.4 Readmap类Readmap 类是绘制地图的类,将已经制作好的地图绘制在游戏界面上。其主要功能是给用户一个友好的游戏界面,游戏中包括 50 关的地图,推箱子这个游戏的 50 个地图是事先完成的,将所有地图上面的信息以数字的形式储存在一个 20*20 的二维数组当中;然后,每一关都按照数组重新绘制地图,这样就拥有了 50 张地图。32详细设计2.1 mainFrame类MainFr

8、ame类用于初始化屏幕。该类首先用两个for循环初始化屏幕20*20 范围内的状态,初始化为0 ,以后根据实际情况重新赋值;然后设置屏幕输出状态,设置寄存器AX的高位为0,低位为3,表示以80*25的彩色方式显示;最后移动光标到指定的位置输出。设置界面的标题,窗口大小,添加按钮组件以及各种组件的布局super(“推箱子咯 “);/设置标题setSize(720,720);setVisible(true);/设置窗口可见setResizable(false);/创建按钮btnrenew=new JButton(“重来“);btnback=new JButton(“悔一步“);btnlast=ne

9、w JButton(“上一关“);btnnext=new JButton(“下一关“);btnchoose=new JButton(“选关“);btnfirst=new JButton(“第关“);btnover=new JButton(“最终关“);btnmuc=new JButton(“音乐关“);actionPerformed(ActionEvent)itemStateChanged(ItemEvent)42.2 mainpanel类该类用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。小人与箱子移动的算法移动中包括正移动,与“悔一步“的负移动. 正移动:小人上下左右的

10、移动是由本组咸英智组员所做,归结起来上下左右是一个判断的算法,判断都是通过判断小人前面是否是空位箱子或者是墙,如果没有就移动;有的话,据判断箱子是否可以移动,最后讨论箱子推过的,小人移动,以及被遮挡住点的图形变化,重新绘制地图,算法判断完毕.传出数据记录在,一个栈当中,以备“悔一步“使用. 负移动:通过记录在栈中的数据判断,前一步是的移动方向以及移动使用过的算法,逆向将代码重新运行,同时绘制地图以达到前一步的状态.Mainpanel 类中包含了(1)重来:重新开始当前关; (2)悔一步:返回上一移动状态(可以连续返回多步) (3)第一关:游戏系统默认开始关为第一关,此按钮可以将关从其它关跳跃到

11、第一关. (4)上一关:返回到当前关的上一关; (5)下一关:返回到当前关的下一关; 5(6)最终关:跳跃到最后一关,即第五十关; (7)选关:选择想要玩的关; (8)音乐关(开) :默认为开,点击自动关闭音乐和开启音乐. (9)更换音乐:从不同的音乐中选取适合玩家的音乐.键盘操作的方法iswin()/判断是否获胜isMystackEmpty()paint(Graphics)箱子移动与人物移动的方法。该方法是实现箱子的移动。根据游戏规则,箱子可以在空地之间、目的地之间、空地和目的地之间来回移动。backright(int)/返回右移moveright()/右移操作backleft(int)/返

12、回左移moveleft()/左移操作backdown(int)/返回下移movedown()/下移操作backup(int)/返回上移moveup()/上移操作remove()/移除返回 back()/键盘监听keyReleased(KeyEvent)/释放键盘keyTyped(KeyEvent)/判断键盘操作是否有效keyPressed(KeyEvent)/按下键盘62.3 Sound类(1)将本地音乐读取进程序loadSound() (2)音乐关(开) :默认为开,点击自动关闭音乐和开启音乐. mystop()isplay()(3)更换音乐:从不同的音乐中选取适合玩家的音乐.setMusi

13、c(String)2.4 Readmap类该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。形成地图以二维数组的形式进行存储的,不同的数字有着不同的含义.在地图当中不同的数字代表不同的含义我当时是将 09 解读成为不同的图形与图像. “0“代表“地图以内的空位“; “1“代表“地图中的边缘“; “2“代表“地图以内的空位非点位; “3“代表“地图中的箱子“; “4“代表“点位“; “5“代表“小人面部朝下7“; “6“代表“小人面部朝左“; 课程设计说明书“7“代表“小人面部朝右“; “8“代表“小人面部朝上“; “9“代表“箱子已经到达点位。Readmap

14、(int)/读取地图文件getmap()/获取地图用于在目的地画箱子,传入参数 x、y 指明位置。该类调用getmap()进行输出,83编码实现3.1推 箱 子 游 戏 设 计 源 码import javax.swing.*;import java.awt.event.*;import java.awt.*;import java.io.*;import javax.sound.midi.*;import java.util.Stack;public class hh/程序主方法,游戏由此开始public static void main(String args)/创建游戏界面new main

15、Frame();/显示游戏的主界面,一些常用组件的布局及其相应功能的监听与实现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();9/主界面上的菜单和选项MenuItem renew=new MenuItem

16、(“重新开始“);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 Me

17、nuItem(“默认“);MenuItem eye=new MenuItem(“eyes on me“);MenuItem about=new MenuItem(“关于推箱子“);mainFrame()super(“推箱子咯“);/设置标题setSize(720,720);setVisible(true);/设置窗口可见setResizable(false);setLocation(300,20);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Container cont=getContentPane();cont.setLayout(null)

18、;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);/给选项菜单的菜单项添加监听10renew.addActionListener(this);last.addActionListener(this);next.addActionListener(thi

19、s);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.addActionList

20、ener(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推箱子“,SwingConsta

21、nts. CENTER);lb2=new JLabel(“更换音乐“,SwingConstants. CENTER);add(lb);add(lb2);lb.setBounds(100,20,400,20);11lb.setForeground(Color.white);lb2.setBounds(625,500,55,20);lb2.setForeground(Color.white);/创建按钮btnrenew=new JButton(“重来“);btnback=new JButton(“悔一步“);btnlast=new JButton(“上一关“);btnnext=new JButto

22、n(“下一关“);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.addActio

23、nListener(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,

24、350,80,30);btnover.addActionListener(this);btnchoose.setBounds(625,400,80,30);12btnchoose.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(

25、“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();/对主界面上的一些按钮的功能的监听及实现public void actionPerformed(ActionEvent e)if(e.getSource()=btnrenew|e.getSource()=renew)panel.Tui

26、xiangzi(panel.level);panel.requestFocus();panel.remove();else if(e.getSource()=btnlast|e.getSource()=last)panel.level-;if(panel.levelpanel.maxlevel()panel.level-;JOptionPane.showMessageDialog(this,“本关已是最后一关“);panel.requestFocus();else panel.Tuixiangzi(panel.level);panel.requestFocus();panel.remove()

27、;else if(e.getSource()=exit)System.exit(0);else if(e.getSource()=about)JOptionPane.showMessageDialog(this, “JAVA推箱子“);else if(e.getSource()=btnchoose|e.getSource()=choose)14String lel=JOptionPane.showInputDialog(this,“请输入您要转到的关卡号:(150)“);panel.level=Integer.parseInt(lel);panel.remove();if(panel.leve

28、lpanel.maxlevel()|panel.level1)JOptionPane.showMessageDialog(this, “没有这一关!“);panel.requestFocus();elsepanel.Tuixiangzi(panel.level);panel.requestFocus();else if(e.getSource()=btnfirst)panel.level=1;panel.Tuixiangzi(panel.level);panel.requestFocus();panel.remove();else if(e.getSource()=btnover)panel.

29、level=panel.maxlevel();panel.Tuixiangzi(panel.level);panel.requestFocus();panel.remove();else if(e.getSource()=btnmuc)if(sound.isplay()sound.mystop();15btnmuc.setLabel(“音乐开“);else sound.loadSound();btnmuc.setLabel(“音乐关“);panel.requestFocus();else if(e.getSource()=btnback|e.getSource()=back)if(panel.

30、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;16case 40:panel.backr

31、ight(40);break;case 41:panel.backright(41);break;panel.requestFocus();else if(e.getSource()=nor)jc.setSelectedIndex(0);else if(e.getSource()=qin)jc.setSelectedIndex(1);else if(e.getSource()=guang)jc.setSelectedIndex(3);else if(e.getSource()=eye)jc.setSelectedIndex(4);else if(e.getSource()=po)jc.setS

32、electedIndex(2);17/对音乐选项的操作实现public void itemStateChanged(ItemEvent ie)int no=jc.getSelectedIndex();switch(no)case 0:sound.setMusic(“nor.mid“);if(sound.isplay()sound.mystop();sound.loadSound();btnmuc.setLabel(“音乐关“);nor.setEnabled(false);qin.setEnabled(true);guang.setEnabled(true);eye.setEnabled(tru

33、e);po.setEnabled(true);panel.requestFocus();break;case 1:sound.setMusic(“qin.mid“);if(sound.isplay()sound.mystop();sound.loadSound();btnmuc.setLabel(“音乐关“);nor.setEnabled(true);qin.setEnabled(false);guang.setEnabled(true);eye.setEnabled(true);po.setEnabled(true);panel.requestFocus();break;case 2:18s

34、ound.setMusic(“popo.mid“);if(sound.isplay()sound.mystop();sound.loadSound();btnmuc.setLabel(“音乐关“);nor.setEnabled(true);qin.setEnabled(true);guang.setEnabled(true);eye.setEnabled(true);po.setEnabled(false);panel.requestFocus();break;case 3:sound.setMusic(“guang.mid“);if(sound.isplay()sound.mystop();

35、sound.loadSound();btnmuc.setLabel(“音乐关“);nor.setEnabled(true);qin.setEnabled(true);guang.setEnabled(false);eye.setEnabled(true);po.setEnabled(true);panel.requestFocus();break;case 4:sound.setMusic(“eyes on me.mid“);if(sound.isplay()sound.mystop();sound.loadSound();btnmuc.setLabel(“音乐关“);nor.setEnabl

36、ed(true);qin.setEnabled(true);19guang.setEnabled(true);eye.setEnabled(false);po.setEnabled(true);panel.requestFocus();break;/游戏操作功能的实现class mainpanel extends JPanel implements KeyListenerint max=50;int map,maptmp;int manX,manY,boxnum;Image myImage;Readmap Levelmap;Readmap Levelmaptmp;int len=30;publ

37、ic int level=1;Stack mystack=new Stack();mainpanel()/设置大小setBounds(15,50,600,600);/设置颜色setBackground(Color.white);addKeyListener(this);myImage=new Image10;for(int i=0; i10; i+)20myImagei = Toolkit.getDefaultToolkit().getImage(“pic“+i+“.gif“);setVisible(true);/开始绘制地图void Tuixiangzi(int i)Levelmap=new

38、 Readmap(i);Levelmaptmp=new Readmap(i);map=Levelmap.getmap();manX=Levelmap.getmanX();manY=Levelmap.getmanY();maptmp=Levelmaptmp.getmap();repaint();int maxlevel()return max;public void paint(Graphics g)for(int i=0; i20; i+)for(int j=0; j20; j+)g.drawImage(myImagemapji,i*len,j*len,this);/设置颜色21g.setCo

39、lor(new Color(0,0,0);/设置字体g.setFont(new Font(“楷体_2312“,Font. BOLD,30);/设置关数g.drawString(“现在是第“,150,40);g.drawString(String.valueOf(level),310,40);g.drawString(“关“,360,40);/实现键盘控制移动的方法public void keyPressed(KeyEvent e)if(e.getKeyCode()=KeyEvent.VK_UP)/上移键实现上移方法moveup();if(e.getKeyCode()=KeyEvent.VK_D

40、OWN)/下移键实现下移方法movedown();if(e.getKeyCode()=KeyEvent.VK_LEFT)/左移键实现左移方法moveleft();if(e.getKeyCode()=KeyEvent.VK_RIGHT)/右移键实现右移方法moveright();if(iswin()22if(level=max)/通过最后一关时显示“恭喜您通过最后一关!“JOptionPane.showMessageDialog(this, “恭喜您通过最后一关!“);else/通过非最后一关时显示“恭喜您通过第“关!n是否要进入下一关?“String msg=“恭喜您通过第“+level+“关

41、!n是否要进入下一关?“;int type=JOptionPane.YES_NO_OPTION;String title=“过关“;int choice=0;choice=JOptionPane.showConfirmDialog(null,msg,title,type);/如果选择取消,则退出游戏if(choice=1)System.exit(0);else if(choice=0)level+;Tuixiangzi(level);mystack.removeAllElements();public void keyTyped(KeyEvent e)public void keyReleas

42、ed(KeyEvent e)23/无键盘操作时返回无操作boolean isMystackEmpty()return mystack.isEmpty();int back()return (Integer)mystack.pop();void remove()mystack.removeAllElements();/实现上移操作void moveup()if(mapmanY-1manX=2|mapmanY-1manX=4)if(maptmpmanYmanX=4|maptmpmanYmanX=9)mapmanYmanX=4;elsemapmanYmanX=2;mapmanY-1manX=8;re

43、paint();manY-;mystack.push(10);24else 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 mapmanYma

44、nX=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)25if(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();

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > Java

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报