はじめに
今回の記事では、クラスやオブジェクト指向を使って簡単なRPGをつくる演習編に入ります。ポイントを解説しながら、数回にわたって記事を掲載していきます。つまずきやすい部分(実際に筆者がつまずいた部分)を中心に、初心者にもわかりやすく順を追って説明していきます。
もくじ
- はじめに
- もくじ
- 基本のおさらい オブジェクト指向の3つの要素「継承」「ポリモーフィズム」「カプセル化」
- クラスを使って簡単なRPGを作ってみよう
- 今回は大まかな流れをつくる
- 基本の仕様を決める
- クラスの機能をどこでどう活かすか考える
- 魔法使いクラスと騎士クラスに「継承」を使う
- 「ポリモーフィズム」で攻撃・防御メソッドを実装する
- 「カプセル化」で外からアクセスできないようにする
- プログラムの全体の流れを考える
- まとめ
基本のおさらい オブジェクト指向の3つの要素
前回までは「クラス」「インスタンス」を基本にしたオブジェクト指向の3要素「継承」「ポリモーフィズム」「カプセル化」について説明しました。
今回は、クラスの機能を使って実際にプログラムを作成していきます。
クラスを使って簡単なRPGを作ってみよう
☆作りたいプログラムの仕様と大まかな流れについて決定する
今回は作りたいRPGの仕様を決定し、そのうえでどのようにクラスの機能を活用していけるかを考えていきます。そのうえで、作業がしやすいようプログラムの流れを作成していきます。
☆作りたいRPGの仕様
今回は、プレイヤーがランダムに出現するモンスターと戦うRPGを作成していきます。プレイヤーとモンスターのどちらかのHP(体力)がなくなるまで戦闘が続き、HPがなくなったほうが負けになるゲームになります。詳細は以下にまとめました。
☆HPがなくなったほうが負け どちらかが倒されるまで続くゲーム
☆プレイヤーキャラは
・名前 HP=60 のステータスを持つ
・攻撃 防御 の行動をとることができる
☆敵キャラは
・HP のステータス
・攻撃 の行動をとることができる
☆プレイヤーは魔法使い、騎士どちらかの職業を選択する
☆プレイヤーが先攻、モンスターが後攻
☆プレイヤーが魔法使いか騎士かによって攻撃・防御するさいの行動が変化する
基本 攻撃 モンスターに10ダメージ
防御 そのターンモンスターの攻撃を受けない
魔法使い・・・90%の確率で攻撃が当たる 防御するとHPが5回復する
騎士・・・20%の確率で攻撃ダメージが増える(20ダメージ)が、20%の確率で攻撃が外れる
☆敵はスライム、デビル、ドラゴンの三種類がランダムに登場し、それぞれHPは20, 40, 60
☆敵の攻撃ダメージはランダムで0, 10, 20, 30のいずれか
☆入力が不正の場合もう一度入力させる
☆道中のテキストは自由
クラスの機能をどこでどう活かすか考える
今回はオブジェクト指向の考え方に沿ってプログラムを作ることを目標にするため、「クラス」や「インスタンス」、「継承」「ポリモーフィズム」「カプセル化」をどのような場合に活用していくかそれぞれ考えていきます。もしこの時点で「この機能はここで使えそう?」と思った場合は、ぜひメモしておいてください。
☆「クラス」と「インスタンス」
クラスとインスタンスは、変数やメソッドをひとまとめにした鋳型を作成し、それをもとに実体をつくることでメソッドを呼び出したりすることができるものでした。
今回のRPGでは、プレイヤーと敵キャラにそれぞれステータスや行動が関連しています。
プレイヤーが攻撃する・防御することはプレイヤーにのみ関連する処理であるので、ステータスや行動をまとめてクラスにすることができそうです。実際に攻撃や防御を行う場合にメソッドを呼び出す必要があるので、インスタンスも作成します。
同じように、敵キャラクターもクラスにしておき、HPや攻撃などの処理をひとまとめにしておきます。
☆継承・・・魔法使いクラスと騎士クラスに「継承」を使ってみよう
プレイヤーと敵のクラスを作ったところで、継承について考えてみます。
プレイヤーは「魔法使い」か「騎士」のどちらかを選べます。このとき、魔法使いと騎士では攻撃や防御での処理が少しずつ異なります。
よって、まずはは基本となるプレイヤークラスを作っておき、それを継承してそれぞれ「魔法使いクラス」と「騎士クラス」を作成してみます。
☆ポリモーフィズム・・・「ポリモーフィズム」で攻撃・防御メソッドを実装してみよう
魔法使いクラスや騎士クラスを作成したら、それぞれの攻撃、防御メソッドを上書きして別の処理に変更していきます。このときメソッドをオーバーライドします。
基本のプレイヤークラス 攻撃 モンスターに10ダメージ
防御 そのターンモンスターの攻撃を受けない
オーバーライドして以下のような処理にしたい
魔法使いクラス・・・魔法攻撃になり、80%の確率で攻撃が当たる 防御するとHPが5回復する
騎士クラス・・・斬撃攻撃になり、20%の確率で攻撃ダメージが増える(20ダメージになる)が、20%の確率で攻撃が外れる
このとき、実際の処理はオーバーライドした「魔法攻撃」や「斬撃攻撃」になり効果が変わりますが、プレイヤーが「攻撃する」「防御する」という選択には変わりありません。
これはポリモーフィズムの考え方を実現しているといえます。
☆「カプセル化」… メソッドにアクセスできないようにする
今回のRPGプログラムでは、特にメソッドを外部から変更する可能性がないため、完成後に確認作業を行うこととします。
プログラムの全体の流れを考える
今後プログラムの作成がしやすいように、プログラム全体の構成を考えていきます。
①RPGがスタートすると、まずは名前の入力と職業の選択
名前の入力と職業選択が正しく行われた場合、魔法使いの場合と騎士の場合で分岐します。
②魔法使い、騎士の場合いずれも プレイヤー → モンスター の順番でターンが始まる
どちらかのHPがなくなるまでは戦いが終わらないので、この部分はループになります。
③プレイヤーターンで分岐させる
プレイヤーは攻撃か防御の行動がとれるので、どちらを選ぶかによって処理が分岐します。
これで大雑把なプログラムの構成ができました。これをもとに次回から細かい実装を行っていきます。
まとめ
クラスのさまざまな機能を活かしたRPGを作成する場合、まず仕様を考えたうえでどのような部分でクラスが使えそうか?継承やオーバーライドを活用できるか?を考えていくとプログラムの幅が広がります。部分をどうクラスにするかを決定したら、プログラムの全体の流れを考えていくと、細かい処理を実装していく場合でも迷うことがありません。
最初は分かりやすい部分をクラスにしてみて、よりコンパクトなプログラムを書けるように慣れていきましょう!(著者もクラスについて初心者です)
次回は、各クラスとメソッドの作りこみについて説明していく予定です。
ここまで読んでくださってありがとうございました!
コメント