動作確認はこちらからどうぞ。

Turnメソッドのなかで城の状態に応じて処理をおこないます。このときIndexクラスが大きくならないように別のクラスを作成して、処理はそのなかでおこないます。

ここでは以下のクラスを作成します。

どこからも攻め込まれていないプレイヤーの城
PlayerCastleIfNormalクラス

攻め込まれようとしているプレイヤーの城
PlayerCastleIfAttackingクラス

包囲されているプレイヤーの城
PlayerCastleIfSiegingクラス

そしてこれらのクラスは前回作成したCastleBaseクラスを継承してつくります。

まずTurnメソッドを示します。1、2、3、5の場合はユーザーがコマンドを入力することになるのでループを抜けます。クラスの内部でメッセージを表示するメソッドを実行しています。するとすべてのメッセージを表示しおわったときにコマンドボタンをクリックできるようになります。

では各クラスをみてみましょう。

どこからも攻め込まれていないプレイヤーの城 PlayerCastleIfNormalクラス

objはIndexクラスのインスタンスです。obj.~とやればIndexクラスのメソッドを実行することができます。このクラスは最後にIndex.ShowSituationメソッドを呼び出しています。Index.ShowSituationメソッドが呼び出されると[次へ]ボタンしかクリックできなくなり、リストに格納されたすべてのメッセージをクリックすると後述するIndex.PlayerActionメソッドが呼び出され、ボタンをクリックできるようになります。

攻め込まれようとしているプレイヤーの城 PlayerCastleIfAttackingクラス

次に攻め込まれようとしているプレイヤーの城 PlayerCastleIfAttackingクラスを示します。

まず到着した援軍がいるなら城のなかにいれます。敵への対応はそれからになります。

もし防御側の兵がいない場合はなにもできずにそのまま占領となります。また攻撃側が出撃元の城を奪われたり包囲されていて帰ることができない場合は強行突入をしかけてします。それ以外のときは「ここは○○城。城に○軍○人が迫っています」と表示され、ユーザーにどのように対応するかを問うてきます。

コンストラクタのなかでは上記で示したような全体の流れが書かれています。

PlayerCastleIfAttacking.SoldiersJoinメソッドは到着した兵がいるなら合流する処理をするためのメソッドです。兵と兵糧を城のなかにいれます。

PlayerCastleIfAttacking.RunOccupyIfNoDefenseSoldiersメソッドは城のなかに兵がいるかどうかを調べていない場合は占領の処理をするメソッドです。占領された城は敵のものになるのでターンは回ってきません。また城を奪われたときはゲームオーバーになったかもしれないのでその確認もしています。

攻め込んできた敵がもとの城に戻れない場合は強行突入をしかけてきます。PlayerCastleIfAttacking.RunForcedRushメソッドはそのときの処理をおこないます。

ここで城を取られたならターンは回ってこないのは上記と同じです。もし攻撃を跳ね返したら自分のターンになりますが、ここで撃退した敵の軍団は最後のひとつかもしれません。そのため敵の滅亡の判定と全部の敵が滅亡した(=ゲームクリア)の判定もしています。

CheckGameClearIfEnemyRuinメソッドは引数でわたした武将が滅亡したかを調べ、滅亡した場合はその旨表示します。このメソッドがtrueを返すのはゲームクリアしたときだけです。。

包囲されているプレイヤーの城 PlayerCastleIfSiegingクラス

次にターンが回ってきた城が敵に包囲されているプレイヤーの城である場合のPlayerCastleIfSiegingクラスを示します。

まず援軍が到着したのであれば敵の包囲軍と戦闘になります。城を守る兵がいない場合は占領されます。そして兵糧攻めをされているので兵糧を減らします。兵糧は兵数によりますが、包囲軍よりも包囲されている城側のほうが2倍早く減ります。

もし包囲軍が兵糧攻めをしても城を落とせる見込みがないと判断したときは強行突入をしてきます。

到着した援軍によって敵の包囲軍を退散させた場合、包囲軍が強行突入してきて返り討ちにできた場合は自分の城にターンが回ってきます。それ以外の場合でも、城を守る兵がいないため占領された場合を除いて自分の城にターンが回ってきます。

コンストラクタを示します。ここでは上記の流れどおりになっています。

PlayerCastleIfSieging.RunCombatForSupportメソッドは援軍が到着した場合の包囲軍との戦闘にかんする処理をおこなっています。戦いにやぶれた側がどうなるかは、以前CastleBase.CombatForSupportで示したとおりです。包囲軍を撃退したら敵が滅亡したりゲームクリアになる場合があるので上記のクラス同様の判定をしています。

CastleBase.CombatForSupportで自動的に退却の処理がおこなわれますが、プレイしている人にわかるように、どの城に逃げ帰ったか、逃げ帰る城がないため全滅したかなどをメッセージで表示しています。

包囲軍を撃退することができたら生き残った兵と兵糧がCastleBase.CombatForSupportによって自動的に自分の城に入るのですが、それもわかるようにメッセージを表示させています。

PlayerCastleIfSieging.RunOccupyIfNoDefenseSoldiersメソッドは城を守る兵がいるかしらべていない場合は占領の処理をおこないます。上記のクラス同様、城をうばわれてゲームオーバーになる場合もあるのでその判定もおこなっています。

PlayerCastleIfSieging.RunSiegeメソッドでは兵糧攻めによって兵糧が減る処理、落城判定をおこないます。

基本的に兵糧攻めでは落城させることができない場合、敵は強行突入をするので包囲軍の兵糧がなくなることはありませんが、その場合は包囲軍は撤退し、自分のターンになるようにしています。

PlayerCastleIfSieging.RunForcedRushメソッドは敵が強行突入してきたときの処理をおこないます。包囲軍が戻るべき城を失った場合は必ず強行突入をしてきます。城を奪われたときのゲームオーバー判定、撃退したときのゲームクリア判定もしていますが、これまでとほとんど同じです。