リスト4●鎖状の配列を使って行動順を管理するコード
リスト4●鎖状の配列を使って行動順を管理するコード
[画像のクリックで拡大表示]
リスト5●ユーザーが攻撃相手を選択したり,PCの操作するキャラを処理する
リスト5●ユーザーが攻撃相手を選択したり,PCの操作するキャラを処理する
[画像のクリックで拡大表示]
リスト2●クラスMyCharのコード(基本的な枠組みのみ)
リスト2●クラスMyCharのコード(基本的な枠組みのみ)
[画像のクリックで拡大表示]
リスト6●クラスMyCharのメソッドを修正する
リスト6●クラスMyCharのメソッドを修正する
[画像のクリックで拡大表示]

攻撃する相手を決定する

 戦闘の順番を決める処理ができたので,個々の攻撃処理を作成しましょう。ユーザーが操作するキャラの場合は,ユーザーに攻撃するキャラを選択してもらい,PCが操作するキャラの場合は,攻撃の目標をクラスMyCharのattackメソッドで決定します。

 まず,先ほど動作を確認するために入れたリスト4の(1)[拡大表示]のfor文を削除してしまいます。引き続き,リスト5[拡大表示]のコードを入力してください。変数とリスナー・オブジェクトの宣言を記述したら(1),リスト4のbattleStep1関数をリスト5のように修正し,selectEnemy関数を追加します。

 リスト5の内容を見てみましょう。まず,ユーザーが攻撃対象を選択する処理を作成します。ユーザー操作のキャラかどうかはタイプ(_typeプロパティ)が0であるかどうかで判断します(2)。ユーザーが操作するキャラの場合は,インスタンスenemyCard0~enemyCard2の上にインスタンスselectorを表示し,矢印キーの左右を使って対象を選択して「z」キーで決定するようにします。

 ユーザーが攻撃対象を選択するために,インスタンスselectorを表示し,Keyクラスに登録されているリスナー・オブジェクトkeyListenerのonKeyDownの参照先をselectEnemy関数に動的に切り替えます(3)。矢印キーと「z」キーを使ってユーザーが攻撃対象を選択したら,再びonKeyDownの参照先を切り替えて元に戻します(4)。そして,攻撃者と選択した対象を引数として,ダメージの計算とメッセージの表示を行う関数battleStep2を呼び出します(5)*10

 次に,PCが操作するキャラの処理を見てみましょう。まず,キャラの_typeプロパティの値を調べて「1」(味方)であれば敵の,「2」(敵)であれば味方のキャラを管理する配列を取得します(6)。取得した配列を引数としてクラスMyCharのattackメソッドを呼び出し(7),戻り値として攻撃対象を受け取ります。あとはユーザーが攻撃対象を選択したときと同じように関数battleStep2を呼び出します(8)。

 ここで,クラスMyChar(リスト2[拡大表示])のattackメソッドをリスト6[拡大表示]のように変更しておきましょう。attackメソッドは,攻撃対象を選択する,いわゆる“思考ルーチン”の部分となります。いろいろな選択方法があると思いますが,今回は単純に「最も体力(_hp)の低い相手を優先的に攻撃対象として選択する」という簡単なものにしています。併せて,防御を行うdefenceメソッドのコードもリスト6のものに変更しておきましょう。

 attackメソッドでは,引数として受け取った配列のメンバーを順番にチェックし,一番体力の低いものをreturnステートメントで戻り値として返します。defenceメソッドでは,引数として受け取った攻撃力と,自分の防御力を比較してダメージを算出し,ダメージの値を戻り値として返します。

 これで,ユーザーの操作による場合と,PCによる判定を行う場合の,2種類の攻撃対象選択の処理が作成できました。PCの思考ルーチンをより高度なものにしたい場合には,attackメソッド内の処理を変更すればいいわけですね*11

下記のURLから、サンプル・プログラムを無償ダウンロードできます。
http://software.nikkeibp.co.jp/software/download/down05c.html#200503