基于java+GUL的超级玛丽游戏GUL设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于java+GUL的超级玛丽游戏GUL设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。

文章目录:

  • 基于java+GUL的超级玛丽游戏GUL设计与实现(毕业论文+程序源码)
    • 1、项目简介
    • 2、资源详情
    • 3、关键词:
    • 4、毕设简介:
    • 5、源码下载:

1、项目简介

  1. “超级玛丽”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本游戏中通过总结和分析JAVA游戏的开发流程和代码功能的设计,采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。开发了一款超级玛丽游戏,该游戏主要分为窗体类、场景类、马里奥类、敌人类、障碍物类等几个类。在主程序运行的线程中,用户控制的超级玛丽随方向键的操作而移动,并且可以实现马里奥游戏中的一些基本功能,例如踩死敌人或者顶掉砖块。本游戏采用双缓存技术,解决了游戏过程中的闪屏问题。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。

  2. 本文在介绍Java相关技术和国内外发展现状的基础上,对“超级玛丽”游戏的整个生命周期的各个开发阶段进行了详细地介绍。为了保证程序代码的正确性和功能实现的可靠性,本文还介绍了游戏软件的程序调试过程和功能测试结果。

  3. 超级玛丽小游戏的JAVA程序,进入游戏后首先按空格键开始,利用方向键来控制的马里奥的移动,同时检测马里奥与场景中的障碍物和敌人的碰撞,并判断马里奥的可移动性和马里奥的生命值。当马里奥通过最后一个场景后游戏结束。。
    本系统拥有的角色如下:
    (1)马里奥
    (2)障碍物
    (3)敌人


2、资源详情

项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:21903个字
包含内容:整套源码+完整毕业论文+答辩PPT+辅导视频+运行截图


3、关键词:

面向对象;Java;碰撞检测;超级玛丽


4、毕设简介:

提示:以下为毕业设计的简略介绍,项目源码及完整毕业论文下载地址见文末。

绪论
1.1背景以及现状
Java并不是以游戏编程为目的而被开发的,事实上,游戏编程可能是Java创造者心中的最后一个目标。在过去,妨碍Java发展的是它的运行环境;浏览器和Java类库一起从本质上决定了Java应该用来写哪种类型的应用程序,而高速的游戏和图象则不在其中。这给Java带来了不好的影响,因为人们注意的不是语言,而是它的运行环境。现在,浏览器已经不能控制一切了,Java作为游戏编程语言的另一个机会到来了。Java在过去有一点超前于它的时代,当时市场的动力落后于Java,但是现在Java可以而且已经取得成功。
省略

1.2 Java语言的特点

  1. 平台无关性
    Java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的Java接口。使用Java编写的程序能在世界范围内共享。Java的数据类型与机器无关。
  2. 安全性
    Java的编程类似C++,但舍弃了C++的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针入侵系统。它提供了安全管理器,防止程序的非法访问。
  3. 面向对象
    Java吸收了C++面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。
  4. 分布式
    Java建立在TCP/IP网络平台上,提供了用HTTP和FTP协议传送和接收信息的库函数,使用其相关技术可以十分方便的构建分布式应用系统。
  5. 健壮性
    Java致力与检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的可能性。Java取消了C语言的结构、指针、#define语句、多重继承、goto语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。

1.3 系统运行环境及开发软件:
开发环境:Windows 7;
(2)开发工具:eclipse;
(3)编程语言:Java语言;

1.4 可行性的分析
可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。要达到这个目的,必须分析几种主要的可能解法的利弊,从而判断原定的系统规模和目标是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度。因此,可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。

1.4.1 技术可行性
本游戏是在Windows 7环境下开发的,一般的机器配置就可以了,对机器本身没有太高的要求,一般当前学校或个人电脑完全可满足要求,环境只需装上jdk 1.4或以上版本就行了,Java是现在全球最时髦的开发工具之一,它拥有一套庞大且完善的类库,内置了其他语言需要靠库甚至是操作系统才能支持的功能,拥有一个虚拟机。NeatBeans IDE 5.5是SUN公司开发的Java可视化集成开发工具,是目前最优秀的Java集成开发工具之一。

1.4.2 经济可行性
由于本系统使用到的工具一般机器都具备,使用环境也很简单,开发成本低,本课题研究的内容是涉及网络的游戏对战。
省略

1.4.3 操作可行性
由于在整个系统的开发过程中从操作简便、界面美观、灵活实用的用户要求为出发点,界面设计时充分考虑玩家的感受,界面比较直观,交互性很好,所以操作起来简单明了。

2、需求分析
所谓系统分析,就是指在整个系统开发工程中,解决“做什么”的问题,把要解决哪些问题,满足用户哪些具体的信息需求调查分析清楚,从逻辑上或是说从信息处理的功能需求上提出系统的方案,即逻辑模型,为下一阶段进行物理方案设计,解决怎么办提供依据。

2.1 用户需求分析
超级玛丽这款游戏是很多人童年经典的回忆,是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱。并且随着社会的快速发展,人们的生活节奏越来越快,人们对于童年的美好已经不愿意仅仅停留在回忆阶段。所以利用java语言开发一款超级玛丽游戏正是人们迫切需要的。

