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

	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 void setClear(boolean isClear) {
	this.isClear = isClear;
}

}


马里奥




小怪



public class Enemy implements Runnable{
//坐标
private int x;
private int y;
//初始坐标
private int startx;
private int starty;
//怪物类型
private int type;
//显示图片
private BufferedImage showImage;
//移动方向
private boolean isLeftOrUp = true;
//移动范围
private int upMax = 0;
private int downMax = 0;
//加入线程
private Thread t = null;

//定义图片变化
private int imageType = 0;

//定义所在场景
private BackGround bg ;


//蘑菇怪
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.type = type;
	this.bg = bg;
	
	if(type==1){
		this.showImage = StaticValue.allTriangleImage.get(0);
	}
	this.t = new Thread(this);
	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.startx = x;
	this.starty = y;
	this.isLeftOrUp = isUp;
	this.type = type;
	this.upMax = upMax;
	this.downMax = downMax;
	this.bg = bg;
	
	if(type==2){
		this.showImage = StaticValue.allFlowerImage.get(0);
	}
	this.t = new Thread(this);
	t.start();
	t.suspend();
}

public void run() {
	while(true){
		//判断怪物类型
		if(type==1){
			if(this.isLeftOrUp){
				this.x -= 5;
			}else{
				this.x += 5;
			}
			if(imageType==0){
				imageType = 1;
			}else{
				imageType = 0;
			}
			
			//定义标记
			boolean canLeft = true;
			boolean canRight = 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)){
					canRight = false;
				}
				//不能向左移动
				if(ob.getX()==this.x-60 && (ob.getY()+50>this.y && ob.getY()-50<this.y)){
					canLeft = false;
				}
			}
			
			if(!canLeft && this.isLeftOrUp || this.x == 0){
				this.isLeftOrUp = false;
			}else if(!canRight && !this.isLeftOrUp || this.x == 840){
				this.isLeftOrUp = true;
			}
			
			this.showImage = StaticValue.allTriangleImage.get(imageType);
		}
		if(type==2){
			if(this.isLeftOrUp){
				this.y -=5;
			}else{
				this.y +=5;
			}
			if(imageType==0){
				imageType = 1;
			}else{
				imageType = 0;
			}
			if(this.isLeftOrUp && this.y == this.upMax){
				this.isLeftOrUp = false;
			}
			if(!this.isLeftOrUp && this.y == this.downMax){
				this.isLeftOrUp = true;
			}
			this.showImage = StaticValue.allFlowerImage.get(imageType);
		}
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

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

public void dead(){
	//死亡图片
	this.showImage = StaticValue.allTriangleImage.get(2);
	
	this.bg.getAllEnemy().remove(this);
	this.bg.getRemoveEnemy().add(this);
	
}
public int getX() {
	return x;
}
public int getY() {
	return y;
}
public BufferedImage getShowImage() {
	return showImage;
}
public void setBg(BackGround bg) {
	this.bg = bg;
}
public int getType() {
	return type;
}

public void startMove(){
	t.resume();
}

}


## 总结


通过此次的《超级玛丽升级版》游戏实现,让我对JAVA的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。


java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。


## 源码获取


点赞,关注博主后,私聊博主免费获取  
 需要技术指导,写项目程序,等更多服务请联系博主



> 
> 今天是持续写作的第 28 / 100 天。  
>  可以关注我,点赞我、评论我、收藏我啦。
> 
> 
> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值