推箱子-Java课程设计.doc

上传人:jian****018 文档编号:9422515 上传时间:2020-04-05 格式:DOC 页数:50 大小:905.53KB
返回 下载 相关 举报
推箱子-Java课程设计.doc_第1页
第1页 / 共50页
推箱子-Java课程设计.doc_第2页
第2页 / 共50页
推箱子-Java课程设计.doc_第3页
第3页 / 共50页
点击查看更多>>
资源描述
面向对象程序设计课程设计报告题 目: 经典推箱子趣味游戏设计与实现 院 (系): 信息科学与工程学院 专业班级: 计算机科学与技术1201班 学生姓名: 程伟 学 号: 20121183011 指导教师: 吴奕 20 14 年 12 月 29 日至20 15 年 1 月 9 日华中科技大学武昌分校制 面向对象程序设计 课程设计任务书一、设计(调查报告/论文)题目经典推箱子趣味游戏设计与实现二、设计(调查报告/论文)主要内容内容:本游戏要求用户将游戏地图中所有放置着的箱子推到指定的地点来完成游戏,用户通过绕开地图中的障碍物将可移动的箱子推到目的地,游戏的难度在于要求用户通过合理的路径安排来使所有的箱子最后都到达目的地。游戏一共50关,随着关数的升高,游戏的难度随之增大。 基本功能与要求:1初始化游戏界面设计2地图的绘制3每一关都按照数组重新绘制地图4小人与箱子的移动5完成悔一步的操作。三、原始资料1.面向对象程序设计课程设计指导书2. 耿祥义JAVA大学实用教程北京:清华大学出版社,2009四、要求的设计(调查/论文)成果1.课程设计报告2.课程设计软件五、进程安排布置任务,查找资料、需求分析1天总体设计1天详细设计1.5天编制源程序实现3.5天测试与修改1天撰写课设报告2天六、主要参考资料1 张广彬. Java课程设计案例精编(第二版).北京:清华大学出版社, 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游戏源码94系统测试42总结451需求与总体设计1.1需求分析1.1.1功能结构图推箱子游戏的功能结构图如图1.1所示。在系统中,编写4个Java类:mainFrame,mainpanel,Sound,Readmap;分别对应初始化游戏界面,游戏操作,背景音乐,绘制地图。 图1.11.1.2 UML类图推箱子系统除了上述4个Java类外,还需要Java系统提供的一些重要的类。这些类之间的UML图如图1.2所示。图1.21.2总体设计1.2.1 mainFrame类mainFrame类负责创建系统的主窗口。mainFrame类有多种重要类型的对象,这些对象构成了游戏界面的简明与美观,并且通过监听实现方法赋予了这些组件的相应功能。MainFrame类通过调用Readmap类来实现将地图绘制在游戏主界面,通过调用Sound类来实现对背景音乐的管理,实现音乐开关以及选择上一曲下一曲的操作。设计中包括了所有你所能直观见到的图形界面,窗体的大小,下拉菜单中的功能菜单,使得玩家能够很直观的见到所有游戏中的功能.界面中有菜单, 包括:选项设置音乐帮助。按钮包括:重来悔一步第一关上一关下一关最终关选关音乐等。1.2.2 mainpanel类Mainpanel类中集成了小人与箱子的移动规则,并且还包含了对键盘操作移动的响应方法。在本游戏系统中,给人的视觉感受应该是能感受都动作的变化,逼真的人物动作会使系统更有效.通过控制人物,箱子,空地,障碍物在数组中的位置的改变来控制移动动作.小人与箱子移动的算法移动中包括正移动,与悔一步的负移动. 正移动:小人上下左右的移动是由本组咸英智组员所做,归结起来上下左右是一个判断的算法,判断都是通过判断小人前面是否是空位箱子或者是墙,如果没有就移动;有的话,据判断箱子是否可以移动,最后讨论箱子推过的,小人移动,以及被遮挡住点的图形变化,重新绘制地图,算法判断完毕. 1.2.3 Sound类 Sound类主要功能是播放背景音乐,包含了一些对音乐的操作方法。在玩游戏的同时听一听动听的音乐,有助于舒缓疲劳,放松心情。1.2.4 Readmap类Readmap类是绘制地图的类,将已经制作好的地图绘制在游戏界面上。其主要功能是给用户一个友好的游戏界面,游戏中包括50 关的地图,推箱子这个游戏的50 个地图是事先完成的,将所有地图上面的信息以数字的形式储存在一个20*20 的二维数组当中;然后,每一关都按照数组重新绘制地图,这样就拥有了50 张地图。2详细设计2.1 mainFrame类MainFrame类用于初始化屏幕。该类首先用两个for循环初始化屏幕20*20范围内的状态,初始化为0,以后根据实际情况重新赋值;然后设置屏幕输出状态,设置寄存器AX的高位为0,低位为3,表示以80*25的彩色方式显示;最后移动光标到指定的位置输出。设置界面的标题,窗口大小,添加按钮组件以及各种组件的布局super(推箱子咯);/设置标题setSize(720,720);setVisible(true);/设置窗口可见setResizable(false);/创建按钮btnrenew=new JButton(重来);btnback=new JButton(悔一步);btnlast=new JButton(上一关);btnnext=new JButton(下一关);btnchoose=new JButton(选关);btnfirst=new JButton(第关);btnover=new JButton(最终关);btnmuc=new JButton(音乐关);actionPerformed(ActionEvent)itemStateChanged(ItemEvent)2.2 mainpanel类该类用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。小人与箱子移动的算法移动中包括正移动,与悔一步的负移动. 正移动:小人上下左右的移动是由本组咸英智组员所做,归结起来上下左右是一个判断的算法,判断都是通过判断小人前面是否是空位箱子或者是墙,如果没有就移动;有的话,据判断箱子是否可以移动,最后讨论箱子推过的,小人移动,以及被遮挡住点的图形变化,重新绘制地图,算法判断完毕.传出数据记录在,一个栈当中,以备悔一步使用. 负移动:通过记录在栈中的数据判断,前一步是的移动方向以及移动使用过的算法,逆向将代码重新运行,同时绘制地图以达到前一步的状态.Mainpanel类中包含了(1)重来:重新开始当前关; (2)悔一步:返回上一移动状态(可以连续返回多步) (3)第一关:游戏系统默认开始关为第一关,此按钮可以将关从其它关跳跃到第一关. (4)上一关:返回到当前关的上一关; (5)下一关:返回到当前关的下一关; (6)最终关:跳跃到最后一关,即第五十关; (7)选关:选择想要玩的关; (8)音乐关(开) :默认为开,点击自动关闭音乐和开启音乐. (9)更换音乐:从不同的音乐中选取适合玩家的音乐.键盘操作的方法iswin()/判断是否获胜isMystackEmpty()paint(Graphics)箱子移动与人物移动的方法。该方法是实现箱子的移动。根据游戏规则,箱子可以在空地之间、目的地之间、空地和目的地之间来回移动。backright(int)/返回右移moveright()/右移操作backleft(int)/返回左移moveleft()/左移操作backdown(int)/返回下移movedown()/下移操作backup(int)/返回上移moveup()/上移操作remove()/移除返回back()/键盘监听keyReleased(KeyEvent)/释放键盘keyTyped(KeyEvent)/判断键盘操作是否有效keyPressed(KeyEvent)/按下键盘2.3 Sound类(1)将本地音乐读取进程序loadSound() (2)音乐关(开) :默认为开,点击自动关闭音乐和开启音乐. mystop()isplay()(3)更换音乐:从不同的音乐中选取适合玩家的音乐.setMusic(String)2.4 Readmap类该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。形成地图以二维数组的形式进行存储的,不同的数字有着不同的含义.在地图当中不同的数字代表不同的含义我当时是将09 解读成为不同的图形与图像. 0代表地图以内的空位; 1代表地图中的边缘; 2代表地图以内的空位非点位; 3代表地图中的箱子; 4代表点位; 5代表小人面部朝下; 6代表小人面部朝左; 课程设计说明书7代表小人面部朝右; 8代表小人面部朝上; 9代表箱子已经到达点位。Readmap(int)/读取地图文件getmap()/获取地图用于在目的地画箱子,传入参数x、y指明位置。该类调用getmap()进行输出,3编码实现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 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(重新开始);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(推箱子咯);/设置标题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推箱子,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();/对主界面上的一些按钮的功能的监听及实现public void actionPerformed(ActionEvent e)if(e.getSource()=btnrenew|e.getSource()=renew)panel.Tuixiangzi(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();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)String lel=JOptionPane.showInputDialog(this,请输入您要转到的关卡号:(150);panel.level=Integer.parseInt(lel);panel.remove();if(panel.levelpanel.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.level=panel.maxlevel();panel.Tuixiangzi(panel.level);panel.requestFocus();panel.remove();else if(e.getSource()=btnmuc)if(sound.isplay()sound.mystop();btnmuc.setLabel(音乐开);else sound.loadSound();btnmuc.setLabel(音乐关);panel.requestFocus();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)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.setSelectedIndex(2);/对音乐选项的操作实现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(true); 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:sound.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();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.setEnabled(true);qin.setEnabled(true);guang.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;public 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+) myImagei = Toolkit.getDefaultToolkit().getImage(pic+i+.gif);setVisible(true);/开始绘制地图void Tuixiangzi(int i)Levelmap=new 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);/设置颜色g.setColor(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_DOWN)/下移键实现下移方法movedown();if(e.getKeyCode()=KeyEvent.VK_LEFT)/左移键实现左移方法moveleft();if(e.getKeyCode()=KeyEvent.VK_RIGHT)/右移键实现右移方法moveright();if(iswin()if(level=max)/通过最后一关时显示恭喜您通过最后一关!JOptionPane.showMessageDialog(this, 恭喜您通过最后一关!);else/通过非最后一关时显示恭喜您通过第关!n是否要进入下一关?String msg=恭喜您通过第+level+关!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 keyReleased(KeyEvent e)/无键盘操作时返回无操作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;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();
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑环境 > 建筑工程


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!