2.2功能需求分析
本系统主要是完成超级玛丽游戏的基本操作。本系统需要满足以下几点要求:
(1) 在开始界面按空格键进入游戏。
(2) 利用方向键来控制马里奥的运动。
(3) 碰撞检测:
A.马里奥在运动的过程中如果碰到障碍物则停止运动,在移动到悬崖上方是会掉下去,并失去一条生命。
B.对于有些敌人,如果马里奥跳到敌人头顶上,则敌人消失,否则马里奥失去一条生命。
(4)马里奥顶到金币会增加分数,当马里奥失去3条生命时游戏结束。

2.3界面设计需求分析

  1. 选取和谐Q版的图片,使画面色彩和谐自然。
  2. 固定游戏界面大小与初始显示位置。
  3. 游戏采用900600像素显示,对于马里奥和障碍物选用6060像素的正
    方图片,对于较大的障碍物分割成多个60*60的小正方形。

3、系统概要设计
3.1系统模块设计
首先在对于系统的需求进行了分析,因为设计者的最初是要做一款游戏,所以窗体类必不可少。接下来继续分析,游戏中还需要背景类、障碍物类、敌人类、马里奥类这及格类。其次为了游戏的流畅以及游戏中图片调用的方便,专门为此再设计一个初始化类。

3.1.1窗体类
该类主要用于存放游戏的场景以及其他各类,并且实现KeyListener接口,用于从键盘的按键中读取信息。该类中的一些属性主要包括了用于存放所有场景的list集合 allBG,马里奥类 mario,当前的场景 nowBG以及其他一些游戏中需要的标记等。而且在该类中,运用双缓存的技术使得游戏的流畅度更高,解决了游戏中出现的闪屏问题。

Myframe

  • allBG:List
  • mario:Mario
  • nowBG:BackGround
  • main():void
  • paint():void
  • keyPressed():void
  • kerReleased():void

3.1.2初始化类
用于存放游戏所需要的所有静态文件,在游戏开始的时候将所有文件导入,提高游戏的运行速度。并且在该类中将所有需要用到的图片进行分类,分为障碍物类,马里奥类,敌人类以及背景图片。当游戏运行时可以直接调用这些集合中的图片进行遍历,在调用的时候更加方便,而且可以使马里奥或者敌人在移动的时候产生动态效果。

StaticValue

  • allMarioImage:List
  • startImage:BufferedImage
  • init():void

3.1.3背景类
该类表示马里奥及障碍物和敌人所处的场景,并且将障碍物和敌人绘制到场景中。在该类中包括用于存放敌人和障碍物的list集合,以及当敌人或者障碍物被消灭后用于存放已经消失的敌人和障碍物的集合,这样做是为了在马里奥死亡时重置场景所用的。其次在该类中还使用了控制敌人移动的方法,是为了在程序之初控制敌人静止,然后在玩家点击空格以后在使得敌人开始移动。

BackGround

  • bgImage:BufferedImage
  • isOver:boolean
  • isDown:boolean
  • allEnemy:List
  • removeEnemy:List
  • enemyStartMove():void
  • reset():void

3.1.4马里奥类
用来控制马里奥的行动,并且在该类中加入碰撞检测,判断马里奥是否与障碍物或者敌人发生碰撞。该类中的属性主要定义了马里奥所在的场景,马里奥的移动和跳跃的速度,以及马里奥在移动过程中需要显示的图片。另外该类中还定义了玩家的生命值和所获得的分数。并且在run()方法中还定义了当马里奥到达最后一关的旗子时,玩家将失去对马里奥的控制,剩下的由程序控制走到城堡,完整全部游戏。

Mario

  • x:int
  • y:int
  • xmove:int
  • ymove;int
  • life:int
  • isDead:boolean
  • leftMove():void
  • leftStop():void
  • jump():void
  • down():void
  • dead():void

3.1.5障碍物类
绘制场景中所需要的障碍物,例如地面、砖块、水管等等。该类中的属性包括了障碍物的坐标,障碍物所需要显示的图片等。并且在该类中也定义了障碍物类的重置方法,当马里奥死亡时,场景类会调用该方法。

Obstruction

  • x:int
  • y:int
  • type:int
  • starttype:int
  • showImage:BufferedImage
  • reset():void
  • setImage():void

3.1.6敌人类
该类中主要设置了两种敌人,一种是蘑菇怪,可以被马里奥踩死,另一种是食人花,不能被踩死。该类中的属性包括了敌人的坐标,敌人的初始坐标,需要显示的图片,以及敌人的移动方向和移动范围等。敌人的初始坐标主要是为了当敌人执行重置方法后将敌人的位置还原。

Enemy

  • x:int
  • y:int
  • startx:int
  • starty:int
  • showImage:BufferedImage
  • upMax:int
  • downMax:int
  • reset():void
  • dead():void

3.2系统流程设计:

4、系统详细设计
4.1 设计目标
本软件是针对超级玛丽小游戏的JAVA程序,进入游戏后首先按空格键开始,利用方向键来控制的马里奥的移动,同时检测马里奥与场景中的障碍物和敌人的碰撞,并判断马里奥的可移动性和马里奥的生命值。当马里奥通过最后一个场景后游戏结束。

4.2 系统模块设计
本系统共包括6各类:

