tsukammoの収穫記

上下左右の更地にアルゴリズムを

codingame:Ocean of Code ルール要約&マップ生成ロジック説明

これはなに?

お題のゲームを解くプログラムを各自が作成、サイト上に提出して順位を競い合うゲームAIコンテストCodinGame「Ocean of Code 」について、ルール要約とマップ生成ロジックを説明します。 ※記載内容の保証はし兼ねるので、自己責任で読んでください。
コンテストページ:https://www.codingame.com/contests/ocean-of-code
コンテスト期間:3月20日~4月20日

f:id:tsukammo:20200329073257p:plain

このゲームは、2人対戦ゲーム(≠play人数)である、ボードゲーム「キャプテンソナー」を元にしています。 互いに潜水艦を操縦し、先に相手のHPを0するか、300ターン経過時にHPが多い方が勝ちです。

ルール説明

潜水艦は海と島で構成される15×15マスの地図上を移動します。潜水艦は海上のみ動くことができ、潜水艦や機雷と同じセルを共有できます。 プレイヤーは互いに最初の地点を指定しゲームをスタートします。互いの開始位置は相手には知らされません。 マップは9セクターに分割され、1つ5x5マス、左上のセクター1から順番に番号が振られ右下のセクターが9です。

f:id:tsukammo:20200329073441p:plain
図:マップとセクター

各プレイヤーがターン毎に交互に行動します。あなたは対戦相手が何をしたかについて知ることができます。(例:北に移動した) 相手の位置を特定するためにこの貴重な情報を上手く活用しましょう。

アクション

ターン毎にあなたは必ず1つ以上のアクションを実行する必要があり、各アクションについて説明します。 パイプ"|"を使用してチェーンすることで、複数のアクションを同時に実行できます。ただし、各アクションは1ターンに1度しか使用できません。

移動(MOVE)

潜水艦を1マスだけ特定の方向(北、東、南、西)に移動します。 移動と同時に、他のアクション(魚雷、索敵、潜航、地雷)のパワーを充電することができます。島や移動済のマスに移動することはできません。

浮上(SURFACE)

移動済みのマスがリセットされ、以前に移動したマスに再度移動可能になります。 しかし、あなたの潜水艦のあるセクター番号が対戦相手に通知され、1HPを失います。

魚雷(TORPEDO):必要パワー3

魚雷を道のり4マス以内の任意の地点に発射します。島を迂回できますが通過はできません。 発射地点にいる潜水艦に2ダメージ、すべての隣接マス(対角線を含む)に1ダメージを与えます。 自分自身にもダメージが入ります。

f:id:tsukammo:20200329073545p:plain
図:魚雷の発射可能地点

索敵(SONAR):必要パワー4

指定したセクター内に敵潜水艦が存在するかどうかを確認します。 結果は次の自分のターンに得られますが、対戦相手が動いた後ではなくアクション実行時の位置です。

潜航(SILENCE):必要パワー6

上下左右の任意の方向に0~4マス直線移動します。通常の移動と同じく、島や移動済みのマスには移動できません。 対戦相手にはあなたが潜航したことしか通知されず、どの方向にどれだけ移動したかを知られずに移動できます。

機雷(MINE):必要パワー3

上下左右の隣接マスに機雷を設置します。同じマスに2つの地雷を設置することはできません。 ただし、対戦相手の潜水艦や地雷のあるマスに設置することは可能です。 地雷は、起爆アクションを使用する場合にのみ爆発し、設置マスを通過しても爆発しません。。

f:id:tsukammo:20200329073600p:plain
図:機雷

起爆(TRIGGER)

自身が設置した地雷を起爆します。ダメージは魚雷同様に、地雷の位置に2ダメージ、全ての隣接マス(対角線を含む)に1ダメージを与えます。 同じターンに複数の地雷を起爆することはできません。そのターンに設置した地雷を起爆することはできません。 自分自身にもダメージが入ります。

リーグ毎の開放

各アクションはリーグに応じて順次解法されていきます。

  • wood2:移動(MOVE)・浮上(SURFACE)・魚雷(TORPEDO)のみ
  • wood1:索敵(SONAR)と潜水(SILENCE)が追加
  • bronze:機雷(MINE)と起爆(TRIGGER)が追加

入出力

具体的な入出力内容について説明します。

開始時

島の位置("x")を示すマップ情報(15x15)を受け取ります。 互いのプレイヤーは、潜水艦の初期位置(x、y)を出力します。

各ターンの入力

3行の情報を受け取ります。

1行目:8つの整数値です。

  • x,y:自身の潜水艦の現在位置
  • myLife:自身のHP
  • oppLife:相手のHP
  • torpedoCooldown,sonarCooldown,silenceCooldown,mineCooldown:各アクションに必要な充電回数。 0で使用可能、-1はそのリーグでは使用不可。

2行目:索敵(SONAR)の結果を示す文字列です。

  • NA:索敵未使用時
  • Y:指定したセクターに敵艦が存在
  • N:指定したセクターには敵艦がいない

3行目:対戦相手がそのターン中に行ったアクションを示す文字列です。複数の場合、"|"で区切られます。
例:MOVE N | TORPEDO 3 5
この例は、対戦相手が上に移動してから、魚雷を地点(3,5)に発射したことを意味します。 対戦相手がまだ何もしていない場合はNAとなります。

各ターンの出力

あなたは"|"で区切られた1つ以上のアクションを出力します。アクションは先頭から順次処理されます。
例:MOVE N TORPEDO | TORPEDO 3 5
このコマンドは、潜水艦を上に移動した後、地点(3,5)に魚雷を発射します。

マップ生成

マップは下記のロジックで生成されます。

  • 一様ランダムにマップ上のマスを1つ選び、島を生成します。これを同じく一様ランダムに5~30回繰り返します。同じ地点を複数指定することもあります。
  • 島のあるマスに対して、右上方向に島を拡張します。そのため、基本的には最低4マスの島が形成されます。

f:id:tsukammo:20200329073615p:plain
図:島の拡張処理