JAVA 实现《超级玛丽升级版》游戏

Posted 毅慎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA 实现《超级玛丽升级版》游戏相关的知识,希望对你有一定的参考价值。

前言

超级玛丽这款游戏是很多人童年经典的回忆,是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱。并且随着社会的快速发展,人们的生活节奏越来越快,人们对于童年的美好已经不愿意仅仅停留在回忆阶段。
《超级玛丽升级版》游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。

主要设计

功能主要设计

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

界面主要设计

  1. 选取和谐Q版的图片,使画面色彩和谐自然。

  2. 固定游戏界面大小与初始显示位置。

  3. 游戏采用900600像素显示,对于马里奥和障碍物选用6060像素
    的正方图片,对于较大的障碍物分割成多个60*60的小正方形。

功能截图

游戏开始:

马里奥的控制移动

马里奥与障碍物进行碰撞

当马里奥失去所有的生命以后,游戏结束

关卡图

大悬崖场景:

场景借鉴了魂斗罗

为了提升游戏的可玩性,加了一个隐藏的过关要点

代码实现

马里奥类


public class Mario implements Runnable
	//坐标
	private int x;
	private int y;
	//定义玛丽奥所在场景
	private BackGround bg;
	//加入线程
	private Thread t = null;
	//移动速度e
	private int xmove = 0;
	//跳跃速度
	private int ymove = 0;
	//状态
	private String status;
	//显示图片
	private BufferedImage showImage;
	//生命和分数
	private int score;
	private int life;
	
	//当前移动中的图片
	private int moving = 0;
	
	//跳跃时间
	private int upTime = 0;
	
	//标记玛丽奥是否死亡
	private boolean isDead = false;
	
	//完成游戏,游戏结束
	private boolean isClear = false;
	
	//构造方法
	public Mario(int x,int y)
		this.x = x;
		this.y = y;
		//初始化玛丽奥图片
		this.showImage = StaticValue.allMarioImage.get(0);
		this.score = 0;
		this.life = 3;
		
		this.t = new Thread(this);
		t.start();
		
		this.status = "right-standing";
	
	
	
	public void leftMove()
		//移动速度
		xmove = -5;
		//改变状态
		//如果当前已经是跳跃,应该保持原有状态,不能再改变
		if(this.status.indexOf("jumping") != -1)
			this.status = "left-jumping";
		else
			this.status = "left-moving";
		
	
	
	public void rightMove()
		xmove = 5;
		if(this.status.indexOf("jumping") != -1)
			this.status = "right-jumping";
		else
			this.status = "right-moving";
		
	
	
	public void leftStop()
		this.xmove = 0;
		if(this.status.indexOf("jumping") != -1)
			this.status = "left-jumping";
		else
			this.status = "left-standing";
		
	
	
	public void rightStop()
		this.xmove = 0;
		if(this.status.indexOf("jumping") != -1)
			this.status = "right-jumping";
		else
			this.status = "right-standing";
		
	
	
	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 = -10;
			upTime = 18;
		
	
	
	//下落方法
	public void down()
		if(this.status.indexOf("left") != -1)
			this.status = "left-jumping";
		else
			this.status = "right-jumping";
		
		ymove = 10;
	
	//死亡方法
	public void dead()
		this.life--;
		if(this.life == 0)
			this.isDead = true;
		else
			this.bg.reset();
			this.x = 0;
			this.y = 480;
		
	
	
	public int getX() 
		return x;
	


	public int getY() 
		return y;
	

	public BufferedImage getShowImage() 
		return showImage;
	


	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;
					else
						if(this.y < 480)
							//向下
							this.y += 5;
						
						this.x += 5;
						if(this.x >= 780)
							//游戏结束
							this.setClear(true);
						
					
				else
					//如果为最后一个场景,同事Mario的x坐标到了550,游戏结束
					//自动控制玛丽奥
					if(this.y < 420)
						this.y += 5;
					
					if(this.y >= 420)
						this.y = 420;
						this.status = "right-standing";
					
				
			else
				boolean canLeft = true;
				boolean canRight = true;
				//能否跳跃标记
				boolean onLand = false;
					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;
						
					
					//不能向左移动
					if(ob.getX()==this.x-60 && (ob.getY()+50>this.y && ob.getY()-50<this.y))
						if(ob.getType() != 3)
							canLeft = false;
						
					
					//判断能否跳跃
					if(ob.getY()==this.y+60 && (ob.getX()+60>this.x && ob.getX()-60<this.x))
						if(ob.getType() != 3)
								onLand = true;
							
						
						//判断玛丽奥跳跃时是否撞到障碍物
						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)
								//增加分数
								score += 10;
								ob.setType(2);
								ob.setImage();
							
							upTime = 0;
						
					
				
				//对敌人的判断
				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 = 5;
							this.ymove = -10;
							//敌人死亡,增加分数
							score += 10;
						else if(e.getType() == 2)
							this.dead();
						
					
				
				
				
				
				if(onLand && upTime == 0)
					if(this.status.indexOf("left") != -1)
						if(xmove != 0)
							this.status = "left-moving";
						else
							this.status = "left-standing";
						
					else
						if(xmove != 0)
							this.status = "right-moving";
						else
							this.status = "right-standing";
						
					
				else
					//上升状态
					if(upTime != 0)
						upTime--;
					else
						this.down();
					
					y += ymove;
				
				
				if(this.y>600)
					this.dead();
				
				
				
				if(canLeft && xmove<0 || canRight && xmove>0)
					x += xmove;
					if(x<0)
						x = 0;
					
				
			
			
			//默认向右
			int temp = 0;
			//向左状态
			if(this.status.indexOf("left") != -1)
				temp += 5;
			 
			
			//判断是否移动
			if(this.status.indexOf("moving") != -1)
				temp += this.moving;
				moving++;
				if(moving==4)
					this.moving = 0;
				
			
			
			if(this.status.indexOf("jumping") != -1)
				temp += 4;
			
			
			//改变显示图片
			this.showImage = StaticValue.allMarioImage.get(temp);
			
			try 
				Thread.sleep(50);
			 catch (InterruptedException e) 
				// TODO Auto-generated catch block
				e.printStackTrace();
			
		
	

	public void setBg(BackGround bg) 
		this.bg = bg;
	

	public void setX(int x) 
		this.x = x;
	

	public void setY(int y) 
		this.y = y;
	

	public boolean isDead() 
		return isDead;
	


	public int getScore() 
		return score;
	


	public void setScore(int score) 
		this.score = score;
	


	public int getLife() 
		return life;
	


	public void setLife(int life) 
		this.life = life;
	

	public boolean isClear() 
		return isClear;
	

	public 以上是关于JAVA 实现《超级玛丽升级版》游戏的主要内容,如果未能解决你的问题,请参考以下文章

超级玛丽

Java实现超级玛丽,老程序员的国庆假期泡汤了!

python实现超级玛丽小游戏(动图演示+源码分享)

P1000 超级玛丽游戏

超级玛丽需求分析

无代码iVX编程实现简单跳跃超级玛丽游戏