あなたは戦国大名。 旗幟を鮮明にしない中立の領主たちを交渉で味方に引き入れて、勝利を手にしろ!
中立の_領主_との_交渉_を通じて_親密度_を上げることで領主の_兵力_を獲得し、全_大名_の中で最大の_総兵力_を得ることが目的である。 総兵力はゲームの中間と最後の2回に渡って獲得する。 それぞれの領主は、親密度が最大の大名に加勢するので、戦闘時にはその大名の総兵力は領主の持つ兵力分だけ増える一方、親密度が最小の大名には敵対するので、その大名の総兵力は同じ分だけ減る。
末尾にゲームの進行を司るシステムの擬似コードも掲げています。
大名は4人、領主は6人いる。 プレイヤは大名を制御する。 大名の総兵力は初めは0である。 領主は全て中立で、全ての大名との親密度が0である。 各領主の兵力は 3, 4, 5, 6 のいずれかの値にランダムに設定され、開示される。
ゲームは_昼ターン_と_夜ターン_を繰り返す9ターンからなる。 最初は昼ターンである。
各ターンで大名は領主を選択し交渉する。 交渉は昼ターンには5回、夜ターンには2回行う。 同一ターンで同じ領主と何回交渉してもよい。 昼ターンでは大名が領主と交渉した回数、夜ターンでは大名が領主と交渉した回数の2倍、その大名と領主の親密度が加算される。 親密度は都度加算され、減ることはない。
昼ターンの後には、どの大名がどの領主と何度交渉したのかが、すべて開示される。 夜ターンの後には、各領主が受けた交渉の回数のみを開示し、どの大名が交渉したのかは秘密にされる。
なお、第5ターン(3回目の昼ターン)の終了時には、秘匿されていたそれまでの2度の夜ターンにどの大名がどの領主と交渉したかの情報が開示される。
第5ターンおよび第9ターン(最後のターン)の終了時に、領主達の行動が起き、各大名の総兵力が増減する。 それぞれの領主は、親密度が最大の大名に加勢し(大名の総兵力を、その領主の兵力分増やす)、親密度が最小の大名に敵対する(大名の総兵力を、その領主の兵力分減らす)。 ある領主について親密度最大あるいは最小の大名が複数ある場合、領主の兵力を最大/最小の大名の数で割ったものが各大名の総兵力に加算/減算される。 大名の総兵力はマイナスの値も取りうる。 第5ターンの終了時に増減した総兵力は保持され、第9ターンの結果がそれに加算される。
全9ターンの終了後、最大の総兵力を持つ大名がゲームの勝者となる。 最大の総兵力を持つ大名が二人以上いる場合、ゲームは引き分けになる。
AIはゲーム開始時に実行される。
ゲームを始める準備ができたらREADY
と出力したのち、ゲームの設定を入力として受け取る。
また、ターンごとに現在の情報を入力として受け取り、そのターンでの交渉相手を出力する。
AIの思考時間には制限がある。 制限時間を超過するとAIプログラムが強制的に停止され、それ以降のターンの行動はすべて「0番の領主と交渉する」として処理される。
ゲームを開始する準備ができたら、READY
と標準出力に出力する。
ゲーム開始から5秒以内に出力がなければ、AIプログラムが強制的に停止される。
ゲーム開始時、つまり1ターン目の初めに、ゲームの設定が以下のフォーマットで標準入力に渡される。
T D L M0 M1 M2 ... M5
- T: 全ターン数。
- D: 大名の数。
- L: 領主の数。
- Mi: 領主iの兵力。
各ターンの初めに、現在の情報が以下のフォーマットで標準入力に渡される。
T P I00 I01 I02 I03 I10 I11 I12 I13 I20 I21 I22 I23 : : I50 I51 I52 I53 R0 R1 R2 ... R5 N0 N1 N2 ... N5
- T: 現在のターン数。1から始まる。
- P: 昼ターンの場合は"D", 夜ターンの場合は"N"。
- Iij: 領主iから大名jへの公開されている(つまり昼ターンの情報のみでわかる)親密度。このAIプレイヤ自身は大名0である。
- Ri: 領主iからこのAIプレイヤへの真の(つまり夜ターンも合わせた)親密度。
- Ni: 領主iが直前の夜ターンに交渉された回数。
N0 N1 N2 ... N5の行は、昼ターンでのみ含まれる。
そのターンでの交渉相手は、以下のフォーマットで標準出力に出力する。
-
昼ターンの場合
L0 L1 L2 L3 L4
-
夜ターンの場合
L0 L1
Li: 交渉相手の領主の番号(0から5で指定)。L0からL4の順番は関係しない。
一度行動を出力すると、そのAIのターンは終了となる。 なお、ターン開始から1秒以内に出力がなければ、AIプログラムが強制的に停止される。
ゲーム開始時のREADY
やターンの行動を出力する際、最後に改行文字("\n"
)を付けること。
また、出力後は標準出力をflushすること。
daimyo = (total_military_strength)
lord = (military_strength, revealed_intimacy[4], real_intimacy[4])
main:
init
while turn <= 9:
process_turn
turn += 1
finish
init:
daimyos = daimyo[4] (0)
lords = lord[6] (rand(3, 6), [0, 0, 0, 0], [0, 0, 0, 0])
turn = 1
process_turn:
for l in lords:
display_to_all_daimyo(l.military_strength)
display_to_all_daimyo(l.revealed_intimacy)
if is_daytime:
display_to_all_daimyo(l.negotiation_count)
l.negotiation_count = 0
for d in daimyos:
for i in [1 .. (is_daytime ? 5 : 2)]:
target = lords[d.selected[i]]
target.revealed_intimacy[d] += (is_daytime ? 1 : 0)
target.real_intimacy[d] += (is_daytime ? 1 : 2)
target.negotiation_count += 1
if turn == 5:
for l in lords:
l.revealed_intimacy = l.real_intimacy
if turn == 5 or turn == 9:
calculate_total_military_strength
is_daytime:
turn % 2 == 1
calculate_total_military_strength:
for l in lords:
best_daimyos = daimyos.max_by(d -> l.real_intimacy[d])
for d in best_daimyos:
d.total_military_strength += l.military_strength / best_daimyos.size
worst_daimyos = daimyos.min_by(d -> l.real_intimacy[d])
for d in worst_daimyos:
d.total_military_strength -= l.military_strength / worst_daimyos.size
finish:
winners = daimyos.max_by(d -> d.total_military_strength)
draw if winners.size > 1