乱数に関する補足説明
・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)
}
}
}
}