【コンソール上で遊ぶ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 を渡す。