オブジェクト指向演習:プロパティの導入とゲーム性の向上
ゲーム開発演習:フォームサイズの固定化、背景画像の描画など
オブジェクト指向演習
p.207 プロパティ【再掲載】
・データメンバとメソッドの中間の仕掛けで、データメンバに対する操作を代行してくれる役割
・これにより、データメンバの値を外部から直接操作されることを防止できる
・メソッドに近い特殊な形式で、設定用のアクセッサ「set」と、参照用のアクセッサ「get」のどちらかまたは両方を記述する
・定義書式: アクセス修飾子 データ型 プロパティ名 { set {…} get {…} }
・アクセッサ「get」はデータメンバの値などをreturnするので、データ型と型が一致する
・アクセッサ「set」は代入の左辺になり、右辺から与えられたデータをvalueキーワードで受け取ることができる
・例: public int HitP { get {return hp;} set {hp = value;} }
・利用側は、プロパティ名をデータメンバ名と同様に扱える
・例: 参照変数.HitP = 100; //プロパティ(set)により「hp = 100;」が実行される
・例: x = 参照変数.HitP; //プロパティ(get)によりhpの値(100)が代入の右辺になる
RPG演習3 仕様:プロパティの導入とゲーム性の向上
・MadoshiクラスのGetHP()メソッドをプロパティ「int HP」にしよう。Getしかないのでsetは不要。 ・ついでに、DispInfo()メソッドでMPも表示するようにしよう
作成例
//オブジェクト指向演習 RPG演習3
using System;
class Madoshi { //魔導士を表すクラス
int mp; //MP(カプセル化(p.166)のためにpublicにしない)
int hp; //HP(〃)
Random rnd = new Random(); //乱数用のRandomクラスのインスタンスを生成
public Madoshi() { //コンストラクタ(p.167)
mp = rnd.Next(10); //0~9の間のランダムな整数を得てMPの初期値とする
hp = 10 + rnd.Next(10); //10~19の間のランダムな整数を得てHPの初期値とする
}
public int HP { //【以下変更】HPを返すプロパティ
get { return hp; }
}
public void DispInfo() { //魔導士の情報を表示する
Console.Write("魔道士(HP={0} MP={1})", hp, mp); //【変更】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() { //ゲームを進行するメソッド
string ans; //入力用
// 戦闘開始
int myhp = 20; // あなたのHP
Madoshi m = new Madoshi(); // 魔道士を生成
m.DispInfo(); // 魔道士の情報を表示する
Console.WriteLine("が現れた。");
// 戦闘中(あなたが死ぬか,魔道士が死ぬまで繰り返す)
while (myhp > 0 && m.HP > 0) { //【変更】あなたのHPがあり、魔導士のHPがある間
Console.Write("残りHPは{0}です。攻撃しますか?(1:はい 0:やめる):", myhp);
ans = Console.ReadLine(); // 攻撃するかどうかを得る
if (ans == "1") { // はい?
m.Damage(); // 魔道士を攻撃する
if (m.HP > 0) { //【変更】魔道士は死んでない?
myhp -= m.Fight(); // 魔道士の攻撃!あなたのHPをマイナス
if (myhp <= 0) { // あなたのHPがもうない?
Console.WriteLine("あなたは死にました。");
}
} else { // 魔道士のHPがもうない?
Console.WriteLine("魔道士を倒した!");
}
} else { // やめる?
break; // 繰り返し終了(p.125)
}
}
}
}
RPG演習4 仕様:ゲーム性の向上の続き
・「攻撃しますか?(1:はい 0:やめる):」で「0」を選んだら確率50%で「逃げることができた」と表示しよう ・そうでなければ「逃げられない」と表示して、魔導士の攻撃に進むようにしよう
RPG演習4 ヒント
・minimadouクラスでも乱数用のRandomクラスのインスタンスを生成する必要がある ・確率50%は「if(乱数オブジェクト.Next(2) == 0)」で実装できる ・「魔道士の攻撃!あなたのHPをマイナス」を「逃げられない」場合にも行えば良い ・その為「あなたのHPがもうない?」チェックを「はい」でも「やめる」でも行うように移動する
作成例
//オブジェクト指向演習 RPG演習4
using System;
class Madoshi { //魔導士を表すクラス
int mp; //MP(カプセル化(p.166)のためにpublicにしない)
int hp; //HP(〃)
Random rnd = new Random(); //乱数用のRandomクラスのインスタンスを生成
public Madoshi() { //コンストラクタ(p.167)
mp = rnd.Next(10); //0~9の間のランダムな整数を得てMPの初期値とする
hp = 10 + rnd.Next(10); //10~19の間のランダムな整数を得てHPの初期値とする
}
public int HP { //HPを返すプロパティ
get { return hp; }
}
public void DispInfo() { //魔導士の情報を表示する
Console.Write("魔道士(HP={0} MP={1})", hp, mp); //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 = 20; // あなたのHP
Madoshi m = new Madoshi(); // 魔道士を生成
m.DispInfo(); // 魔道士の情報を表示する
Console.WriteLine("が現れた。");
// 戦闘中(あなたが死ぬか,魔道士が死ぬまで繰り返す)
while (myhp > 0 && m.HP > 0) { //あなたのHPがあり、魔導士のHPがある間
Console.Write("残りHPは{0}です。攻撃しますか?(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("あなたは死にました。");
}
}
}
}