4.2.1窗体类
该类主要用于存放游戏的场景以及其他各类,并且实现KeyListener接口,用于从键盘的按键中读取信息。该类中的一些属性主要包括了用于存放所有场景的list集合 allBG,马里奥类 mario,当前的场景 nowBG以及其他一些游戏中需要的标记等。而且在该类中,运用双缓存的技术使得游戏的流畅度更高,解决了游戏中出现的闪屏问题。

public MyFrame(){this.setTitle("玛丽奥");this.setSize(900, 600);//这里是为了获得电脑屏幕的整体大小,以便于下面确定窗体的位置int width = Toolkit.getDefaultToolkit().getScreenSize().width;int height = Toolkit.getDefaultToolkit().getScreenSize().height;this.setLocation((width-900)/2, (height-600)/2);//设置窗体默认不可以被拉伸this.setResizable(false);//初始化图片StaticValue.init();
当这些都设置好以后,接下来就应当在构造方法中绘制了,当然最先应当将游戏的场景绘制到窗体类中,然后在窗体类中还应当绘制马里奥类,这是游戏中必不可少的。当然在绘制场景类的时候因为不知一个场景,所以可以使用循环,将所有的场景全部绘制。然后在将所需要的所有监视设置好以后就可以开启该类的线程了。//使用循环创建全部场景for(int i=1;i<=7;i++){this.allBG.add(new BackGround(i, i==7?true:false));}//将第一个场景设置为当前场景this.nowBG = this.allBG.get(0);//初始化玛丽奥this.mario = new Mario(0, 480);//将玛丽奥放入场景中this.mario.setBg(nowBG);this.repaint();this.addKeyListener(this);this.t = new Thread(this);t.start();//使窗口在关闭的时候,程序也同时停止。this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);
}
在这些最基本的东西设置完以后,还需要一个方法来解决游戏中经常会出现的闪屏问题。这个方法就是双缓存方法,现在类中定义一个BufferedImage的图片,然后从该图片中获取到图片的Graphics  g2,然后利用画笔g2将所要绘制的东西绘制到这个空的图片中,然后在利用窗体类中的paint方法中的画笔g将这个已经绘制好的图片绘制到窗体类中,这样利用空白图片作为程序运行中的中转,就可以很好的解决游戏运行过程中出现的闪屏问题。
public void paint(Graphics g) {//先定义一个图片,然后利用双缓存解决闪屏问题BufferedImage image = new BufferedImage(900, 600, BufferedImage.TYPE_3BYTE_BGR);Graphics g2 = image.getGraphics();//利用上面图片中得到的画笔g2,将所需绘制到图片中if(this.isStart){//绘制背景g2.drawImage(this.nowBG.getBgImage(), 0, 0, this);//绘制生命g2.drawString("生命:    "+this.mario.getLife(), 800, 50);//绘制怪物敌人Iterator<Enemy> iterEnemy = this.nowBG.getAllEnemy().iterator();while(iterEnemy.hasNext()){Enemy e = iterEnemy.next();g2.drawImage(e.getShowImage(), e.getX(), e.getY(), this);}//把缓存图片绘制进去g.drawImage(image, 0, 0, this);
}
当然游戏的宗旨是让玩家和电脑之间的互动,那么就又涉及到一个问题,就是玩家对游戏中的马里奥的控制。我们前面已经说过了该类中必须要实现KeyListener接口,这个接口的作用就是使该类中实现一些方法,以便于达到玩家在游戏进行时可以对游戏中的马里奥进行控制。我们这里拟定对于马里奥的控制可以使用我们常见的四个方向键,即我们说的上下左右。并且通过控制台打印,可以知道上对应的是38,右对应的是39,左对应的是37。并且游戏的设定是开始后游戏不会直接运行,而是要使用空格键以后游戏才会真正开始,所以还要加入当按空格键的时候游戏正式开始,空格键对应的是32。
public void keyPressed(KeyEvent e) {if(this.isStart){//玛丽奥的移动控制if(e.getKeyCode()==39){this.mario.rightMove();}if(e.getKeyCode()==37){this.mario.leftMove();}//跳跃控制if(e.getKeyCode()==38){this.mario.jump();}}else if(e.getKeyCode()==32){this.isStart = true;}
}
对于按键,那么相对应的就是当抬起建的时候。因为你向右移动的时候,如果这时候突然停止,那么很可能马里奥会保持一个运动的状态停下来,那么就必须在玛丽奥停止的时候给他一个指令,让他的移动图片变为静止。相对于运动的时候是类似的,这里不做累述。
public void keyReleased(KeyEvent e) {if(this.isStart){//控制玛丽奥的停止if(e.getKeyCode()==39){this.mario.rightStop();;}if(e.getKeyCode()==37){this.mario.leftStop();;}}当这一切都做好以后,那么最后就应该在类中重写一下run方法了,在这个方法中应当提一下游戏的通关和死亡后的状态。即游戏通关,或者马里奥死亡时应当弹出一个窗口,说明游戏通关或者马里奥死亡,并且点击了这个窗口以后,游戏应当结束,而且整个游戏也应当关闭。
if(this.mario.isDead()){JOptionPane.showMessageDialog(this, "游戏结束");System.exit(0);
}
if(this.mario.isClear()){JOptionPane.showMessageDialog(this, "恭喜游戏通关!");System.exit(0);}

4.2.2初始化类
用于存放游戏所需要的所有静态文件,在游戏开始的时候将所有文件导入,提高游戏的运行速度。并且在该类中将所有需要用到的图片进行分类,分为障碍物类,马里奥类,敌人类以及背景图片。当游戏运行时可以直接调用这些集合中的图片进行遍历,在调用的时候更加方便,而且可以使马里奥或者敌人在移动的时候产生动态效果。

public class StaticValue {public static List<BufferedImage> allMarioImage = new ArrayList<BufferedImage>();public static BufferedImage startImage = null;public static BufferedImage endImage = null;public static BufferedImage bgImage = null;public static List<BufferedImage> allFlowerImage = new ArrayList<BufferedImage>();public static List<BufferedImage> allTriangleImage = new ArrayList<BufferedImage>();public static List<BufferedImage> allObstructionImage = new ArrayList<BufferedImage>();
定义完这些属性之后,剩下的就是初始化了,在该类中定义一个init()方法,这个方法在执行的时候会将所需的所有图片放入到之前定义好的各个集合中。因为图片存放的路径都是一样的,所以为了减少代码量会定义一个公共路径ImagePath。然后就可以利用循环,将存放的图片全部导入进去。//介绍代码量,定义公共路径public static String ImagePath = System.getProperty("user.dir")+"/bin/";//定义方法init(),将图片初始化public static void init(){//利用循环将玛丽奥图片初始化for(int i=1;i<=10;i++){try {allMarioImage.add(ImageIO.read(new File(ImagePath+i+".png")));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//导入背景图片try {startImage = ImageIO.read(new File(ImagePath+"start.jpg"));bgImage = ImageIO.read(new File(ImagePath+"firststage.jpg"));endImage = ImageIO.read(new File(ImagePath+"firststageend.jpg"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//导入玛丽奥死亡图片try {mariDeadImage = ImageIO.read(new File(ImagePath+"over.png"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

4.2.3背景类
该类表示马里奥及障碍物和敌人所处的场景,并且将障碍物和敌人绘制到场景中。在该类中包括用于存放敌人和障碍物的list集合,以及当敌人或者障碍物被消灭后用于存放已经消失的敌人和障碍物的集合,这样做是为了在马里奥死亡时重置场景所用的。其次在该类中还使用了控制敌人移动的方法,是为了在程序之初控制敌人静止,然后在玩家点击空格以后在使得敌人开始移动。并且在第六个关卡处设置了一个隐形通关要点,只有当马里奥顶到这个隐形砖块时才会出现,马里奥就可以借助这个砖块通过关卡。

public class BackGround {//当前场景图片private BufferedImage bgImage = null;//场景顺序private int sort;//是否为最后的场景private boolean flag;//游戏结束标记private boolean isOver = false;在最后一个关卡中,马里奥到达旗杆的位置后就会失去控制,同时旗子将会开始下降,只有等旗子下降完毕后,马里奥才能开始移动,所以这里还要定义一个旗子是否下降完毕的boolean类型的属性isDown,用于判断马里奥什么时候移动。//定义降旗结束private boolean isDown = false;当马里奥失去生命的时候,但是并没有失去所有的生命,那么这个时候应当重置这个场景,将所有消灭掉的障碍物和敌人全部还原。因此除了在该类中除了要定义存放敌人和障碍物的List集合以外,还应当有存放被消灭的敌人或者障碍物的List,当敌人或者障碍物被消灭的时候先放入到这个List中,这样在充值的时候就可以直接将这个集合中的数据在还原到原先的集合里面。//用集合保存敌人private List<Enemy> allEnemy = new ArrayList<Enemy>();//用集合保存障碍物private List<Obstruction> allObstruction = new ArrayList<Obstruction>();//被消灭的敌人private List<Enemy> removeEnemy = new ArrayList<Enemy>();//被消灭的障碍物private List<Obstruction> removeObstruction = new ArrayList<Obstruction>();在游戏的设定中,应当是游戏开始的时候,所有的敌人其实是静止的,而且玩家也不能控制马里奥,必须要等到玩家按空格键开始以后游戏才会进行,那么这里就应当在定义一个方法,即当玩家空格键的时候会调用这个方法,同时游戏中的敌人开始移动,游戏正式开始。这个方法也就是相当于控制敌人开始移动的方法,所以命名为enemyStartMove()方法。//敌人开始移动public void enemyStartMove(){//遍历当前场景中的敌人,使之开始移动for(int i=0;i<this.allEnemy.size();i++){this.allEnemy.get(i).startMove();}}接下来就应当定义背景类的构造方法了,通过获取场景的顺序,即场景的sort,来判断是哪一个场景,同时将场景绘制好。//构造方法public BackGround(int sort,boolean flag){//第一个场景if(sort==1){for(int i=0;i<15;i++){this.allObstruction.add(new Obstruction(i*60, 540, 9,this));}//绘制砖块和问号this.allObstruction.add(new Obstruction(120, 360, 4,this));this.allObstruction.add(new Obstruction(300, 360, 0,this));......}前面提到,如果马里奥死亡,但是却没有失去所有的生命值,那么游戏应当重置,当前场景中的所有敌人和障碍物,也包括马里奥都应当回到初始位置。为了达到这个效果,那么我们的场景类中就必须要定义一个reset()方法,来调用障碍物和场景还有马里奥的各自的重置方法,来使当前的场景还原。并且在这之前我们还要将消灭掉的敌人和障碍物从消灭掉的存放的List中提出来,放回到原来的List中。然后遍历障碍物和敌人的List,使用循环调用他们的重置方法。//重置方法,重置障碍物和敌人public void reset(){//将移除的障碍物和敌人还原this.allEnemy.addAll(this.removeEnemy);this.allObstruction.addAll(this.removeObstruction);//调用障碍物和敌人的重置方法for(int i=0;i<this.allEnemy.size();i++){this.allEnemy.get(i).reset();}for(int i=0;i<this.allObstruction.size();i++){this.allObstruction.get(i).reset();}}

4.2.4马里奥类

用来控制马里奥的行动,并且在该类中加入碰撞检测,判断马里奥是否与障碍物或者敌人发生碰撞。该类中的属性主要定义了马里奥所在的场景,马里奥的移动和跳跃的速度,以及马里奥在移动过程中需要显示的图片。另外该类中还定义了玩家的生命值和所获得的分数。并且在run()方法中还定义了当马里奥到达最后一关的旗子时,玩家将失去对马里奥的控制,剩下的由程序控制走到城堡,完整全部游戏。

public class Mario implements Runnable{//坐标private int x;private int y;//定义玛丽奥所在场景private BackGround bg;//加入线程private Thread t = null;为了玩家在游戏过程中的良好体验,那么对于马里奥的移动速度和跳跃速度就必须要定义好。所以该类里面还应当定义马里奥的移动速度和跳跃速度,其本质就是马里奥在移动过程中坐标加减的值。当然初始值为零,必须等到马里奥构造的时候,再将这些属性赋予相对应的值。在本类中还要定义游戏的分数以及马里奥的生命数,这些都是必不可少的。//移动速度private int xmove = 0;//跳跃速度private int ymove = 0;//状态private String status;//显示图片private BufferedImage showImage;//生命和分数private int score;private int life;在马里奥这个类中,还要定义马里奥的移动和跳跃方法,以便玩家在按下方向键后调用这些方法,来达到控制马里奥的移动。下面是马里奥向左移动的方法,其他方法同理。public void leftMove(){//移动速度xmove = -5;//改变状态//如果当前已经是跳跃,应该保持原有状态,不能再改变if(this.status.indexOf("jumping") != -1){this.status = "left-jumping";}else{this.status = "left-moving";}}......在定义马里奥的跳跃方法的时候,不单单定义一个方法就行,而且还要判断马里奥的状态。如果马里奥是在地面或者是在障碍物的上方,那么马里奥可以进行跳跃,如果马里奥处于空中,那么马里奥就不可以继续跳跃。public void jump(){//判断马里奥是否可以进行跳跃if(this.status.indexOf("jumping") == -1){if(this.status.indexOf("left") != -1){this.status = "left-jumping";}else{this.status = "right-jumping";}ymove = -5;upTime = 36;}}接下来就要写马里奥中的run()方法了,这个方法中的内容相对来说比较麻烦,因为要在这个方法中对马里奥和障碍物或者敌人之间进行逻辑判断,即所谓的碰撞检测。首先在这个类中对马里奥是否处于最后一个场景进行判断,如果马里奥处于最后一个场景,并且坐标大于520,那么说明马里奥已经撞到的旗杆,这个时候马里奥将不会由玩家控制。并且同时调用旗子的移动方法,使旗子进行下落,当旗子下落完毕后给马里奥一个标记,马里奥开始移动到城堡。当马里奥的坐标大于780,即马里奥到达城堡的门口的时候,这个时候游戏结束。public void run() {while(true){//判断是否与障碍物碰撞//定义标记if(this.bg.isFlag() && this.x >= 520){this.bg.setOver(true);if(this.bg.isDown()){//降旗后玛丽奥开始移this.status = "right-moving";if(this.x < 580){//向右this.x += 5;}if(this.x >= 780){//游戏结束this.setClear(true);}然后对当前马里奥所处的场景中的所有障碍物进行遍历,获取到所有障碍物的坐标,通过障碍物的坐标和马里奥的坐标的之间的关系的判断,来决定马里奥是否与障碍物发生了碰撞,并且通过判断的结果来对马里奥和障碍物的状态进行相应的变化。      for(int i=0;i<this.bg.getAllObstruction().size();i++){Obstruction ob = this.bg.getAllObstruction().get(i);//不能向右移动if(ob.getX()==this.x+60&&(ob.getY()+50>this.y&&ob.getY()-50<this.y)){if(ob.getType() != 3){canRight = false;}}......当马里奥撞到障碍物的时候,那么就要根据障碍物的类型进行接下来的判断,如果是砖块或者是问号的话,那么障碍物消失,马里奥被弹回,即马里奥的状态由上升状态变为下落状态,并且将消失掉的障碍物放入相对应的消失的List集合当中。如果障碍物的类型为其他,比如说是石头的话,那么障碍物不变,马里奥直接被弹回。//判断玛丽奥跳跃时是否撞到障碍物if(ob.getY()==this.y-60&&(ob.getX()+50>this.x && ob.getX()-50<this.x)){//如果是砖块if(ob.getType()==0){//移除砖块this.bg.getAllObstruction().remove(ob);//保存到移除的障碍物中this.bg.getRemoveObstruction().add(ob);}为了游戏的可玩性,将会在游戏中加入一个隐藏的陷阱,或者是隐藏的通关点。这个隐藏的障碍物在游戏进行的时候不会显示出来,当然马里奥从他的左右两边过去的时候也不会触发这个隐藏的障碍物,必须是从下方撞到这个障碍物时才会显示出来。同时马里奥由上升状态变为下落状态。而且他和砖块障碍物相同,被顶到后会变为石头,改变类型。//如果是问号||隐藏的砖块if((ob.getType()==4 || ob.getType()==3) && upTime > 0){ob.setType(2);ob.setImage();}//马里奥开始下落upTime = 0;
在游戏中敌人大致可以分为两类。一类是蘑菇怪,这种敌人是可以被杀死的,当马里奥从蘑菇怪的正上方踩到蘑菇怪时,那么蘑菇怪就会被消灭,同时马里奥向上跳起一小段距离。而消失掉的蘑菇怪就会被放到消失掉的敌人的List集合中,等到重置的时候在调用出来。但是如果马里奥从蘑菇怪的左右两边碰到蘑菇怪的话就会失去一条生命,并且重置游戏。第二类是食人花,这种敌人不会被马里奥消灭掉,不论马里奥从哪个方向去碰撞食人花,食人花都不会消失,而且如果马里奥碰到了食人花,自身还会失去一条生命,并且游戏重置,当然前提是马里奥没有失去所有的生命值,否则的话游戏就结束。
首先马里奥对于所有的敌人,如果从左右两边碰撞到敌人,那么马里奥死亡,失去一条生命,游戏重置。//对敌人的判断for(int i=0;i<this.bg.getAllEnemy().size();i++){Enemy e = this.bg.getAllEnemy().get(i);//对于所有的敌人都适用if((e.getX()+50>this.x && e.getX()-50<this.x) && (e.getY()+60>this.y && e.getY()-60<this.y)){//玛丽奥死亡this.dead();}//这里开始区分敌人的类别,对于不同的敌人做出不同的反应if(e.getY()==this.y+60 && (e.getX()+60>this.x && e.getX()-60<this.x)){if(e.getType() == 1){e.dead();this.upTime = 10;this.ymove = -5;}else if(e.getType() == 2){this.dead();}}

4.2.5障碍物类
绘制场景中所需要的障碍物,例如地面、砖块、水管等等。该类中的属性包括了障碍物的坐标,障碍物所需要显示的图片等。并且在该类中也定义了障碍物类的重置方法,当马里奥死亡时,场景类会调用该方法。

public class Obstruction implements Runnable{//坐标private int x;private int y;//控制旗子private Thread t = new Thread(this);前面说过,当马里奥顶到问好或者是隐藏的砖块时,那么这个障碍物的类型就会改变,变为石头。那么在障碍物这个类里面就必须要定义一个属性stype,这个属性用于表示当前障碍物的类型,以便于变化形态的时候调用。这个类型的值就可以用初始化类中的相对应的List集合里面的下标表示。既然有改变,就要有恢复,所以还要定义一个不变的type,命名为starttype,这个属性是为了当游戏重置的时候,障碍物可以通过调用这个属性恢复到最初始的状态。而且不同的状态对应不同的显示图片,所以还要有showImage属性。//类型private int type;//初始类型private int starttype;//显示图片private BufferedImage showImage = null;//取得场景private BackGround bg;在该类中还要写入reset()方法,这个方法是为了当马里奥死的时候调用重置方法,对已经被消灭掉的障碍物进行重置。因为有的障碍物被顶掉以后会给变类型和图片,所有还要定义一个setImage()方法,用来改变障碍物的显示图片。//重置方法public void reset(){this.type = starttype;this.setImage();}//根据状态改变显示图片public void setImage(){showImage = StaticValue.allObstructionImage.get(type);}最后该类中的run方法主要是为了控制最后一个场景中的旗子的移动,并且在旗子移动完毕后要设置一个标记,并且将该标记表示给马里奥类,这样马里奥就可以开始自主移动了。if(this.bg.isOver()){if(this.y < 420){this.y += 5;}else{//设计标记为true,即表示马里奥可以开始移动了this.bg.setDown(true);}

4.2.6敌人类
该类中主要设置了两种敌人,一种是蘑菇怪,可以被马里奥踩死,另一种是食人花,不能被踩死。该类中的属性包括了敌人的坐标,敌人的初始坐标,需要显示的图片,以及敌人的移动方向和移动范围等。敌人的初始坐标主要是为了当敌人执行重置方法后将敌人的位置还原。

public class Enemy implements Runnable{//坐标private int x;private int y;//加入线程private Thread t = null;当马里奥失去一条生命值的时候,游戏会被重置,敌人回回到初始的位置,所以还要定义另外两个int属性startx和starty,用来当游戏进行重置的时候,可以根据这个初始坐标回复敌人的位置。//初始坐标private int startx;private int starty;对于不同的敌人,所显示的图片肯定是不同的,所以要定义一个现实的图片属性showImage,并且在马里奥中,马里奥要通过判断敌人的类型,来决定是马里奥死亡,还是敌人死亡,对于不同的敌人有不同的反应,所以还要在该类中定义一个type属性,用来表示敌人的类型。//怪物类型private int type;//显示图片private BufferedImage showImage;对于敌人里面的食人花而言,他是在水管中直上直下的,所以他的上下移动应当有一个界限,不论是向上移动还是向下移动,都不能超过这个界限,否则的话食人花就会从水管中飞出来或者是移动到MyFrame外面了。//移动范围private int upMax = 0;private int downMax = 0;在这个类中应当有两个构造方法,对于不同的敌人,所需要的属性都是不同的。并且在两个类中都有一个共同的代码,那就是要在开启线程后应当先将线程挂起。这是为了配合游戏在开始的时候敌人不移动,必须要等到玩家按空格键的时候才会开始,所以先将线程挂起来,当点击空格键以后在将线程开启。//蘑菇怪的构造方法public Enemy(int x,int y,boolean isLeft,int type,BackGround bg){... ...this.t = new Thread(this);t.start();t.suspend();}接下来是写敌人类中的run()方法了,该方法主要是为了控制蘑菇怪以及食人花敌人的移动的。因为不同的敌人在不同的场景中有不同的移动方法,所以对于敌人的移动而且,首先要判断敌人的类型和敌人所处的场景。public void run() {while(true){//判断怪物类型if(type==1){if(this.isLeftOrUp){this.x -= 5;}else{this.x += 5;}... ...在游戏中,当马里奥死亡的时候会对整个场景中的障碍物进行重置,当然敌人也不例外。当马里奥死亡的时候,不仅要将所有被消灭的敌人全部显示出来,即从消灭的List中还原到原来的敌人List中,并且敌人的状态和坐标也要进行重置。要将敌人的坐标还原到最开始的坐标,而且把图片进行还原。并且在重置方法中也要对敌人的类型进行判断,使得敌人的类型和他的显示图片相对应。public void reset(){//还原坐标this.x = this.startx;this.y = this.starty;//还原图片if(this.type == 1){this.showImage = StaticValue.allTriangleImage.get(0);}else if(this.type == 2){this.showImage = StaticValue.allFlowerImage.get(0);}}最后在该类中定义一个死亡方法,主要是针对蘑菇怪被消灭的时候所调用的方法。在这个方法中要定义蘑菇怪死亡的时候的显示图片,也就是蘑菇怪被踩扁的图片。并且要将这个敌人从相对应的场景的敌人集合中除去,放入别消灭的敌人的List集合。public void dead(){//死亡图片this.showImage = StaticValue.allTriangleImage.get(2);//从原来的List集合中删除,让入被消灭的List集合中this.bg.getAllEnemy().remove(this);this.bg.getRemoveEnemy().add(this);}
}

5、系统的实现
5.1游戏开发所需要的图片
5.1.1马里奥的所有图片

这组图片中包含了马里奥的移动,跳跃以及死亡的图片:

5.1.2游戏中障碍物的图片
这组图片中包含了游戏中的各种障碍物,以及最后通过关卡的旗帜图片还有设置陷阱的隐形图片:
A.地面及普通障碍物图片

B.用于设置陷阱的隐形图片

C.水管类图片

D.最后场景中的旗帜图片

5.1.3游戏中怪物的图片
这组图片中包含了游戏中所有的敌人图片,以及敌人被消灭时的图片:
A.食人花的图片


B蘑菇怪的图片以及被消灭时的图片.


C.乌龟的图片以及被消灭时的图片




5.1.4游戏中的背景图片

这组图片中有一张游戏中的背景图片(图5.1)和一张马里奥通关时的最后一关的背景图片(图5.2):

图5.1

图5.2

5.1.5游戏开始时的图片

在游戏的最开始会显示该图片(图5.3),然后玩家按空格键开始游戏,之后游戏才正式开始运行。

图5.3

5.2游戏设计的界面
5.2.1 游戏逻辑展示
这一组图片中包括了一些系统中的逻辑图片,如马里奥的控制移动示例图片(图5.4),玩家通过方向键控制马里奥的移动、跳跃等功能;马里奥与障碍物进行碰撞之后的效果图片(图5.5),这张图片中显示了马里奥再与障碍物碰撞后,问号会消失变成石头,而且砖块会被撞碎;玩家控制游戏开始的图片(图5.6),游戏打开后并不会立即运行,必须等到玩家按空格键启动游戏后游戏才会正式开始;当马里奥失去所有的生命以后,游戏结束(图5.7);如果马里奥顺利通过所有关卡,那么游戏同样结束(图5.8)。

图5.4

图5.5

图5.6

图5.7

图5.8

5.2.1 游戏逻辑展示
这一组图片中主要对游戏的关卡进行展示,其中包括第一关(图5.9),马里奥顺利通过第一管来到第二关(图5.10),第三关的场景(图5.11),第四关的大悬崖场景(图5.12),第五关的场景借鉴了魂斗罗(图5.13),第六关的高墙(图5.14),在这一个关卡中为了提升游戏的可玩性,加了一个隐藏的过关要点,只有找到这个要点才能通过(图5.15),第七关也是最后一关的场景(图5.16)。

图5.9

图5.10

图5.11

图5.12

图5.13

图5.14

图5.15

图5.16

6、系统测试
6.1 测试的意义
系统测试是为了发现错误而执行程序的过程,成功的测试是发现了至今尚未发现的错误的测试。 测试的目的就是希望能以最少的人力和时间发现潜在的各种错误和缺陷。应根据开发各阶段的需求、设计等文档或程序的内部结构精心设计测试用例,并利用这些实例来运行程序,以便发现错误。系统测试是保证系统质量和可靠性的关键步骤,是对系统开发过程中的系统分析系统设计和实施的最后复查。根据测试的概念和目的,在进行信息系统测试时应遵循以基本原则。

6.2 测试过程
省略

6.3 测试结果
程序运行正常,没有发现什么太大的错误。

7、总结与展望

7.1 总结
省略

7.2 设计中的不足之处
省略

7.3 展望
省略

致 谢
省略

外文原文
省略

外文翻译
省略


5、源码下载:

本项目源码及论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。

序号 毕业设计全套资源(点击下载)
本项目源码 基于java+GUL的超级玛丽游戏GUL设计与实现(源码+文档)_JAVA_GUL_超级玛丽游戏GUL.zip

【java毕业设计】基于java+GUL的超级玛丽游戏GUL设计与实现(毕业论文+程序源码)——超级玛丽游戏相关推荐

  1. java毕业设计——基于JSP+mysql的BBS论坛系统设计与实现(毕业论文+程序源码)——论坛系统

    基于JSP+mysql的BBS论坛系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+mysql的BBS论坛系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  2. java毕业设计——基于JSP+access的旅游管理系统设计与实现(毕业论文+程序源码)——旅游管理系统

    基于JSP+access的旅游管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+access的旅游管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  3. java毕业设计——基于JSP+sqlserver的网上购物系统设计与实现(毕业论文+程序源码)——网上购物系统

    基于JSP+sqlserver的网上购物系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+sqlserver的网上购物系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

  4. java毕业设计——基于JSP+sqlserver的学生信息管理系统设计与实现(毕业论文+程序源码)——学生信息管理系统

    基于JSP+sqlserver的学生信息管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+sqlserver的学生信息管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下 ...

  5. java毕业设计——基于JSP+sqlserver的房产中介系统设计与实现(毕业论文+程序源码)——房产中介系统

    基于JSP+sqlserver的房产中介系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+sqlserver的房产中介系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

  6. java毕业设计——基于JSP+mysql的图书馆借阅系统设计与实现(毕业论文+程序源码)——图书馆借阅系统

    基于JSP+mysql的图书馆借阅系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+mysql的图书馆借阅系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  7. asp毕业设计——基于asp+access的新闻发布系统设计与实现(毕业论文+程序源码)——新闻发布系统

    基于asp+access的新闻发布系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的新闻发布系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  8. asp毕业设计——基于asp+access的网上选题系统设计与实现(毕业论文+程序源码)——网上选题系统

    基于asp+access的网上选题系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的网上选题系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  9. asp毕业设计——基于asp+access的web人事管理系统设计与实现(毕业论文+程序源码)——人事管理系统

    基于asp+access的web人事管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的web人事管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

  10. asp毕业设计——基于asp+access的毕业生信息管理系统设计与实现(毕业论文+程序源码)——毕业生信息管理系统

    基于asp+access的毕业生信息管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的毕业生信息管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

最新文章

  1. 设计模式学习笔记-原型模式
  2. python 写入csv文件固定列_将元组列表写入csv文件保持列一致
  3. SQL Stored Procedure Generator
  4. Apache、Nginx、Tomcat的区别
  5. React系列---Babel
  6. unity 镜面反射_Unity | Diffuse Light漫反射光照
  7. 如何将shapefile进行拆分
  8. php 怎么看nginx,查看nginx是否启动
  9. I wish one day, I can be that large tree, giving shadow to you!
  10. 关于maven modules开发时候,eclipse的dubug模式不能找到源代码
  11. Factory Method 抽象工厂模式(创建型)
  12. 算法笔记_面试题_2.移动零(将数组的的0元素移到末尾)
  13. VMware Cloud Director 10.3 发布(下载) - 云计算调配和管理平台
  14. 【Opengl】Glut下载与环境配置
  15. DOSBox安装流程
  16. VMware 10激活码
  17. 几百万数据量的Excel导出会内存溢出和卡顿?那是你没用对方法!
  18. php 0 加减乘除,php 加减乘除计算器 用php简单实现加减乘除计算器
  19. 洛谷 P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
  20. javaweb之msql学习笔记

热门文章

  1. python 海龟交易法则_【手把手教你】用Python量化海龟交易法则
  2. 如何通过AWS Route53注册域名
  3. 比A100性能高4.5倍!英伟达H100横扫AI推理基准测试
  4. 【Godot】节点的碰撞与碰撞掩码的计算
  5. 阿里巴巴李云的一封信
  6. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之RegexFeaturizer
  7. 小米AX9000安装docker的Portainer面板从社区版升级到商业版参考
  8. 自己家里的电脑架设传奇外网教程
  9. 诺基亚n1 android 6.0,数据解读诺基亚N1:安卓平板王者之争
  10. 从电音元素到游戏手机:燃爆ROG电竞潮玩夜