Java课程设计——超级马里奥闯关小游戏(个人)

一、个人负责模块

        控制马里奥的状态及其运动,检测马里奥的碰撞,并绘制场景中所需要的障碍物,如砖块、水管等,定义障碍物类的重置方法。

二、个人任务简述

 1.控制马里奥的状态及其运动,检测马里奥的碰撞

  1.1  构造Mario的有参构造器

   传入马里奥的坐标位置,并初始化其图片、分数以及生命值,开始线程。

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";
	}
  1.2  控制马里奥的运动

     这段代码主要描述了马里奥的速度和运动状态:左右移动、跳跃、下落、停止以及死亡。死亡时,如果生命值大于1,该场景重置;否则,马里奥彻底死亡,游戏结束。

  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;
		}
	}
1.3 检测是否为最后一个场景

该段代码判断马里奥是否到达最后一关末,并判断旗子是否下落,如果是,则自动控制走到城堡,完整全部游戏,反之,马里奥待在旗帜下,处于向右静止状态。

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";
					}
				}
			}
1.4 检测马里奥的碰撞与死亡

该段代码通过障碍物和马里奥两者坐标的之间的关系的判断,来决定马里奥是否与障碍物发生了碰撞,并且通过判断的结果来对马里奥和障碍物的状态进行相应的变化。当撞到障碍物的时候,根据障碍物的类型进行接下来的判断。

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();
			}
		}

 2.绘制场景中所需要的障碍物,定义障碍物类的重置方法。

2.1 定义私有成员变量并构造Obstruction方法
//坐标
	private int x;
	private int y;
	
	//控制旗子
	private Thread t = new Thread(this);
	
	//类型
	private int type;
	//初始类型
	private int starttype;
	//显示图片
	private BufferedImage showImage = null;
	
	//取得场景
	private BackGround bg;
	
	//构造方法
	public Obstruction(int x,int y,int type,BackGround bg){
		this.x = x;
		this.y = y;
		this.type = type;
		this.starttype = type;
		this.bg = bg;
		setImage();
		if(this.type == 11){
			t.start();
		}
	}

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

  2.2 定义障碍物类的重置方法和图片的改变

  马里奥死亡时,调用reset方法,重置场景,根据状态,显示不同障碍物的图片。

	//重置方法
	public void reset(){
		this.type = starttype;
		this.setImage();
	}
	
	//根据状态改变显示图片
	public void setImage(){
		showImage = StaticValue.allObstructionImage.get(type);
	}
	
   2.3 重写线程run方法

   当马里奥达到旗帜时,如果马里奥y坐标大于420,调用setDown方法,降下旗帜,反之,马里奥自动向下降落。

public void run() {
	// TODO Auto-generated method stub
	while(true){
		if(this.bg.isOver()){
			if(this.y < 420){
				this.y += 5;
			}
			else{
				this.bg.setDown(true);
			}
		}
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

课程设计感想

通过开发超级马里奥闯关小游戏,我深入学习了Java的图形界面和事件处理机制,更深刻了解了Java的面向对象编程思想,锻炼逻辑思维和编程能力的同时,也提高了解决问题的能力。在未来的学习中,我将继续学习Java编程,进一步完善该游戏的功能和细节,并继续开发更多的游戏,将所学知识应用到实际项目中。

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值