講義メモ

オブジェクト指向演習:プロパティの導入とゲーム性の向上
ゲーム開発演習:フォームサイズの固定化、背景画像の描画など

オブジェクト指向演習

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("あなたは死にました。");
            }
        }
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です