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

城の状態を初期化するときにInitCastleStatusListという自作メソッドを作りましたが、隣の城しか攻撃できないので内容を変える必要があります。

各城のターンを管理するTurnメソッドについてですが、城の状態は必ず以下のどれかになります。

どこからも攻め込まれていないプレイヤーの城
攻め込まれようとしているプレイヤーの城
包囲されているプレイヤーの城
プレイヤーに攻め込まれようとしている敵の城
プレイヤーに包囲されている敵の城
別の敵に攻め込まれようとしている敵の城
別の敵に包囲されている敵の城
どこからも攻め込まれていない敵の城

「攻め込まれようとしている」とは兵糧攻めが開始されるまでの状態、「包囲されている」とは兵糧攻めが開始されて以降の状態です。一応両者はわけて考えます。

ターンが始まったら「次へ」のボタンしかクリックできないようにします。まだそのターンでなにもしていない城のリストを取得してforeach文で回します。

「どこからも攻め込まれていないプレイヤーの城」であるならすべてのコマンドが使えるように、「攻め込まれようとしているプレイヤーの城」「包囲されているプレイヤーの城」は「反撃」コマンドが使えるようにするためにいったんループから抜けます。

それから「プレイヤーに包囲されている敵の城」のときも「突入」コマンドが使えるようにループから抜けてボタンを表示してクリックできるようにします。

次にIndex.razorファイルを示します。コマンドが増えたぶんボタンも増えています。ターンと城の状態にあわせてボタンを表示させたり非表示にします。

つぎにフィールド変数と各ボタンを表示するメソッドを示します。

「次へ」ボタンを押すたびにゲームの状況が表示されるわけですが、以下はその状況をリストに追加していくメソッドです。

ゲームが進行すると表示させるべきメッセージがSituationのリストである_situationsの中に格納されていきます。その先頭をとりだしてメッセージを表示するとともに城の表示にも反映させます。それが後述するShowSituationメソッドです。

ShowSituationメソッドを実行しているときは[次へ]のボタンしか押せません。ゲームが終了していないにもかかわらず表示すべきメッセージがない場合はTurnメソッドが呼び出されます。しかしすべての城の行動が終了しているのであれば次の月のターンになります。このときはNextTurnメソッド(後述)が呼び出されます。

次に表示させるメッセージがなくなりゲームが終了しているのであればゲーム終了です。そうでないならプレイヤーに順番が回ってきたことになります。プレーヤーがコマンドボタンをクリックできるようにPlayerActionメソッド(後のページ参照)が呼び出されます。

すべてのメッセージが表示され、ゲームが終了しているのであれば終了です。終了しているかどうかは前のページの最後にあるIsGameClearメソッドとIsGameOverメソッドでおこないます。

いまの月のターンがすべて終了したら次の月のターンに入ります。NextTurnメソッドはそのためのものです。時間を3ヶ月すすめ、CastleStatusListの順番をシャッフルして次のターンの順番を表示します。