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

徴兵・徴税・開発

どこからも攻め込まれていない敵の城 EnemyCastleIfNormalクラスをつくる前に徴兵や開発で税収を高めて有利に戦えるようにします。

まず徴兵ですが、兵数を2増やすことができることにします。それからこのゲームは兵糧がないと兵糧攻めで簡単に落城してしまうだけでなく、兵を動かすことすらできません。攻められたときには迎撃に出撃するために兵数と同じだけの兵糧が必要であり、敵の城に攻め込むには兵数の3倍の兵糧が必要です。

土地によって「収穫量」が異なり、収穫量によって徴税をしたときに増える兵糧の量に変化をもたせます。

徴税をすると収穫量の4分の1だけ兵糧が増えます。毎年秋になると収穫量と同じだけ兵糧が増えます。また開発をすると収穫量が5増える仕様にします。

そこでCastleStatusに以下を追加します。

9月のターンになると(monthを4で割ったときの剰余が2のとき)兵糧が増えます。しかし兵糧攻めされているときは増えません。

どこからも攻め込まれていない敵の城 EnemyCastleIfNormalクラス

ではどこからも攻め込まれていない敵の城の処理を考えます。これまではプレーヤーの城であったりどこかから攻め込まれている城だけを考えてきました。攻め込まれている城にはできることが限られていましたが、どこからも攻め込まれていない敵の城であれば、別の敵に攻め込む、兵の移動、徴兵、徴税、開発などができます。

敵の行動パターンですが、以下のように考えます。

敵の城が隣接している場合

自分の城に兵が存在しない、または1しかいない場合は徴兵で兵を増やす
兵糧が3以下で兵を移動させることができない場合は徴税で兵糧を増やす
敵が複数ある場合は兵力が少ない順ものを選択する

攻撃目標として選択した城の兵力が3分の1より少ない場合は3倍の兵力で攻撃する
攻撃目標として選択した城の兵力が0のときは兵力1で攻撃する
攻撃目標を攻撃するために必要な兵糧が足りない場合は徴税をおこなう

攻めるターゲットよりも兵数が少ない場合は徴兵をする

攻めるターゲットよりも兵数が少ないわけではないが、3分の1より多い場合は乱数で適当に決める
乱数で決めた結果、攻撃しない場合は開発をする

優先順位としては攻め込み、すでに攻め込んでいる軍団の支援、すでに敵の城を包囲している軍団の支援

敵と隣接していない場合

隣接している味方の城のなかで包囲されている城があるなら応援派遣する
隣接している味方の城がまだ攻め込まれていないのであれば多くの敵に面している城に兵を送る
支援対象が存在する場合は兵を1だけ残して動かせるだけ動かすが、兵力2以下なら動かさずに開発をする

以上のように考えます。

ではEnemyCastleIfNormalクラスのコンストラクタを示します。

まず、敵にとって自分の城と敵にとって敵の城をそれぞれ取得します。

どこからも攻撃も包囲もされていない城や自分が攻撃・包囲している城であれば攻撃できますが、敵の城であってもべつの敵によって攻められている城は攻撃対象にならないので、攻撃対象になる城だけ取得します。

攻撃対象があればIfEnemyCastleHaveEnemyCastleメソッドでほんとうに攻撃するかを判断します。ない場合はIfEnemyCastleHaveNoEnemyCastleメソッドで味方の城に移動するかどうか判断します。

EnemyCastleIfNormal.IfEnemyCastleHaveEnemyCastleメソッドは攻撃対象が存在する場合、ほんとうに攻撃するのかどうかを判断し、進軍、徴兵、徴税、開発のどれかをおこないます。兵力はもっとも少ないものを選ぶために兵数を少ない順にソートして最初の要素を取得しています。

EnemyCastleIfNormal.IfEnemyCastleHaveNoEnemyCastleメソッドは隣接している城が味方の城の場合の処理をおこないます。

隣接している味方の城のなかで攻撃されようとしている城や包囲されている城がある場合、応援派遣をします。優先順位はすでに包囲されている城、攻撃されようとしている城の順です。複数ある場合はより多くの敵から攻められている城を選びます。

まだ攻め込まれていないのであれば多くの敵に面している城に兵を送りますが、兵力2以下なら開発に専念します。

隣接している味方の城も敵と接していない場合、つまり後方の安全な城である場合は、自分の城以外の城のIDを調べて、少ないものが多ければIDがひとつ下の城に、大きいものが多い場合はひとつ上の城に移動させます。この場合も兵力2以下なら開発に専念します。