Java:勇者vs魔王ゲーム [勉強]
「クラス継承とインターフェース実装の図解」っていうブログ記事でも書きましたが、クラス、サブクラス、インターフェイスを使って、勇者と魔王が闘うRPGクラスを作りました。
結構大変だったんですよ。
最後は無理やり魔王と勇者のHPを500に設定して、勇者が与えるダメージ値にMath.random()を使ってるんですけど、それにかける値を150とかかなり数値を上げたり・・・。
たぶん、魔王と勇者が五分五分ぐらいに闘えるバランスになったんじゃないかなぁ~って思います。
ということで・・・・・・
以下、各クラスおよびインターフェースです。
以下、スーパークラスのCharacterクラスのソースです。
abstract class Charactor{
int HP;
String name;
Charactor(int hp , String name){
HP = hp;
this.name = name;
}
public String toString(){
return name + "のHPは" + HP + "です";
}
// ダメージを戻り値として返す
abstract int attack();
// HPが0になったかの判定
abstract boolean dead();
// ダメージを受ける
abstract void damage(int d);
// プログラムを終了する
abstract void run_away();
}
で、次がサブクラスのうちの1つ、勇者クラス(私はYushaではなくBraveManにしましたが)のソースです。
public class BraveMan extends Charactor implements Knight, Wizard {
BraveMan(int hp, String name) {
super(hp, name);
}
public int kiru() {
int n = (int)(Math.random() * 150) + 1;
return n;
}
public int naguru() {
int n = (int)(Math.random() * 150) + 1;
return n;
}
public int keru() {
int n = (int)(Math.random() * 250) + 1;
return n;
}
public int Fire() {
int n = (int)(Math.random() * 300) + 1;
return n;
}
public int Ice() {
int n = (int)(Math.random() * 300) + 1;
return n;
}
int attack() {
int n = (int)(Math.random() * 100) + 1;
return n;
}
boolean dead() {
if (HP < 0) {
return true;
} else {
return false;
}
}
void damage(int d){
HP -= d;
}
void run_away() {
System.out.println(name + "は逃げました");
System.exit(0);
}
}
で、次はもうひとつのサブクラスである魔王クラス(Bossクラス)のソースです。
ublic class Boss extends Charactor implements Wizard {
Boss(int hp, String name) {
super(hp, name);
}
public int Fire() {
int n = (int)(Math.random() * 200) + 1;
return n;
}
public int Ice() {
int n = (int)(Math.random() * 200) + 1;
return n;
}
int attack() {
int n = (int)(Math.random() * 150) + 1;
return n;
}
boolean dead() {
if (HP < 0) {
return true;
} else {
return false;
}
}
void damage(int d){
HP -= d;
}
void run_away() {
System.out.println(name + "は逃げました");
System.exit(0);
}
}
次はインターフェース(表記はインターフェイスじゃダメなのかな?)で・・・
戦士インターフェイスのソースです。
interface Knight{
// 斬る攻撃
int kiru();
// 殴る攻撃
int naguru();
// 蹴る攻撃
int keru();
}
で、次は魔法使いインターフェイスのソースです。
interface Wizard{
// 火で攻撃
int Fire();
// 氷で攻撃
int Ice();
}
最後に・・・・・・
勇者(BraveManクラス)と魔王(Bossクラス)が闘うRPGクラスのソースです。
import java.io.*;
public class RPG {
public static void main(String[] args) {
Boss zoma = new Boss(500, "ゾーマ");
BraveMan bm = new BraveMan(500, "元祖ロト");
BufferedReader kbd = new BufferedReader(new InputStreamReader(System.in));
int atkDmg = 0;
int dmg = 0;
try {
while ((bm.HP >= 0)||(zoma.HP >= 0)) {
System.out.println(zoma.toString());
System.out.println(bm.toString());
System.out.println();
System.out.println("勇者のターン");
System.out.println("勇者の行動を選択してください");
System.out.print("1:通常攻撃、2:斬る、3:殴る、4:蹴る、5:火の魔法、6:氷の魔法 0:逃げる :");
switch (Integer.parseInt(kbd.readLine())) {
case 0:
bm.run_away();
break;
case 1:
System.out.println(bm.name + "の通常攻撃");
atkDmg = bm.attack();
System.out.println(atkDmg + "のダメージを与えた");
zoma.damage(atkDmg);
break;
case 2:
System.out.println(bm.name + "が斬って攻撃");
atkDmg = bm.kiru();
System.out.println(atkDmg + "のダメージを与えた");
zoma.damage(atkDmg);
break;
case 3:
System.out.println(bm.name + "が殴って攻撃");
atkDmg = bm.naguru();
System.out.println(atkDmg + "のダメージを与えた");
zoma.damage(atkDmg);
break;
case 4:
System.out.println(bm.name + "が蹴って攻撃");
atkDmg = bm.keru();
System.out.println(atkDmg + "のダメージを与えた");
zoma.damage(atkDmg);
break;
case 5:
System.out.println(bm.name + "が火の魔法攻撃");
atkDmg = bm.Fire();
System.out.println(atkDmg + "のダメージを与えた");
zoma.damage(atkDmg);
break;
case 6:
System.out.println(bm.name + "が氷の魔法攻撃");
atkDmg = bm.Ice();
System.out.println(atkDmg + "のダメージを与えた");
zoma.damage(atkDmg);
break;
default:
System.out.println("0~6の範囲で数値を入力してください");
continue;
}
if (zoma.dead() == true) {
System.out.println(zoma.name + "は死にました");
break;
}
System.out.println();
System.out.println(zoma.toString());
System.out.println(bm.toString());
System.out.println();
System.out.println(zoma.name + "のターン");
switch ((int)(Math.random() * 3)) {
case 0:
System.out.println(zoma.name + "が通常攻撃");
dmg = zoma.attack();
System.out.println(bm.name + "は" + dmg + "のダメージを受けた");
bm.damage(dmg);
break;
case 1:
System.out.println(zoma.name + "が火の魔法攻撃");
dmg = zoma.Fire();
System.out.println(bm.name + "は" + dmg + "のダメージを受けた");
bm.damage(dmg);
break;
case 2:
System.out.println(zoma.name + "が氷の魔法攻撃");
dmg = zoma.Ice();
System.out.println(bm.name + "は" + dmg + "のダメージを受けた");
bm.damage(dmg);
break;
}
if (bm.dead() == true) {
System.out.println(bm.name + "は死にました");
break;
}
System.out.println();
}
} catch (IOException e) {
System.out.println(e);
} catch (NumberFormatException e) {
System.out.println("正しい数値を入力してください");
}
}
}
こんな感じです。
それぞれのソースを同じフォルダ内に保存(ファイル名はクラス名.javaまたはインターフェイス名.java)して、javac *.javaでコンパイルして、java RPGコマンドで勇者vs魔王ゲームができると思います。たぶん・・・。
今日(08/20)は、教科書(下)第14章「例外処理」をさらりとやった後、またクラス継承とインターフェース実装の課題をやりました。
こんどは、銀行システムです。
財布クラス→(継承)→金庫クラス→(継承)→鍵付き金庫クラス(鍵インターフェース実装)を作って、銀行クラスでは、任意の数だけ口座をつくって(初期値として5000円くらい入れておく)・・・
メニューとして残高照会、入金、出金、振込、終了を表示させて、選択された処理を行うって感じですね。
おおまかには完成したんですけど・・・まだ納得いくレベルじゃないから、明日以降にでもUPしますかね。
・・・今日は、かるい例外処理と銀行クラスの課題だけだったのに、あっと言う間に時間が過ぎていき、帰りの電車では、寝過ごして気がつけば谷塚駅でした。(^-^;
さて・・・REDSTONEの公開テスト用クライアントは昨晩のシャワー中にダウンロードしたし、公開テストに参加してみようかな??
ミニペットを100%神霊型とかにできる巻物を試してみたいので。
ではでは。みなさん、よい週末を!
have a good weekend!!! (^-^)ノシ
コメント 0