勇者とスライムが殴り合うだけの戦闘を、Perl と Moo で作るところから始めます。そこへ防御・魔法・アイテム、敵のAI、ダメージ表示や報酬を足していくと、if/elsif がすぐに手に負えなくなります。その困りごとを1つずつ片付けていくと、Command・State・Strategy・Observer という4つの GoF デザインパターンになります。最後は、コマンドを入力して敵と戦う対話型のバトルが動きます。
このページは目次を兼ねた案内板です。通して作るなら「全10回」を順に、特定の困りごとがあるなら「困りごとから探す」から選んでください。
- 対象: Perl 入学式を卒業したレベルで、Moo でのオブジェクト指向の入門を終えた方
- 使うパターン: Command、State、Strategy、Observer
読み方
- 通して読む: 第1回から順に。コードは前の回の続きで、各回の終わりに次の回で直す問題が示されます
- パターンだけ知りたい: 第3回で if/elsif の行き詰まりを確かめてから、第4回(Command)→ 第5回(State)→ 第6回(Strategy)→ 第7回(Observer)。前提のコードは第1〜2回にあります
- 全体像だけ見たい: 第8回の協調の図と、第10回の振り返りの表
全10回
- Perl と Moo でターン制 RPG の戦闘を作りたい。まず勇者とスライムが殴り合う最小版を動かす
- 攻撃のほかに防御やアイテムも使いたい。行動を1つずつクラスに分ける
- 行動の選択を if/elsif で書いたら、魔法とアイテムを足すたびに増えて手に負えない
- 行動の if/elsif を片付けたい。行動を Command オブジェクトにして選ぶ処理から切り離す【Command】
- 戦闘の開始・プレイヤーの番・敵の番・終了の流れが散らかる。フェーズを State で管理する【State】
- 敵がいつも攻撃するだけで単調。攻撃的・防御的・ランダムなAIを Strategy で切り替える【Strategy】
- HP が減ったら画面に出したい、勝ったら報酬を渡したい。通知を Observer で任せる【Observer】
- Command・State・Strategy・Observer を同時に使うと、どう噛み合うのか。協調の流れを追う
- 勇者を自分の手で動かしたい。コマンド入力で敵と戦う対話型バトルに仕上げる
- なぜこの4つのパターンで足りたのか。RPG の戦闘を題材に、組み合わせ方の理由を振り返る
困りごとから探す
行動の種類を増やしたい、分岐が伸び続けている
- 第2回 — 攻撃・防御・アイテムを、行動ごとのクラスに分ける
- 第3回 — if/elsif で振り分けると、魔法とアイテムを足すたびに増える
- 第4回 — 行動を Command オブジェクトにして、選ぶ処理から切り離す
戦闘の流れ(フェーズ)が散らかっている
- 第5回 — 開始・プレイヤー・敵・終了を State で管理する
敵の動きを切り替えたい
- 第6回 — 攻撃的・防御的・ランダムなAIを Strategy で差し替える
ダメージ表示や報酬など、戦闘に付随する処理を足したい
- 第7回 — Observer で通知し、戦闘のコードに触れず反応を増やす
