【コンソール上で遊ぶRPGを作るぜ!】

(1) consoleRPG.ConsoleRPG クラスに mainメソッドを作る。

(2)勇者(Brave)クラスを作る。
 ステータスは name,maxHP=50,maxMP=5,hp,mp,strength(ちから)=10,
 intelligence(かしこさ)=7,agility(すばやさ)=5

(3)キャラクター(Character)クラスを作る。
 勇者クラスはキャラクタークラスを継承するように変更する。ステータスはキャラクタークラスに移動する。

(4)ユーザーが名前を入力して Character型でインスタンス化する。

(5)勇者のステータスを表示するクラス(Status)を作る。
 ステータスを表示するメソッド(show)は static にアクセスする。

(6)マップ(WorldMap)クラスを作る。
 まずは第1のマップ(mapNo=1)城のマップ(Castel)クラスを作り、マップクラスを継承する。サイズ 9×9 のマップを返す。
 マップの実態はマップクラスのフィールド name(マップの名前),mapNo,wmap[9][9] で管理する。
 name,mapNo,wmap[][]は城クラスのコンストラクタで定義する。
 城クラスはマップクラス型でインスタンスを生成する。そのとき 1(mapNo)を引数にする。

 城のマップ中身(0:床 100:壁 101:王 ※100以上は侵入不可)
 { { 100, 100, 100, 100, 100, 100, 100, 100, 100 },
 { 100, 0, 0, 0, 0, 0, 0, 0, 100 },
 { 100, 0, 0, 0, 101, 0, 0, 0, 100 },
 { 100, 0, 0, 0, 0, 0, 0, 0, 100 },
 { 100, 0, 0, 0, 0, 0, 0, 0, 100 },
 { 100, 0, 0, 0, 0, 0, 0, 0, 100 },
 { 100, 0, 0, 0, 0, 0, 0, 0, 100 },
 { 100, 0, 0, 0, 0, 0, 0, 0, 100 },
 { 100, 100, 100, 100, 0, 100, 100, 100, 100 } };

(7)ステータスクラスにフィールドとして現在位置(posX=4,posY=3)を static で追加する。
 マップクラスでマップを表示するメソッド(drawMap)を追加する。現在位置には"勇"と表示。

(8)文章(Sentence)クラスに文章を表示するメソッド(show(int sentenceNo))を static で作り、
 王様の勅命を授かる。
 文章は sentenceNo をもとに switch文を使う。
 キャラクタークラスに braveName を static で追加。勇者の名前を static でも扱えるようにする。
 文章"王様:この世界に魔王があらわれた\n 勇者"+Character.braveName+"よ\n 魔王を討ち砕き世界に再び平和をもたらすのだ\n 旅の資金として100ゴールド授ける";
 ステータスクラスに所持金(gold) を static で追加。ステータス表示メソッドでも所持金を追加表示。

(9)メインループ(MainLoop)クラスを作る。
 メインループ(mainloop)メソッドを作り、ゲーム全体のループを作る。
 メインループのコンストラクタに勇者とマップのインスタンスを渡し、mainLoopメソッドを呼び出す。

(10)移動(move)メソッドを作り、ループ内から呼び出す。
 "[1]左 [2]下 [3]右 [4]上 [5]ステータス" で入力を促し移動かステータス表示する。
 1~5以外の入力があった場合はもう一度繰り返す。
 マップの範囲外に移動もしくは100以上のマスに移動しようとしたら"移動できません"を表示。

(11)城クラスのコンストラクタにイベントマップを追加。
 9×9 のイベントマップを emap に定義。(0:イベントなし 1:王様に話しかけっる 2:城から出る ←マップに応じて変わる)
 {{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 1, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 2, 0, 0, 0, 0 }, };

(12)メインループクラスにイベントメソッド(event)を追加。移動先のイベントが1以上で呼び出される。
 mapNo とイベント番号をもとに switch文でそれぞれのイベントを呼び出す。
 1:"王様:勇者" + Character.braveName + "よ\n 魔王はこの世界と魔界をつなぎ闇をもたらす\n 一刻も早く魔王を討伐するのだ"
 2:フィールドマップ mapNo=2,x=3,y=6 へ移動する。

 フィールドマップ1 mapNo=2 (1:城 2:町 3:草 4:荒 5:森 102:川 103:山
 {{ 103, 103, 4, 4, 3, 3, 3, 103, 103 },
 { 5, 103, 4, 4, 3, 3, 3, 103, 103 },
 { 103, 103, 4, 3, 3, 3, 5, 5, 103 },
 { 103, 103, 3, 3, 5, 5, 5, 5, 103 },
 { 103, 103, 3, 3, 3, 5, 5, 102, 102 },
 { 103, 3, 3, 3, 3, 2, 3, 102, 103 },
 { 103, 3, 3, 1, 4, 4, 102, 102, 103 },
 { 103, 4, 4, 4, 4, 102, 102, 103, 103 },
 { 103, 102, 102, 102, 102, 102, 103, 103, 103 }, };

 フィールドマップ1 イベント(1:城 2:町 3:次のマップへ移動
 { 0, 0, 3, 3, 3, 3, 3, 0, 0 }, //
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, //
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, //
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, //
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, //
 { 0, 0, 0, 0, 0, 2, 0, 0, 0 }, //
 { 0, 0, 0, 1, 0, 0, 0, 0, 0 }, //
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, //
 { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, };

(13)モンスター(Monster)クラスを継承するスライム(Slime)クラスを作る。
 ステータスは
 name,maxHP=5,maxMP=0,hp,mp,strength(ちから)=3,intelligence(かしこさ)=1,agility(すばやさ)=6
 experience=1,gold=3
 キャラクタークラスに experience(経験値),level を追加。勇者クラスからコンストラクタにそれぞれ 0 と 1 を渡す。