講義メモ 続き

乱数に関する補足説明

・Randomクラスは乱数を提供するもので、System名前空間にあるので「using System;」があればクラス名だけで利用可能
・Randomクラスのデフォルトコンストラクタを呼び出すと、内部的にシステムクロックを用いたシード処理(乱数系の初期設定)が行われて、
 乱数機能を提供するオブジェクトが生成される
 ※ C/C++が提供する疑似乱数と同等だが、自前のシード処理は不要なので便利
・Randomクラスのインスタンスメソッド「int Next(int)」は0から引数値-1までのどれかの整数を返す
例:
 Random rnd = new Random(); //乱数用のRandomクラスのインスタンスを生成
 int mp = rnd.Next(10); //0~9の間のランダムな整数を得てMPの初期値とする
 int hp = 10 + rnd.Next(10); //10~19の間のランダムな整数を得てHPの初期値とする
・乱数オブジェクトは使いまわしが可能なので、クラスのデータメンバとして定義・初期化しておくと良い

ミニ演習 mini01.cs じゃんけんの基礎

・乱数によって、"グー"または"チョキ"または"パー"を表示しよう

作成例 その1

//ミニ演習 mini01.cs じゃんけんの基礎
using System;
class mini01 { //乱数によって、"グー"または"チョキ"または"パー"を表示
    public static void Main() { 
        Random rnd = new Random(); //乱数用のRandomクラスのインスタンスを生成
        int r = rnd.Next(3); //0~2の間のランダムな整数を得る
        Console.WriteLine((r == 0) ? "グー" : ((r == 1) ? "チョキ" : "パー"));
    }
}

作成例 その2

//ミニ演習 mini01.cs じゃんけんの基礎
using System;
class mini01 { //乱数によって、"グー"または"チョキ"または"パー"を表示
    public static void Main() {
        string[] hand = {"グー", "チョキ", "パー"};
        Random rnd = new Random(); //乱数用のRandomクラスのインスタンスを生成
        int r = rnd.Next(3); //0~2の間のランダムな整数を得る
        Console.WriteLine(hand[r]); //乱数を添字にして文字列を得て表示
    }
}

参考:暗黙の型指定

・暗黙の型指定(p.147)を用いて「var hand = new[]{"グー", "チョキ", "パー"};」としても良い

RPG演習2 仕様

・プレイヤーのHPを表示しよう
・「攻撃しますか?(1:はい 0:やめる):」を「残りHPは●です。攻撃しますか?(1:はい 0:やめる):」にしよう

作成例

//オブジェクト指向演習 RPG演習2
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 GetHP() { return hp; } //HPを返すメソッド
    public void DispInfo() { //魔導士の情報を表示する
        Console.Write("魔道士(HP=" + hp + ")"); //HPを表示(改行しない)
    }
    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.GetHP() > 0) { //あなたのHPがあり、魔導士のHPがある間
            Console.Write("残りHPは{0}です。攻撃しますか?(1:はい 0:やめる):", myhp);
            ans = Console.ReadLine(); // 攻撃するかどうかを得る
            if (ans == "1") { // はい?
                m.Damage(); // 魔道士を攻撃する
                if (m.GetHP() > 0) { // 魔道士は死んでない?
                    myhp -= m.Fight(); // 魔道士の攻撃!あなたのHPをマイナス
                    if (myhp <= 0) { // あなたのHPがもうない?
                        Console.WriteLine("あなたは死にました。");
                    }
                } else { // 魔道士のHPがもうない?
                    Console.WriteLine("魔道士を倒した!");
                }
            } else { // やめる?
                break; // 繰り返し終了(p.125)
            }
        }
    }
}

コメントを残す

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