Skip to content

Latest commit

 

History

History
189 lines (135 loc) · 7.96 KB

Rule.ja.md

File metadata and controls

189 lines (135 loc) · 7.96 KB

Negotiate and Conquer: SamurAI Coding 2014 ゲームルール

概要

あなたは戦国大名。 旗幟を鮮明にしない中立の領主たちを交渉で味方に引き入れて、勝利を手にしろ!

ゲームの目的

中立の_領主_との_交渉_を通じて_親密度_を上げることで領主の_兵力_を獲得し、全_大名_の中で最大の_総兵力_を得ることが目的である。 総兵力はゲームの中間と最後の2回に渡って獲得する。 それぞれの領主は、親密度が最大の大名に加勢するので、戦闘時にはその大名の総兵力は領主の持つ兵力分だけ増える一方、親密度が最小の大名には敵対するので、その大名の総兵力は同じ分だけ減る。

ゲームの進行

末尾にゲームの進行を司るシステムの擬似コードも掲げています。

初期状態

大名は4人、領主は6人いる。 プレイヤは大名を制御する。 大名の総兵力は初めは0である。 領主は全て中立で、全ての大名との親密度が0である。 各領主の兵力は 3, 4, 5, 6 のいずれかの値にランダムに設定され、開示される。

ターンと交渉

ゲームは_昼ターン_と_夜ターン_を繰り返す9ターンからなる。 最初は昼ターンである。

各ターンで大名は領主を選択し交渉する。 交渉は昼ターンには5回、夜ターンには2回行う。 同一ターンで同じ領主と何回交渉してもよい。 昼ターンでは大名が領主と交渉した回数、夜ターンでは大名が領主と交渉した回数の2倍、その大名と領主の親密度が加算される。 親密度は都度加算され、減ることはない。

昼ターンの後には、どの大名がどの領主と何度交渉したのかが、すべて開示される。 夜ターンの後には、各領主が受けた交渉の回数のみを開示し、どの大名が交渉したのかは秘密にされる。

なお、第5ターン(3回目の昼ターン)の終了時には、秘匿されていたそれまでの2度の夜ターンにどの大名がどの領主と交渉したかの情報が開示される。

総兵力の計算

第5ターンおよび第9ターン(最後のターン)の終了時に、領主達の行動が起き、各大名の総兵力が増減する。 それぞれの領主は、親密度が最大の大名に加勢し(大名の総兵力を、その領主の兵力分増やす)、親密度が最小の大名に敵対する(大名の総兵力を、その領主の兵力分減らす)。 ある領主について親密度最大あるいは最小の大名が複数ある場合、領主の兵力を最大/最小の大名の数で割ったものが各大名の総兵力に加算/減算される。 大名の総兵力はマイナスの値も取りうる。 第5ターンの終了時に増減した総兵力は保持され、第9ターンの結果がそれに加算される。

ゲームの勝敗

全9ターンの終了後、最大の総兵力を持つ大名がゲームの勝者となる。 最大の総兵力を持つ大名が二人以上いる場合、ゲームは引き分けになる。

AIの入出力形式

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