Javaで勇者VSドラゴンのプログラムを書いてみた

f:id:nowa0402:20210425160737p:plain
こんにちは。のわです。
現在、Javaのプログラムを勉強しています。
今回は、初めて自分で考え作成したプログラムを載せてみます。
タイトルは『勇者vsドラゴン』

まずはコードから
【Main.java

package com.nowa0402.sample;

public class Main {

	public static void main(String[] args) {
		Hero h = new Hero();
		Dragon d = new Dragon();
		boolean heroDie = false;
		boolean dragonDie = false;
		System.out.println("名前を入れてください");
		h.name = new java.util.Scanner(System.in).nextLine();
		System.out.println(h.name + "が生まれました!");
		System.out.println("これからドラゴン退治が始まります!");
		System.out.println("ドラゴンが出てきた!");
		
		System.out.println(h.name + "の現HPは" + h.hp + "です。");
		System.out.println(h.name + "の現MPは" + h.mp + "です。");
		System.out.println("回復、攻撃呪文を唱えるたびにMPは5消費されます");
     // ここから戦闘ブロック
		do {
     // 勇者側のターン。選択権を与えています。
			System.out.println(h.name + "はどうする?");
			System.out.print("1:攻撃 2:回復 3:攻撃呪文");
			int select = new java.util.Scanner(System.in).nextInt();
		// 入力値によって処理が変化
			switch (select) {
			case 1:
				h.attack(d);
				break;
			case 2:
				h.heal();
				break;
			case 3:
				h.fireBoll(d);
				break;
			}
	  // ドラゴンのターン前にドラゴンのHPが0以下か確認
			if(d.hp <= 0) {
			//もし体力がなければドラゴンが倒れ、返り値「true」がdragonDieに入る
				dragonDie = d.die();
			} else {
			//体力が残っていればドラゴンのターン、確立で【攻撃】が【火の息】か分ける
			int dSelect = new java.util.Random().nextInt(5);
			if(dSelect <= 3) {
				d.attack(h);
			} else {
				d.fire(h);
			}
		// 勇者の体力が残っているか判定
			if(h.hp <= 0) {
			//勇者の体力が0以下の場合、勇者は力尽きてゲームオーバー
				heroDie = h.die();
			} else {
			// 体力が残っている場合、残りHPとMPをお知らせ
				System.out.println(h.name + "の残HPは" + h.hp + "です。");
				System.out.println(h.name + "の残MPは" + h.mp + "です。");
			}
			}
		// 繰り返し判定「勇者とドラゴンどちらも力尽きていない場合は【do】まで戻る」
		} while (heroDie == false && dragonDie == false);
		// 最終判定「ドラゴンが力尽きたか、勇者が力尽きたかでメッセージが変わる」
		if(dragonDie == true) {
			System.out.println("見事ドラゴンを倒しました!やったね☆");
		} else if(heroDie == true) {
			System.out.println("ドラゴンを倒せませんでした。また挑戦してね!");
		}
		// 最終メッセージ
		System.out.println("遊んでくれてありがとうございました!!");
	}

}


【Hero.java

package com.nowa0402.sample;

public class Hero {
	int hp;
	int mp;
	String name;
	
	public Hero() {
		this.hp = 100;
		this.mp = 50;
	}
	
	public void attack(Dragon d) {
		System.out.println(this.name + "の攻撃!");
		d.hp -= 10;
		System.out.println("10ポイントのダメージを与えた!");
	}
	
	public boolean die() {
		System.out.println(this.name + "は力尽きた...");
		System.out.println("GAME OVER");
		return true;
	}
	
	public void heal() {
		System.out.println(this.name + "は回復呪文を唱えた!");
		if (this.mp >= 5) {
			this.mp -= 5;
			int healHp = 50;
			this.hp = Math.min(100, healHp + this.hp);
			System.out.println(this.name + "は50ポイント回復した!");
		} else {
			System.out.println("魔力が足りません!");
		}
	}
	
	public void fireBoll(Dragon d) {
		System.out.println(this.name + "は攻撃呪文を唱えた!");
		if (this.mp >= 5) {
			this.mp -= 5;
			d.hp -= 20;
			System.out.println(this.name + "は火の玉を繰り出した!");
			System.out.println("20ポイントのダメージを与えた!");
		} else {
			System.out.println("魔力が足りません!");
		}
	}
	
}


【Dragon.java

package com.nowa0402.sample;

public class Dragon {
	int hp;
	
	public Dragon() {
		this.hp = 200;
	}
	
	public void attack(Hero h) {
		System.out.println("ドラゴンの攻撃!");
		h.hp -= 10;
		System.out.println(h.name + "は10ポイントのダメージを受けた!");
	}
	
	public boolean die() {
		System.out.println("ドラゴンは倒れた!");
		return true;
	}
	
	public void fire(Hero h) {
		System.out.println("ドラゴンは火の息を繰り出した!");
		h.hp -= 20;
		System.out.println(h.name + "は20ポイントのダメージを受けた!");
	}
}

Hero.javaとDragon.javaでフィールドとメソッドを作成。
Main.javaでシナリオを進めています。

個人的に考えたのは『繰り返し処理を何で判定するか』です。
繰り返し処理はwhile文になります。
判定基準はどちらかのHPが0になることまではイメージできていました。
それをどうやって表現するか。。。


考えた結果、私の答えは
『booleanで返り値つけて判定するか』
でした。

booleanは簡単に説明すると『真偽値』
正しければ『true』を間違っていれば『false』を返します。

つまり
『繰り返し処理を何で判定するか』については
『繰り返し処理は勇者、ドラゴンがどちらかが倒れていれば抜け出す』
になります。


この処理を実現したのが以下の文になります。

【Hero.java

public boolean die() {
		System.out.println(this.name + "は力尽きた...");
		System.out.println("GAME OVER");
		return true;
	}

【Dragon.java

public boolean die() {
		System.out.println("ドラゴンは倒れた!");
		return true;
	}

【Main.java

while (heroDie == false && dragonDie == false);

Hero.javaとDragon.javaのDieメソッドに返り値『true』を付けています

Main.javaでは繰り返し判断(while文)で
 ○どちらか倒れていれば(trueの返り値が来ていたら)繰り返し終了
 ○どちらも生きていれば(trueの返り値が来ていない)繰り返し処理『do』の位置まで戻る
を実現しています。


今回のプログラム紹介は以上になります。

ただ、これから修正していきたい点はたくさんあります。
例えば
・名前の入力後にその名前で問題ないか問い合わせる。
・選択肢で数字を間違えたら、再度選択肢画面に戻る
・勇者以外の職も作ってみる
・ドラゴンだけではなく他のモンスターも作る
などなど...

まずは『一つ作り上げる』
これを目標にしていたので達成できて良かったです!


今後は
・このプログラムをアップデートしていくこと
Java Silverの資格勉強
にフォーカスしつつ引き続き勉強頑張っていきたいと思います!