JavaScript 都道府県対抗 戦国シミュレーションゲーム(2)の続きです。プレイヤーの県のターンの処理を実装します。

戦闘の処理

プレイヤーの県のターンの処理を実装するまえに必要な処理を先に実装しておきます。

戦闘は県庁(城)の外でおこなわれるものと県庁のなかでおこなわれるものがあります。侵攻軍が県庁内に突入する戦闘の場合は守備側が3倍有利とします。

「3倍」の根拠ですが、「攻撃三倍の法則」があります。これは戦闘において有効な攻撃を行うためには相手の3倍の兵力が必要となるというものです。「攻撃側の兵力が劣勢である場合でも戦史において勝利した事例も少なくないために、この法則の正確性については疑問がもたれている」とのことですが、固いことを言うのはやめましょう。所詮ネタゲーです。

Invaderクラスの定義

侵攻軍または援軍を示すInvaderクラスを定義します。

県庁外の戦闘処理

battle関数は県庁外の戦闘処理をおこないます。この関数の引数はKenオブジェクトまたはInvaderオブジェクトになります。どちらにもHeisCountプロパティが存在します。

県庁に突入したときの戦闘処理

rush関数は県庁内に突入する戦闘処理をおこないます。ken側が3倍有利です。

侵攻軍同士の戦闘

自分の県にターンが回ってきたときに自県は侵攻されていて、しかもそれが複数の部隊によるものの場合、侵攻軍同士の戦闘がおきます。また侵攻軍の大名が同じ場合は合流の処理がおこなわれます。

侵攻されていない自分の県のターン

自分の県にターンが回ってきたときの処理を示します。

自分の県にターンが回ってきたときは他の県から侵攻されている場合とそうでない場合があります。そうでない場合は[開発], [徴兵], [調査], [侵攻/移動]ボタンを表示してプレイヤーに行動選択をさせます。侵攻されている場合は[静観], [敵の状態を表示], [決死の全軍突撃]のなかから行動選択させます。

自分の県にターンが回ってきたときに援軍がくる場合があります。

ken.Invaders.length == 1 で ken.Invaders[0].OwnerName が playerOwnerNameである場合です。この段階ではken.Invaders.lengthは0か1のどちらかです(この関数が呼び出される前にbattleBetweenInvaders関数によってken.Invaders.lengthは0か1のどちらかになるため)。

援軍の合流

援軍が存在する場合は合流させる処理を示します。

開発/徴兵の選択時

[開発]をクリックしたときの処理を示します。ken.Valueをインクリメントしてメッセージを表示します。最後にresolve(”)を実行することで待機状態になっているループを再開させます。

[徴兵]をクリックしたときの処理を示します。ken.HeisCountをunitOfHeis増やしてメッセージを表示します。

調査の選択時

[調査]をクリックしたときの処理を示します。どの県を調べるのかを選択するボタンを表示させ、クリックしたらその県の状態を表示します。これは選択してもゲームループは待機したままです。侵攻先を考えるときに活用してください。

侵攻の選択時

侵攻の選択時の処理を示します。侵攻をするときはどこへ?どれだけの人数と兵糧をもっていくのか?を指定しなければなりません。それを設定するためのHeisFoodsクラスを定義します。

コンストラクタの引数は最大の兵数と兵糧です。

selectHeisFoods関数は侵攻に動員する兵数と兵糧数を設定します。

[+10,000], [+1,000], [-10,000], [-1,000], [確定], [キャンセル]というボタンをもつ要素を表示させて兵数と兵糧を設定します。同じ要素を兵数の設定と兵糧の設定で使い回すのです。現在どちらの設定をしているのかを区別できるように変数stepを定義しています。1なら兵数、2なら兵糧です。step == 2でOKがクリックされたら’ok’を返して動員する兵員と兵糧が確定します。キャンセルがクリックされたらひとつ前の状態にもどります。

[侵攻/移動]がクリックされたときの処理を示します。

まずどこを侵攻するのか選択するボタンを表示させます。侵攻できるのはとなりの県だけです。ボタンは最大で8個あり(となりの県をもっとも多く持つのが長野県の8なので)、使わないものは非表示にします。侵攻の対象となる県のボタンがクリックされたらonclickTargetOfInvasion関数(後述)を呼び出して侵攻の処理をおこないます。

侵攻の対象となる県のボタンがクリックされたときの処理を示します。

侵攻の対象を選ぶ要素は非表示にして、HeisFoodsオブジェクトを上記のselectHeisFoods関数に渡して動員する兵数と兵糧を設定するボタンを表示させます。

この関数が’cancel’を返したときは動員する兵数と兵糧を選択する処理がキャンセルされたことになるので、再び侵攻対象を選ぶボタンをもつ要素を表示させます。

‘ok’が返されたときはheisFoodsオブジェクトのなかから侵攻に動員する兵と兵糧の数を取得してInvaderオブジェクトを生成します。そしてこれを侵攻または移動する県のInvaders配列に追加します(援軍もInvaderとして扱う)。

侵攻されている自分の県のターン

自分の県にターンが回ってきたときに侵攻されている場合も考えられます。この場合は[静観], [敵の状態を表示], [決死の全軍突撃]のなかから次の行動を選択します。静観する場合は兵糧攻めを受けるので自県の兵糧の値が大きく(県庁内の兵員数の3倍)下がります。静観は兵糧が足りなくなる場合は選択できません。

静観する場合

これは[静観]を選択したときにおこなわれる処理です。静観するつもりでも敵の側から突入してくるかもしれません。敵が突入しない場合は敵の兵糧が兵の数だけ少なくなります。

敵が静観せずに突入するかどうかを決める関数です。兵糧が足りない場合は突入するしかないので突入させます。それ以外の場合は乱数で決めます。この部分は要検討です。あまり最適化された行動をするとクリアできないクソゲーになってしまいます。

敵の状態を表示

自県に侵攻している敵の状態を表示する処理を示します。

県庁を包囲している敵に突撃する処理を示します。

battle関数を呼び出すたびに自分か敵の兵数が1000減ります。先に0になったほうが負けです。自分が勝った場合は敵の兵糧を奪い取ります。負けた場合は兵糧を奪われるだけでなく県の所有権も奪われることになります。

自県にターンが回ってきたときの処理

ゲームループにおいて自県にターンが回ってきたときの処理を示します。

次回は自県以外の県にターンが回ってきたときの処理を実装します。