これはなに?
お題のゲームを解くプログラムを各自が作成、サイト上に提出して順位を競い合うゲームAIコンテストCodinGame「Spring Challenge 2020」について、ルール要約とマップ生成ロジックを説明します。
※記載内容の保証はし兼ねるので、自己責任で読んでください。
コンテストページ:https://www.codingame.com/contests/spring-challenge-2020/
コンテスト期間:5月8日~5月18日
(本ゲームは、コンピュータゲーム「パックマン」がモチーフです。) 相手よりも多くのペレットを食べ、マップ上の過半数のポイントを取るか、200ターン経過した場合にポイントの多ければ勝ちです。 ※パックマンの残数は影響しません。
ルール説明
ゲーム開始時に与えらる壁と床で構成されるグリッド上で、各プレイヤーはグリッドに沿って移動できるパックマンを操作します。 マップはランダムに生成され、幅と高さも変化します。マップの各セルは次のいずれかです。
- 壁 ("#"で表される)
- 床 (" "(スペース文字)で表される )
マップは常に中心の縦軸を挟んで対称的に配置されます。 多くのマップでは左右端を壁で区切っていない箇所(トンネル)があり、パックマンがトンネルを通るとマップ反対側に移動できます。
ゲーム開始時、マップはペレット or スーパーペレットで埋め尽くされます。 同じセルにパックマンが移動するとすると取得することができ、ペレットは1ポイント。スーパーペレットは10ポイントのスコアを得て、ペレットは取り除かれます。
各プレイヤーは最大5つのパックマンを同数コントロールします。各ターン毎に、あなたのパックマンとスーパーペレットの位置に加え、視界内にあるパックマンとペレットに関する情報が与えられます。 視界は、あなたのパックマンを起点とし、上下左右の直線上に壁に遮られるまで続きます。 ※初期のwood2リーグでは、最大1つのパックマンを操作し、全ての視界を持っています。
パックマンはじゃんけんと同様の3つのタイプを持ちます。 各タイプは移動とパックマン同士の対決に影響します。
パックマンは2つのスキル(SWITCHとSPEED)を使用でき、共通のクールダウンは10ターンです。スキルはゲーム開始時から使用可能です。
アクション
あなたのパックマンに対し、ターン毎に以下の操作のいずれか1つの操作をすることができます。
MOVE
パックマンに目標の位置を与えると、その位置までの最短ルートを見つけて最初のステップを移動します。 パックマンはルートを選ぶときにペレットや他のパックマンの存在を考慮せず、後述する衝突処理が発生することがあります。
SWITCH
パックマンのタイプを指定したタイプに変更することができます。
SPEED
次の5ターンの間スピードが上がり、MOVE時に2step移動します。つまり2倍の距離を移動できることを意味します。
衝突
他のパックマンと移動が交差したり同じセルに移動した場合、「衝突」が起こります。衝突発生時の解決順序は下記の通りです。
- 移動しているすべてのパックマンはSPEEDに関係なく 1 ステップ移動します。
- 同じタイプのパックマンや同じプレイヤーのパックマンがいる場合、各パックマンの移動はキャンセルされ元のセルに戻ります。 異なるプレイヤーかつ異なるタイプのパックマンの場合、同じセルに移動可能ですが、じゃんけん関係において自身より強いパックマンを横切る場合、同様に移動がキャンセルされます。
- 2.によって新たな衝突が発生する可能性があります。このため、新しい衝突が発生しなくなるまで前のステップが繰り返されます。
- 同じセルにいるパックマンのうち、じゃんけん関係において弱いパックマンはゲームから除外されます。 ※ROCKはSCISSORSを、SCISSORSはPAPERを、PAPERはROCKに対して強いです。
- SPEED能力が発動しているパックマンは、もういちど1.から処理されます。
リーグ毎の開放
※simulator上、4人同時対戦も想定されています。
マップ生成と初期位置
マップ
幅:28~3329~35、高:10~1517の範囲(ルール変更が入った模様)で一様ランダムで決定します。
2人対戦の場合は、横方向に折りたたむ線対称となり、4人対戦の場合は縦横4つ折りの線対称となります。
マップ左上から順に、下記の決められた通路の形状からランダムに選択し、当てはめていきます。
最後に、生成したマップの外周を壁で多います。その際、マップ端の床の上下が壁の場合、トンネルとして床を残します。
初期配置
各プレイヤーの操作するパックマンの数を2~5の範囲で一様ランダムに決定します。 生成したマップの床をランダムに選択し、線対称にパックマンを配置します。 さらに床をランダムに選択し、線対称にスーパーペレットを合計4つ配置します。