・オブジェクト指向演習:「3人の魔導士」
・ゲーム開発演習:描画処理の実装、背景画像の描画など
RPG演習5 「3人の魔導士」
・Madoshiクラスからインスタンスを3つ生成し3人の魔導士としよう ・3人の魔導士は「魔導士1」「魔導士2」「魔導士3」と表現しよう ・開始時点で魔導士の情報を3人分表示しよう 例: 魔道士1(HP=13,MP=5)が現れた。 魔道士2(HP=13,MP=5)が現れた。 魔道士3(HP=13,MP=5)が現れた。 ・「攻撃しますか?(1:はい 0:やめて逃げる):」を 「どれを攻撃しますか?(1/2/3:魔導士を攻撃 0:逃げる):」に変更しよう ・ここで0/1/2/3以外が入力されたら、入力しなおしとしよう ・ゲームの終了条件を「あなたが死ぬか魔導士が全員死ぬまで」に変更しよう ・魔道士の攻撃では、その時点で生きている魔導士が1,2,3の順で連続攻撃する。 その途中ででもあなたのHPが0以下になったら「あなたは死にました。」と表示して終了しよう。 ・あなたのHPを40~60の乱数にしよう
RPG演習5 「3人の魔導士」仕様の検討
・出来る限り、最小限の変更にとどめよう 【Madoshiクラス】 ・魔導士番号を示す「int id」をインスタンス変数に追加しよう ・コンストラクタにint型の引数idを追加し、これを用いて魔導士番号を設定しよう ・DispInfoメソッドで魔導士番号も表示しよう
RPG演習5(1) Madoushiクラスの改造(まだ実行しない)
//オブジェクト指向演習 RPG演習5(1)
using System;
class Madoshi { //魔導士を表すクラス
int mp; //MP(カプセル化(p.166)のためにpublicにしない)
int hp; //HP(〃)
int id; //【追加】魔導士番号
Random rnd = new Random(); //乱数用のRandomクラスのインスタンスを生成
public Madoshi(int id) { //【変更】コンストラクタ(p.167)で魔導士番号を受け取る
mp = rnd.Next(10); //0~9の間のランダムな整数を得てMPの初期値とする
hp = 10 + rnd.Next(10); //10~19の間のランダムな整数を得てHPの初期値とする
this.id = id; //【追加】引数から魔導士番号を受け取る
}
public int HP { //HPを返すプロパティ
get { return hp; }
}
public void DispInfo() { //魔導士の情報を表示する
Console.Write("魔道士{0}(HP={1} MP={2})", id, hp, mp); //【変更】情報表示(改行しない)
}
public int Fight() { //魔道士があなたを攻撃し、あなたのダメージ値を返す
if (rnd.Next(2) == 1) { //確率1/2で魔法攻撃かどうかを選ぶ
int j = rnd.Next(5) + 1; //消費MPは1~5の乱数
DispInfo(); // 魔導士の情報を表示する
Console.WriteLine("は消費MP" + j + "の魔法を唱えた!");
if (mp < j) { // MP不足?
Console.WriteLine("MPが足りない!");
return 0; // あなたのダメージ=0を返す(攻撃終了)
} else { // MP充足?
Console.WriteLine("あなたは" + j * 4 + "のダメージを受けた!");
mp -= j; //MP消費
return j * 4; //あなたのダメージ=消費MPの4倍を返す(攻撃終了)
}
} else { //通常攻撃?
int k = rnd.Next(5) + 1; //攻撃力は1~5の乱数
DispInfo(); //魔導士の情報を表示する
Console.WriteLine("の攻撃!");
Console.WriteLine("あなたは" + k + "のダメージを受けた!");
return k; //あなたのダメージ=1~50を返す(攻撃終了)
}
}
public void Damage() { //魔道士があなたからダメージをくらう
int k = 5 + rnd.Next(5); //あなたの攻撃力は5~9の乱数
Console.WriteLine("あなたの攻撃!");
DispInfo(); //魔導士の情報を表示する(攻撃を受けた後の魔道士のHPを表示)
Console.WriteLine("に" + k + "のダメージを与えた!");
hp -= k; //魔道士のHPをダウン
}
}
RPG演習5 「3人の魔導士」仕様の検討(つづき)
・まずは「1人の魔導士」として実行したい ・Madoshiクラスに合わせて、minimadouクラスを書き換えよう ① 魔道士を生成するときに魔導士番号1を渡す ②「攻撃しますか?(1:はい 0:やめる)」を「どれを攻撃しますか?(1:魔導士1 0:やめる)」
RPG演習5(2) minimadouクラスの改造「1人の魔導士」(実行可能)
class minimadou { //ゲーム本体のクラス
public static void Main() { //ゲームを進行するメソッド
Random rnd = new Random(); //乱数用のRandomクラスのインスタンスを生成
string ans; //入力用
// 戦闘開始
int myhp = 20; // あなたのHP
Madoshi m = new Madoshi(1); //【変更】魔道士を生成
m.DispInfo(); // 魔道士の情報を表示する
Console.WriteLine("が現れた。");
// 戦闘中(あなたが死ぬか,魔道士が死ぬまで繰り返す)
while (myhp > 0 && m.HP > 0) { //あなたのHPがあり、魔導士のHPがある間
Console.Write("残りHPは{0}です。どれを攻撃しますか?(1:魔導士1 0:やめる):", myhp); //【変更】
ans = Console.ReadLine(); // 攻撃するかどうかを得る
if (ans == "1") { // はい?
m.Damage(); // 魔道士を攻撃する
if (m.HP > 0) { //魔道士は死んでない?
myhp -= m.Fight(); // 魔道士の攻撃!あなたのHPをマイナス
} else { // 魔道士のHPがもうない?
Console.WriteLine("魔道士を倒した!");
}
} else { // やめる?
if (rnd.Next(2) == 0) { //確率50%で
Console.WriteLine("逃げることができた!");
break; // 繰り返し終了(p.125)
} else {
Console.WriteLine("逃げられない!");
myhp -= m.Fight(); // 魔道士の攻撃!あなたのHPをマイナス
}
}
if (myhp <= 0) { //あなたのHPがもうない?
Console.WriteLine("あなたは死にました。");
}
}
}
}
RPG演習5 「3人の魔導士」仕様の検討(つづき)
・「1人の魔導士」を「3人の魔導士」にしよう=第1段階
・あなたのHPを20固定ではなく、40~60の乱数にしよう
int myhp = 40 + rnd.Next(21); //あなたのHPを40+0から40+20にする
・魔導士の参照変数mを配列[3]にして、魔導士1~3を生成しよう
Madoshi[] m = {new Madoshi(1), new Madoshi(2), new Madoshi(3)};
・「魔道士の情報を表示する」を3人分にしよう
foreach (var w in m) { //全魔導士について繰返す
w.DispInfo(); // 魔道士の情報を表示する
Console.WriteLine("が現れた。");
}
・魔導士mを魔導士m[0]に書き換えよう(まずは「1人の魔導士」のままでOK)
RPG演習5(3) minimadouクラスの改造「3人いるけど1人の魔導士」(実行可能)
//オブジェクト指向演習 RPG演習5(3)
using System;
class Madoshi { //魔導士を表すクラス
int mp; //MP(カプセル化(p.166)のためにpublicにしない)
int hp; //HP(〃)
int id; //【追加】魔導士番号
Random rnd = new Random(); //乱数用のRandomクラスのインスタンスを生成
public Madoshi(int id) { //【変更】コンストラクタ(p.167)で魔導士番号を受け取る
mp = rnd.Next(10); //0~9の間のランダムな整数を得てMPの初期値とする
hp = 10 + rnd.Next(10); //10~19の間のランダムな整数を得てHPの初期値とする
this.id = id; //【追加】引数から魔導士番号を受け取る
}
public int HP { //HPを返すプロパティ
get { return hp; }
}
public void DispInfo() { //魔導士の情報を表示する
Console.Write("魔道士{0}(HP={1} MP={2})", id, hp, mp); //【変更】情報表示(改行しない)
}
public int Fight() { //魔道士があなたを攻撃し、あなたのダメージ値を返す
if (rnd.Next(2) == 1) { //確率1/2で魔法攻撃かどうかを選ぶ
int j = rnd.Next(5) + 1; //消費MPは1~5の乱数
DispInfo(); // 魔導士の情報を表示する
Console.WriteLine("は消費MP" + j + "の魔法を唱えた!");
if (mp < j) { // MP不足?
Console.WriteLine("MPが足りない!");
return 0; // あなたのダメージ=0を返す(攻撃終了)
} else { // MP充足?
Console.WriteLine("あなたは" + j * 4 + "のダメージを受けた!");
mp -= j; //MP消費
return j * 4; //あなたのダメージ=消費MPの4倍を返す(攻撃終了)
}
} else { //通常攻撃?
int k = rnd.Next(5) + 1; //攻撃力は1~5の乱数
DispInfo(); //魔導士の情報を表示する
Console.WriteLine("の攻撃!");
Console.WriteLine("あなたは" + k + "のダメージを受けた!");
return k; //あなたのダメージ=1~50を返す(攻撃終了)
}
}
public void Damage() { //魔道士があなたからダメージをくらう
int k = 5 + rnd.Next(5); //あなたの攻撃力は5~9の乱数
Console.WriteLine("あなたの攻撃!");
DispInfo(); //魔導士の情報を表示する(攻撃を受けた後の魔道士のHPを表示)
Console.WriteLine("に" + k + "のダメージを与えた!");
hp -= k; //魔道士のHPをダウン
}
}
class minimadou { //ゲーム本体のクラス
public static void Main() { //ゲームを進行するメソッド
Random rnd = new Random(); //乱数用のRandomクラスのインスタンスを生成
string ans; //入力用
// 戦闘開始
int myhp = 40 + rnd.Next(21); //【変更】あなたのHPを40+0から40+20にする
Madoshi[] m = { new Madoshi(1),new Madoshi(2),new Madoshi(3) }; //【変更】全魔道士を生成
foreach (var w in m) { //【追加】全魔道士ついて繰返す
w.DispInfo(); //【変更】魔道士の情報を表示する
Console.WriteLine("が現れた。");
} //【追加】
// 戦闘中(あなたが死ぬか,魔道士が死ぬまで繰り返す)
while (myhp > 0 && m[0].HP > 0) { //あなたのHPがあり、魔導士のHPがある間
Console.Write("残りHPは{0}です。どれを攻撃しますか?(1:魔導士1 0:やめる):", myhp); //【変更】
ans = Console.ReadLine(); // 攻撃するかどうかを得る
if (ans == "1") { // はい?
m[0].Damage(); //【変更】魔道士を攻撃する
if(m[0].HP > 0) { //【変更】魔道士は死んでない?
myhp -= m[0].Fight(); // 【変更】魔道士の攻撃!あなたのHPをマイナス
} else { // 魔道士のHPがもうない?
Console.WriteLine("魔道士を倒した!");
}
} else { // やめる?
if (rnd.Next(2) == 0) { //確率50%で
Console.WriteLine("逃げることができた!");
break; // 繰り返し終了(p.125)
} else {
Console.WriteLine("逃げられない!");
myhp -= m[0].Fight(); //【変更】魔道士の攻撃!あなたのHPをマイナス
}
}
if (myhp <= 0) { //あなたのHPがもうない?
Console.WriteLine("あなたは死にました。");
}
}
}
}
RPG演習5 「3人の魔導士」仕様の検討(つづき)
・「1人の魔導士」を「3人の魔導士」にしよう=第2段階
・繰返し条件を「あなたのHPがあり、全魔導士のHPがある間」にしよう
while (myhp > 0 && (m[0].HP > 0 || m[1].HP > 0 || m[2].HP > 0)) {…}
・「どれを攻撃しますか?(1/2/3:魔導士1,2,3 0:やめる):」にしよう
・そして受け取ったansを整数変換して1~3ならば-1して魔導士の添字0~2を得よう
int ansi = int.Parse(ans) - 1;
・魔導士m[0]を魔導士m[ansi]に書き換えよう(これで「3人の魔導士」になる)
・攻撃は全魔導士が順に行うとしよう
RPG演習5(4) minimadouクラスの改造「3人の魔導士:初版」(実行可能:問題あるけど)
//オブジェクト指向演習 RPG演習5(4)
using System;
class Madoshi { //魔導士を表すクラス
int mp; //MP(カプセル化(p.166)のためにpublicにしない)
int hp; //HP(〃)
int id; //魔導士番号
Random rnd = new Random(); //乱数用のRandomクラスのインスタンスを生成
public Madoshi(int id) { //コンストラクタ(p.167)で魔導士番号を受け取る
mp = rnd.Next(10); //0~9の間のランダムな整数を得てMPの初期値とする
hp = 10 + rnd.Next(10); //10~19の間のランダムな整数を得てHPの初期値とする
this.id = id; //引数から魔導士番号を受け取る
}
public int HP { //HPを返すプロパティ
get { return hp; }
}
public void DispInfo() { //魔導士の情報を表示する
Console.Write("魔道士{0}(HP={1} MP={2})", id, hp, mp); //情報表示(改行しない)
}
public int Fight() { //魔道士があなたを攻撃し、あなたのダメージ値を返す
if (rnd.Next(2) == 1) { //確率1/2で魔法攻撃かどうかを選ぶ
int j = rnd.Next(5) + 1; //消費MPは1~5の乱数
DispInfo(); // 魔導士の情報を表示する
Console.WriteLine("は消費MP" + j + "の魔法を唱えた!");
if (mp < j) { // MP不足?
Console.WriteLine("MPが足りない!");
return 0; // あなたのダメージ=0を返す(攻撃終了)
} else { // MP充足?
Console.WriteLine("あなたは" + j * 4 + "のダメージを受けた!");
mp -= j; //MP消費
return j * 4; //あなたのダメージ=消費MPの4倍を返す(攻撃終了)
}
} else { //通常攻撃?
int k = rnd.Next(5) + 1; //攻撃力は1~5の乱数
DispInfo(); //魔導士の情報を表示する
Console.WriteLine("の攻撃!");
Console.WriteLine("あなたは" + k + "のダメージを受けた!");
return k; //あなたのダメージ=1~50を返す(攻撃終了)
}
}
public void Damage() { //魔道士があなたからダメージをくらう
int k = 5 + rnd.Next(5); //あなたの攻撃力は5~9の乱数
Console.WriteLine("あなたの攻撃!");
DispInfo(); //魔導士の情報を表示する(攻撃を受けた後の魔道士のHPを表示)
Console.WriteLine("に" + k + "のダメージを与えた!");
hp -= k; //魔道士のHPをダウン
}
}
class minimadou { //ゲーム本体のクラス
public static void Main() { //ゲームを進行するメソッド
Random rnd = new Random(); //乱数用のRandomクラスのインスタンスを生成
string ans; //入力用
// 戦闘開始
int myhp = 40 + rnd.Next(21); //あなたのHPを40+0から40+20にする
Madoshi[] m = { new Madoshi(1),new Madoshi(2),new Madoshi(3) }; //全魔道士を生成
foreach (var w in m) { //全魔道士ついて繰返す
w.DispInfo(); //魔道士の情報を表示する
Console.WriteLine("が現れた。");
}
// 戦闘中(あなたが死ぬか,魔道士が死ぬまで繰り返す)
while (myhp > 0 && (m[0].HP > 0 || m[1].HP > 0 || m[2].HP > 0)) { //【変更】あなたとどれかの魔導士のHPがある間
Console.Write("残りHPは{0}です。どれを攻撃しますか?(1/2/3:魔導士1,2,3 0:やめる):", myhp); //【変更】
ans = Console.ReadLine(); //回答を得る
int ansi = int.Parse(ans) - 1; //【追加】整数変換して-1し魔導士の添字0~2を得る
if (ansi == 0 || ansi == 1 || ansi == 2) { //【変更】魔導士を攻撃?
m[ansi].Damage(); //【変更】魔道士を攻撃する
if(m[ansi].HP <= 0) { //【変更】魔道士[]を倒した?
Console.WriteLine("魔道士{0}を倒した!", ans); //【変更】
}
for (int i = 0; i < 3; i++) { //【追加】全魔導士について繰返す
myhp -= m[i].Fight(); //【変更】魔道士の攻撃!あなたのHPをマイナス
}
} else { // やめる?
if (rnd.Next(2) == 0) { //確率50%で
Console.WriteLine("逃げることができた!");
break; // 繰り返し終了(p.125)
} else {
Console.WriteLine("逃げられない!");
for (int i = 0; i < 3; i++) { //【追加】全魔導士について繰返す
myhp -= m[i].Fight(); //【変更】魔道士の攻撃!あなたのHPをマイナス
}
}
}
if (myhp <= 0) { //あなたのHPがもうない?
Console.WriteLine("あなたは死にました。");
}
}
}
}