




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 面向对象程序设计专业教育教学文*#档课程设计报告专业教%育&教学*文档题 目: 超级玛丽软件的设计与实现 院 (系): 信息科学与工程学院 专业班级: 计算机科学与技术1201班 学生姓名: 程伟 学 号: 20211183011 专*业教育教#学文档指导教师: 吴奕 专业&教育教*#%学文档20 14 年 12 月 29 日至20 15 年 1 月 9 日专业教育教学文#*&档专*业教育%#教学文档华中科技大学武昌分校制 面向对象程序设计 课程设计任务书一、设计(调查报告/论文)题目超级玛丽软件的设计与实现二、设计(调查报告/论文)主要内容内容:开发超级玛丽能够在场
2、景中完成各种动作,并且有场景的切换功能。设计一个Mario类、一个场景类、以及敌人类、障碍物类。实现有一定的挑战的休闲单机小游戏。 基本功能与要求:设计一个超级玛丽游戏实现以下功能:1、 点击“空格”可以使游戏人物进行跳跃。2、 点击方向键左右可以使游戏人物前进或者后退。3、 设计障碍物,增加游戏的难度。4、 设计敌人类,增加游戏难度。5、 设计跳跃踩死敌人或者跳跃越过障碍物,保证可以正常前进。6、 保证通过所有障碍后可以通关。三、原始资料1.面向对象程序设计课程设计指导书2. 耿祥义JAVA大学实用教程北京:清华大学出版社,2022四、要求的设计(调查/论文)成果1.课程设计报告2.课程设计
3、软件五、进程安排布置任务,查找资料、需求分析1天总体设计1天详细设计1.5天编制源程序实现3.5天测试与修改1天撰写课设报告2天六、主要参考资料1 张广彬. Java课程设计案例精编(第二版).北京:清华大学出版社, 2022. 2 耿祥义. Java课程设计(第二版).北京:清华大学出版社, 2022.3 耿祥义JAVA大学实用教程北京:清华大学出版社,20224 邹林达陈国君 Java2程序设计基础北京:清华大学出版社,20215 邹林达Java2程序设计基础实验指导北京:清华大学,2021指导教师(签名): 20 年 月 日目录专%业教*育教学文#档1需求与总体设计5专业教&育教
4、%学文*档1.1需求分析51.2程序功能图5专业教育教学&#文档1.3程序类图62详细设计72.1 MyFrame实现7窗体对象的序列图7详细类图82.2 Mario实现8对象的序列图8类图92.3 Enemy类的实现102.4 Obstruction类的实现11专业教#育教学%文档&2.5 BackGround类实现113编码实现123.1 MyFrame类的详细代码123.2 BackGround类的详细代码133.3 Mario类的详细代码163.4 Enemy类的详细代码243.5 Obstruction类的详细代码314系统测试33专*业教&育教学文#档4.1
5、 游戏开始界面的测试33专%业#*教育教学文档&4.2 游戏运行的测试334.3 排除错误的处理36总 结37 1需求与总体设计1.1需求分析提供一个友好的用户交互界面,简单明了容易操作。并且游戏有一定的难度和娱乐性。开发一个Mario类。一个场景类,以及敌人类,障碍物类。让超级玛丽能够在场景中完成各种动作。并且有场景的切换等等功能。游戏中设计了一些很有意思的陷阱,玩家一步小心掉入陷阱,超级玛丽就会死亡。这样会给人意想不到的惊奇,达到娱乐大众,增加游戏难度的效果。游戏的设计匠心独具,并且都经过了各种测试,除了为玩家增加一些意想不到的游戏陷阱以外,还必须保证玩家能够通关。专业教育教%*学
6、文&档1.2程序功能图专业教育%*教学&文档如图1所示:专业教#育教学%&文档图11.3程序类图专业&教育%教#学文档系统的整体类图的框架如图2所示。首先是窗体类。他需要调用到Mario和BackGround类中的方法。以便动态的显示Mario类和BackGround。而BackGround里面又包含了Enemy和Obstruction。Enemy,Obstruction和Mario类又调用静态类StaticValue的方法,用以显示真实的图片。而StaticValue则是一个静态类,将存储在硬盘的图片资源加载进入内存以便其他模块调用。专业教*育%教学文档专#业
7、教育教学文*档%图2专业教#育%教学文档*2详细设计2.1 MyFrame实现窗体对象的序列图窗体对象继承了JFrame类并且实现了Runnable接口。作为窗体对象,它首先显示窗体,绘制背景。然后启动线程。在run方法里面动态得绘制窗体中需要显示的Mario的图片,障碍物的图片,敌人的图片。该窗体的run方法是一个死循环,每次执行一个 循环调用sleep方法睡眠50毫秒。序列图如图3所示。专#业教育教&学文档*%图3private Mario mario;/Mario对象专&业教*#育教学文档private boolean isStart = false;/标识游戏是否已经开
8、始this.paintAllEnemys(g2);/绘制所有的敌人this.paintAllObstruction(g2);/绘制所有障碍物专%业教育教学文档#*&2.2 Mario实现专*业&教育教%学文档因为需要有一个专门的线程来实时监测Mario的移动状况,和障碍物和敌人的碰撞情况。所以让Mario类继承了Runnable接口。Mario先启动线程。该线程的run方法也是一个死循环。首先根据Mario的状态changeMarioImage方法修改Mario的显示图片。再根据Mario的determinexy方法决定Mario的移动。然后通过deterMarioWithOb
9、struction方法检测Mario和障碍物之间的碰撞,在根据marioTouchEnemys方法检测Mario和敌人之间的碰撞。然后调用sleep()方法让线程休息5毫秒。如此结束一个循环。序列图如图4所示。图4类图中:private int x;/Mario的x坐标专业#&教育教*学文档private int y;/Mario的y坐标专业教育教学#文%档private int life;/Mario的生命BackGround bg = null;/Mario所在的背景专业教育教学文#&*档private int uptime;/Mario的上升时间String status
10、;/Mario的移动状态int score;/Mario的分数Thread t;/Mario的线程int xmove;/Mario的x移动距离int ymove;/Mario的y移动距离private boolean isClear = false;/标识用户是否通关。isClear为true时代表用户通关了2.3 Enemy类的实现private int x;/敌人的x坐标private int y;/敌人的y坐标private int startX;/敌人的初始x坐标private int startY;/敌人的初始y坐标private boolean startIsLeftOrUp;/敌
11、人初始的移动方向private int startImageType;/初始的显示图片private int type;/敌人的类型1代表蘑菇,2代表食人花,3代表乌龟private BufferedImage bufferedImage;专业教育教学*文档%&private BackGround bg;/障碍物所在的背景private int imageType;/移动的极限范围专业教&育%教学文*档详细类图如下:2.4 Obstruction类的实现private int x;/障碍物的x坐标private int y;/障碍物的y坐标专业&教%育教学#文档priv
12、ate BufferedImage showImage = null;/障碍物的显示图片private int type;/障碍物的类型private int startType;/障碍物的初始类型private BackGround bg;/标识该障碍物在哪一个场景中专#%业教&育教学文档详细类图如下:专业教育教学*文#档&专业教#育教学*文&档2.5 BackGround类实现专业教育%教学文*档private int sort;/背景的序列号专#业教育教&学文*档%private boolean flag;/标识是否是最后一张图片,flag为true时代表
13、到了最后一张图片private boolean isOver = false;/标识游戏是否已经结束private boolean isDown = false;/标志是否降旗结束详细类图如下:3编码实现源代码专业#教%育教&学文档专&业教育教学文档*专业&教#育教学文%档public class MyFrame extends JFrame implements KeyListener,Runnable专*业教育教学#文档public static void main(String args)new MyFrame();private List<BackGrou
14、nd> allBg = new ArrayList<BackGround>();专业教*育教学&文档/当前背景private BackGround nowBg = null;专业教*%育教学#&文档private Mario mario;/Mario对象专*&业教育教学文档%private boolean isStart = false;/标识游戏是否已经开始专业教育教学&文#档public void setNowBg(BackGround nowBg) this.nowBg = nowBg;专业教育教学文#&*档专业教育教%&
15、学*文档private Thread t;/*专*业教&育教学文#档 */public MyFrame()this.setSize(900,600);this.setTitle("马里奥游戏");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);int width = Toolkit.getDefaultToolkit().getScreenSize().width;int height = Toolkit.getDefaultToolkit().getScreenSize().height;this.setLo
16、cation(width - 900) / 2,(height - 600) / 2);this.addKeyListener(this);StaticValue.init();this.setVisible(true);专业教育教学%文档#/绘制出所有的背景for(int i = 1; i <= 4; i+)专业教育教学#文档&this.mario = new Mario(0, 480);专业教育教学文%&#档专业教育教学%#文档this.setResizable(false);专业*教育&教学文档t = new Thread(this);t.start();O
17、verride专业教育教&%学#文*档public void paint(Graphics g)BufferedImage image = new BufferedImage(900, 600, BufferedImage.TYPE_4BYTE_ABGR);if(isStart)专*#%业教育教&学文档Graphics g2 = image.getGraphics();this.paintAllEnemys(g2);/绘制所有的敌人专业教育%#教学*文档this.paintAllObstruction(g2);/绘制所有障碍物elseGraphics g2 = image.ge
18、tGraphics();g2.drawImage(StaticValue.startImage, 0, 0, this);/绘制游戏开始的图片g.drawImage(image, 0, 0, this);/* */Overridepublic void keyPressed(KeyEvent e)专业教育教学文#*档专*业教%育#教学文档/int k = e.getKeyCode();专业#教育%教&学文档/获得键盘的ASCII码/if(this.isStart)if(e.getKeyCode() = 39)if(e.getKeyCode() = 37)专*业#教育教学文档专*业教育教
19、学&文#%档if(e.getKeyCode() = 32)/按下空格键,Mario的生命加10if(70 = e.getKeyCode()专业*教育教学#文档elseif(e.getKeyCode() = 32)this.isStart = true;/* */Overridepublic void keyReleased(KeyEvent e)if(e.getKeyCode() = 39)if(e.getKeyCode() = 37)专%业教育教*学#&文档/* */Override专业&教育*教学文档#public void keyTyped(KeyEvent e)
20、/ TODO Auto-generated method stub专%业教#育教学*文&档专业教育%教学文*档Overridepublic void run()while(true)this.repaint();oNewBackGround();/进入下一张图片专业教育教学文档&#*专业#教%育教学文档*JOptionPane.showMessageDialog(this, "恭喜您通关了,敬请期待新的关卡");专业教育%*教学文档&#System.exit(0);专业教*育#教学文档this.gameOver();/游戏结束专业&a
21、mp;教育%教#学文档this.sleep();专&%业教育教学文档*#/进入下一张图片private void intoNewBackGround()专业教育教*%学文档&#专业教育教*#学文&档/绘制所有的敌人private void paintAllEnemys(Graphics g2)while(iterEnemy.hasNext()专业教育教学文%#档Enemy e = iterEnemy.next();g2.drawImage(e.getBufferedImage(), e.getX(), e.getY(), this);专*业教%育&教学文档/绘制
22、所有障碍物private void paintAllObstruction(Graphics g2)while(iter.hasNext()专业教*育教学&文档Obstruction ob = iter.next();g2.drawImage(ob.getShowImage(), ob.getX(), ob.getY(), this);g2.drawImage(mario.getShowImage(), mario.getX(), mario.getY(), this);private void sleep()专业教育&教学文%档*try专&业教育教%*学#文档Thre
23、ad.sleep(20);catch (InterruptedException e)e.printStackTrace();专业教#育教学文&档/游戏结束专业教*育教学%&文档private void gameOver()JOptionPane.showMessageDialog(this, "马里奥死亡");System.exit(0);class BackGroundprivate BufferedImage bgImage = null;private int sort;/背景的序列号专业*教育教学文&#档private boolean fl
24、ag;/标识是否是最后一张图片,flag为true时代表到了最后一张图片private List<Enemy> allEnemy = new ArrayList<Enemy>();/所有敌人的集合/所有障碍物的集合private List<Obstruction> allObstruction = new ArrayList<Obstruction>();/所有被移除的敌人的集合private List<Enemy> removeEnemy = new ArrayList<Enemy>();/所有被移除的障碍物的集合pri
25、vate List<Obstruction> removeObstruction = new ArrayList<Obstruction>();private boolean isOver = false;/标识游戏是否已经结束private boolean isDown = false;/标志是否降旗结束public boolean isDown() return isDown;public void setDown(boolean isDown) this.isDown = isDown;public boolean isOver() return isOver;p
26、ublic void setOver(boolean isOver) 专业教育教学*%文档this.isOver = isOver;专业&教育教学*文档%public boolean isFlag() 专业教育教学*#文档return flag;专业教*#育教学&文档public void setFlag(boolean flag) this.flag = flag;专业&教育教%学*文档public int getSort() return sort;public void setSort(int sort) 专业教%&育教学文档this.sort = sor
27、t;专业%*教育教学文#档专业教育#教学%文档*public BufferedImage getBgImage()专*业教&%育教学文档return bgImage;public List<Obstruction> getAllObstruction()return allObstruction;public List<Obstruction> getRemoveObstruction() return removeObstruction;专业教育&教#学文档*public List<Enemy> getAllEnemy() return a
28、llEnemy;专业教育教*学文#档%专业教%育教&学文档public List<Enemy> getRemoveEnemy() return removeEnemy;/* * * param sort背景的序列号 * param flag标识是否是最后一张背景专业教*育教学&文档 */public BackGround(int sort, boolean flag)this.sort = sort;this.flag = flag;专业教&育教学文%档#*if(flag)bgImage = StaticValue.endImage;专业教育教学*#文档专#
29、*&业教育教学文%档elsebgImage = StaticValue.bgImage;switch(sort)case 1:this.creat1Map();break;case 2:this.creat2Map();break;专#*&业教育教学文档case 3:this.creat3Map();break;专业*教%育教学文档case 4:专业教#育%教学&文档this.creat4Map();break;专#业教育&%教学文档public void reset()专业*#教%育教&学文档专%&#*业教育教学文档专业*教&育教学文#
30、档%专业教育&教#%学文档专业#教育&教学文档*专业*教育教学#文档public void enemysStartMove()专业教育%教#学文档&*/创建第一张图private void creat1Map()专%业教育*教学#&文档for(int i = 0; i < 15; i+)/创建出所有地面/创建出所有砖块,10代表问好,0代表木块专业#教&育教学文档*专业教&育教学文档*#专业%教*育教学#文档/创建水管专业教育教学文#*档%专业#教育%教&学文档/创建出所有的敌人,1代表三角菇,2代表食人花专业教育教学文%&
31、档专业*教#%育教学文档专业*教&育教学文#档%专业教育教学文#*&档%/创建第二张图private void creat2Map()for(int i = 0; i < 15; i+)if(i != 10)专业教*%育教学#&文档/创建水管专*#业教育%教学文档专*业教育教学文#%档/创建水管专%业#&教育教学文档专&业教育教学*文档/创建水管专业教育&教学文%档#*/创建砖块for(int i = 0; i < 6; +i)专业教#育教学文%档/创建敌人专业教%育&教学*文档专业教#育&教学文%档专*业教育教学%文
32、档#/创建第三张图private void creat3Map()for(int i = 0; i < 15; i+)/创建出所有地面/创建砖块专业教育&%*教学文档专业#教&育教学*文档/创建敌人专业*教#%育教学文档private void creat4Map()for(int i = 0; i < 15; i+)/创建出所有地面/绘制旗子/绘制旗子下面的砖块专业教育%教&学文档#专业教育教学文%档#class Enemy implements Runnable 专业教&育%教学#文档private int x;/敌人的x坐标private in
33、t y;/敌人的y坐标private int startX;/敌人的初始x坐标private int startY;/敌人的初始y坐标private boolean startIsLeftOrUp;/敌人初始的移动方向private int startImageType;/初始的显示图片private int type;/敌人的类型1代表蘑菇,2代表食人花,3代表乌龟private BufferedImage bufferedImage;专业教育教#学文%档private BackGround bg;/障碍物所在的背景专业教&%育教学文档*/敌人的显示图片,不同的type代表不同的敌人
34、显示图片,通过显示图片的切换,达到动态的效果专&业教育#教学%文*档private int imageType;/移动的极限范围private int upMax;private int downMax;private boolean isLeftOrUP;专业教育%#教学文&档*Thread t = new Thread(this);/普通敌人的构造方法,加入显示图片参数public Enemy(int x, int y, boolean isLeft, int type, int imageType, BackGround bg)this.x = x;this.y = y;
35、专%#业教育教学文档this.startX = x;this.startY = y;专业教育教学文#档*this.isLeftOrUP = isLeft;this.startIsLeftOrUp = isLeft;this.type = type;this.bg = bg;this.imageType = imageType;this.startImageType = imageType;switch(type)case 1:/蘑菇/取蘑菇的图片专业*教&育教学文#档break;case 3:/乌龟专业教育教学&文#档*break;专%业教育教学文档*t.start();/启动
36、线程t.suspend();/抑制线程启动专业教育教学&文*档#/普通敌人的构造方法public Enemy(int x, int y, boolean isLeft, int type, BackGround bg)专%业教育教学文档*&专%业*教育教#学文档this.x = x;this.y = y;this.startX = x;专业教育教学*#文档this.startY = y;专*业教育%#教学文档this.isLeftOrUP = isLeft;this.startIsLeftOrUp = isLeft;this.type = type;this.bg = bg;s
37、witch(type)专业#*教%育教&学文档case 1:/蘑菇专*业教育&教学%文档/取蘑菇的图片专业教育教学&文#档break;case 3:/乌龟break;专业教育#教学文档*t.start();/启动线程t.suspend();/抑制线程启动专业教#育%教学&文*档专业教*&育教%学文档/食人花敌人的构造方法public Enemy(int x, int y, boolean isUp, int type, int upMax, int downMax, BackGround bg)this.x = x;this.y = y;this.sta
38、rtX = x;this.startY = y;专业教育#教学&文档this.isLeftOrUP = isUp;this.bg = bg;this.type = type;this.upMax = upMax;this.downMax = downMax;if(2 = type)/取食人花图片专业教育教%*学文档&t.start();/启动线程t.suspend();/抑制线程启动/当Mario死亡的时候重置敌人的方法public void reSet()专业%教育教*学文档this.x = this.startX;this.y = this.startY;this.isLe
39、ftOrUP = this.startIsLeftOrUp;专业*教育&教%学文档#this.imageType = this.startImageType;专业*教育教学文&#档switch(this.type)case 1:break;case 2:专业教育教学文%档*this.isLeftOrUP = true;break;case 3:专业教#育&教学文%档*break;专业教#育教学文档*&/敌人死亡的方法专业%教#*育教学文档public void dead()switch(this.type)case 1:/蘑菇/将显示图片改为敌人死亡的图片专&a
40、mp;业教育教学文档*break;case 3:/乌龟/将显示图片改为敌人死亡的图片this.imageType = 4;break;public void run()while(true)this.sleep();switch(this.type)case 1:/蘑菇this.triangleMove();/蘑菇移动break;case 2:/食人花this.flowerMove();/食人花移动break;专业教育&%教学文档专业%*教育教学文#档case 3:/乌龟this.turtleMove();/乌龟移动break;专&业教#育教学文%档专&业%教育教学*文
41、档public BufferedImage getBufferedImage() return bufferedImage;public int getStartX() return startX;专&业教育%教学文档#public int getStartY() return startY;public int getX() return x;public int getY() return y;public int getType() return type;专业教#育教%学文档专业教&育教*学文档#专*业#教育教&学文档public void starMove()
42、专业*教育&教%学文档/蘑菇移动private void triangleMove()if(this.isLeftOrUP)this.x -= 2;elsethis.x += 2;/改变imageType来让敌人的图片切换,达到动态的效果if(0 = this.imageType)专业教育教学%文档*this.imageType = 1;elsethis.imageType = 0;专业教*育教学%文#&档/定义用来标记敌人是否可以向左或者向右移动的标记专%业*教育教学文&档boolean canleft = true;boolean canright = true;b
43、oolean onLand = false;专业教育教学*文%档for(int i = 0; i < bg.getAllObstruction().size(); i+)Obstruction ob = bg.getAllObstruction().get(i);/敌人不能向右移动if(this.x = ob.getX() - 50 && (this.y < ob.getY() + 50) && (this.y > ob.getY() - 50)canright = false;/敌人不能向左移动if(this.x = ob.getX() +
44、50 && (this.y < ob.getY() + 50) && (this.y > ob.getY() - 50)专*业教%育#教学文档canleft = false;专#业教%&育教学文档if(this.y = ob.getY() - 60) && (this.x < ob.getX() + 50) && (this.x > (ob.getX() - 50)onLand = true;if(!onLand)专%业教育教学*文&档this.down();/如果敌人正在向左移动,但是又不
45、能向左移动了,那么改变敌人的移动方向if(this.isLeftOrUP && !canleft) | 0 = this.x)this.isLeftOrUP = false;/如果敌人正在向右移动,但是又不能向右移动了,那么改变敌人的移动方向专#*业教育&教%学文档if(!this.isLeftOrUP && !canright) | 840 = this.x)this.isLeftOrUP = true;专业教育%#&教学文档专业教育教&#学文档/通过imageType获取在内存中真正的图片专业教&育%教学文*档/食人花移动专业
46、教%育教#学*文档private void flowerMove()专业教%育教学文档&if(this.isLeftOrUP)this.y -= 2;elsethis.y += 2;专业#教育教学文档&/当食人花到达极限位置的时候,修改它移动的方向if(!this.isLeftOrUP && this.y = this.upMax)this.isLeftOrUP = true;else if(this.isLeftOrUP && this.y = this.downMax)this.isLeftOrUP = false;专*业教育教学#文档/改变imageType来让敌人的图片切换,达到动态的效果if(0 = this.imageType)this.imageType = 1;elsethis.imageType = 0;/通过imageType获取在内存中真正的图片/乌龟移动专业#教育教学文*档%private void turtleMove()if(thi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论