aBOTcalypse
キングオブザヒルチャレンジに参加するボットを設計してください!デフォルトのボットゲームの再生を次に示します。
ボードは、横スクロールビデオゲームのように2Dです(ただし、スクロールはありません)。
有効なボットは、ボードの見える領域の複数行の文字列表現を受け入れ、ボットの移動を出力する必要があります。
力学
これはサバイバルゲームです。黙示録が来て、ボット(そしてハンマースペースに保管されている岩の無限の供給)だけが残っています。各ボットには、標高0のランダムな開始位置が与えられます。特定の移動では、ボットは休息、移動、岩の投げ、または岩の落下を行うことができます。ボットは静止した岩とスペースを共有できますが、投げられた岩に当たったボットのように、別のボットや流星と衝突するボットは殺されます。
- 重力:ボットと岩はボードの床または別の岩の上に置く必要があります。他の何か(空気、流星、ボットなど)で休むと、1つが「サポートされない」ままになります。サポートされていないボットやロックは、サポートされるまで落下します。1スペースを超える落下はボットを殺し、落下する岩またはボットの下のボットも殺されます。つまり、移動またはドロップアップの試行は、ボットが現在岩とスペースを共有している場合にのみ機能します(それ以外の場合、ボット/岩は1スペース下にフォールバックします)。スペースの下にある岩が落下したり、流星や発射物によって破壊されたりすると、スペースは「サポートされなくなり」ます。
- 流星:流星は毎ターン上からボードに入ります。流星の速度は大きさが2で、[-180,0]の範囲でランダムに選択されたランダムな角度と、ランダムな開始x位置があります。流星は、何かにぶつかるまで、与えられた軌道に沿って一直線に落ちます。流星の動きの丸めは0に向かっていることに注意してください(Pythonのように
int()
)。 - 発射物:ボットは、標高までの距離を問わず、岩を投げることを選択できます。スローされた岩は、何かにぶつかるまで直線的に移動します(流星とは異なり、すべて1ターンで、スローされた岩はボードに表示されません)
- elevation / max distance
。投げられた岩はx +-1平方で軌道を開始することに注意してください。たとえば、ボットの高度が5で、左に1の距離を投げた場合、岩はで始まり、(x-1,5)
で終わり(x-2,0)
ます。衝突はのステップでのみチェックされdx=1
、dy
(Pythonのようにint()
)0に向かって丸められます。
入力
各ボットは、ボードの境界まで、各方向に20ピクセルの正方形(チェビシェフ距離= 20)を見ることができます。各入力文字列には8つの異なる文字があります。
'#'
(ボード境界)'.'
(空気)'@
'(流星)'&'
(岩)'e'
/'s'
(敵ボット、またはそれ自体)'E'
/'S'
(岩とスペースを共有する敵ボット、またはそれ自体)
以下は入力例です(改行はになります\n
):
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............@...............#
.....................E........#
.....................&........#
.....................&........#
.....................&........#
.....................&........#
...........@.........&........#
....................s&........#
###############################
出力
ボットが各ターンで実行できるアクションは4つあります。
rest
(文字通り座って何もしない)move <direction>
4つの方向のいずれかでボット1つのスペースを移動しup
、down
、left
、またはright
。新しいスペースが床や岩で支えられていない場合、動きによりボットが落下しfall > 1 = bot.kill()
ます()。drop <direction>
指定された方向に岩を配置(「ドロップ」)します。岩を上に落とす(つまり、正方形に岩を置く[bot_x, bot_y+1]
)か、横に置くと、サポートされるまで(おそらく中にボットに落ちる)落下しdrop up
ます。drop down
既に岩がない場合は、ボットと同じ位置に岩を配置します。throw <direction> <distance>
上記の「発射体」のメカニズムに従って、指定された最大距離で岩を投げます。最大距離は、上向きまたは下向きの投げには関係ありません-発射物は下の正方形down
と衝突するか(の場合)、または上にある正方形と衝突しようとし(の場合up
)、次に何もヒットしない場合はボットの正方形と衝突します(ボットを殺します) 。
コンテストのボットは、入力文字列を受け取ったときのアクションとともにスカラー文字列を出力する必要があります。
インターフェース
ボットは、Python 2を介して呼び出すことができる単一のプログラムで構成する必要がありますsubprocess
。すべてのコマンドを指定する必要があり、と呼ばれるファイルに保存されますcommand.txt
。ゲームが始まる前に、コントローラーはの各コマンドをcommand.txt
順番に実行し、その後、最後のコマンドを使用して入力をボットに渡します。
ボットはstorage.txt
、そのフォルダーに呼び出される単一のストレージファイルを持っている場合があります。「Default Thrower」ボットは、jsonを使用してさまざまなターン中にその状態を保存する実装例を示しています。さらにerrlog.txt
、実行中にボットが失敗した場合に備えて、書き込み専用のデバッグ出力を含めることもできます。各ボットでいくつかのテストを実行して、事前にエラーを見つけてみます。
得点
ボットの合計スコアは、ボットが存続するターン数に等しく、最大長YのXゲームにわたって累積されX,Y = 10, 500
ます。現時点では、ボットが長期間続く場合はYを増やし、ボットが短時間続く場合はXを増やします。
コントローラのコードはcontroller.pyにあります。Communicatorコードを適合させたDDOS kothについて@Nathan Merrillに感謝します。
&&&\n&S&\n###
ですか?彼らは流星の落下に対して無防備です。