Javaで勇者VSドラゴンのプログラムを書いてみた
こんにちは。のわです。
現在、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の資格勉強
にフォーカスしつつ引き続き勉強頑張っていきたいと思います!