Javaでゲーム「スーパーマリオ アップグレード版」を実装

序文

スーパー マリオは、多くの人々の古典的な子供の頃の思い出です. シンプルで人気のあるゲームです. コンピュータが実装されて以来, 多くのコンピュータ プレーヤーに深く愛されてきました. また、社会の急速な発展に伴い、人々の生活のペースはますます速くなっています。
ゲーム「スーパーマリオ アップグレード版」はJava言語で実装され、インターフェース処理にはswing技術を使用し、設計思想はオブジェクト指向思考を採用しています。

メインデザイン

機能メインデザイン

このシステムは、主にスーパー マリオ ゲームの基本操作を完了するためのものです。システムは次の要件を満たす必要があります。
(1) 開始インターフェイスでスペースバーを押してゲームに入ります。
(2) 矢印キーでマリオの動きを操作します。
(3)衝突判定:
A. マリオは移動中に障害物にぶつかると動きを止め、崖の上に移動すると落下してライフを失います。
B. 一部の敵では、マリオが敵の頭の上にジャンプすると敵が姿を消し、そうでない場合、マリオはライフを失います。
(4)マリオが金貨を当てると得点が増え、マリオがライフを3つ失うとゲームオーバー。

メインインターフェースデザイン

  1. Harmony Q バージョンの画像を選択すると、画像の色が調和し、自然になります。

  2. ゲーム インターフェイスのサイズと初期表示位置を修正しました。

  3. ゲームは 900 ~ 600ピクセルのディスプレイを使用し、マリオと障害物には 60 ~ 60ピクセル
    の正方形の写真が使用され、大きな障害物には複数の 60*60 の小さな正方形に分割されます。

機能のスクリーンショット

ゲーム開始:
ここに画像の説明を挿入

マリオの操作動作
ここに画像の説明を挿入
マリオが障害物に衝突
ここに画像の説明を挿入

マリオがライフを全て失うとゲームオーバー
ここに画像の説明を挿入

レベルマップ
ここに画像の説明を挿入
ここに画像の説明を挿入

Big Cliff Scene:
ここに画像の説明を挿入
シーンは Contra から借用
ここに画像の説明を挿入

ここに画像の説明を挿入

ゲームのプレイアビリティを向上させるために、隠されたパスポイントが追加されました
ここに画像の説明を挿入

ここに画像の説明を挿入

コード

マリオクラス


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 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 の核心はオブジェクト指向の考え方であり、最終的にこの概念について何かを実現しました。

ソースコード取得

ブロガーをフォローしたり、ブロガーと無料でチャットしたり、
技術的なガイダンス、プロジェクト プログラムの作成、その他のサービスが必要な場合は、ブロガーに連絡してください

今日で連載100日目28日目。
私をフォローしたり、私のようコメントしたり、ブックマークしたりできます。

おすすめ

転載: blog.csdn.net/qq_40869977/article/details/125731234