都市が凶悪犯や泥棒によって圧倒されている荒廃した戦争で荒廃した世界では、文明は以前は無人の風景に散らばっていた小さな孤立した産業協同組合の形でそれ自体を改革しました。これらのコミュニティの存在は、「スクレイパー」と呼ばれるmerc兵労働者のチームに依存しており、彼らは小屋に売るための貴重な材料を手付かずの領域で探します。これらの材料がますます不足するにつれて、廃棄はますます困難で危険な職業になっています。壊れやすい人間の労働者は、ほとんどが「ロボット」と呼ばれるリモートロボットスタンドインに置き換えられており、典型的なmerc兵は武装した溶接機よりも熟練したプログラマである可能性が高くなります。廃棄における人間の存在が減少するにつれて、merc兵グループ同士の尊敬もまた減りました。ボットは、スクラップを収集するだけでなく、それを守るために装備されており、場合によってはそれを強制的に取得します。ボットプログラマーは、ライバルスクラッパーをしのぐための新しい戦略をたゆみなく考案し、攻撃的なボットを増やし、コミュニティの壁の外に飛び出す人間にとっては別の危険をもたらします。
(ええ、ロゴは陽気に切り取られます)
Scrappersへようこそ!
これはスクラップ収集と工場が実装されていない初期バージョンのスクレイパーです。基本的には「撃つ」ことです。
あなたは、ライバルのスクレーパーグループを勝ち抜くためにボットをリモートで実行するプログラムを作成するmerc兵プログラマです。ボットは、把持と切断、攻撃用具を装備した多くの付属物に囲まれた、電源とシールドジェネレーターを中心にしたクモのような機械です。発電機は、ティック(スクレーパーの時間単位)ごとに12の電力ユニット(pu)を生成できます。あなたは、この力がボットの3つの主要なニーズにどのように分配されるかを制御します:移動、シールド、および火力。
スクレイパーボットは非常に機敏なマシンであり、遭遇する障害物の上、下、および周囲を簡単に移動できます。したがって、衝突はプログラムで考慮する必要のあるものではありません。整数で処理する限り、移動に使用できる12puのすべて、一部、またはすべてを自由に割り当てることができます。ボットの移動関数に0puを割り当てると、ボットは動かなくなります。2puを割り当てると、ボットはティックごとに2距離単位(du)移動でき、5puは5du / tickになり、11puは11du / tickになります。
ボットのシールドジェネレーターは、体の周りに偏向エネルギーの泡を投影します。シールドはポッピングする前に最大1ダメージまで撓むことができるため、シールドジェネレーターがシールドを元の位置に戻すのに十分な電力を生成するまでボットを露出したままにします。ボットが利用できる12puのすべて、一部、またはどれもをシールドに割り当てることは自由です。ボットのシールドに0puを割り当てることは、ボットがシールドを生成しないことを意味します。2puを割り当てると、ボットは12ティックのうち2ティック、または6ティックごとに1回、新しいシールドを生成できます。5puでは、12ティックごとに5シールドの再生成が行われます。
溶接レーザーに電荷を蓄積することにより、ボットは短距離で損傷ビームをかなりの精度で発射できます。シールドの生成と同様に、ボットの発射速度はレーザーに割り当てられたパワーに依存します。ボットのレーザーに0puを割り当てることは、ボットが発砲しないことを意味します。2puを割り当てると、ボットは12ティックごとに2発を発射できるようになります。ボットのレーザーは、物体に遭遇するか、無用に分散するまで移動するため、友好的な火に注意してください。ボットは非常に正確ですが、完全ではありません。精度に+/- 2.5度のばらつきがあるはずです。レーザービームが進むにつれて、その粒子は、ビームが十分な距離で効果的に無害になるまで、大気によって徐々に偏向されます。レーザーは、ポイントブランクの範囲で1ダメージを与え、移動するボットの長さごとにダメージを2.5%減らします。
Scrapperボットは基本的な機能を処理するのに十分な自律性を備えていますが、プログラマーであるあなたに依存してグループとして役立つようにします。プログラマーとして、各ボットに対して次のコマンドを発行できます。
- MOVE:ボットが移動する座標を指定します。
- ターゲット:電力割り当てが許可されたときに狙いを定めて発砲するボットを特定します。
- パワー:移動、シールド、火力の間でパワーを再配分します。
テクニカルゲームの詳細
あなたが精通する必要がある3つのプログラムがあります。ゲームエンジンは重いリフターで、プレーヤープログラムが接続することをTCPのAPIを提供します。プレイヤープログラムはあなたが書くものであり、ここでバイナリを使用したいくつかの例を提供しました。最後に、レンダラーはゲームエンジンからの出力を処理して、戦闘のGIFを生成します。
ゲームエンジン
ここからゲームエンジンをダウンロードできます。ゲームが起動されると、ポート50000(現在は構成不可)でプレーヤー接続のリッスンを開始します。2つのプレーヤー接続を受信すると、READYメッセージをプレーヤーに送信し、ゲームを開始します。プレーヤープログラムは、TCP APIを介してコマンドをゲームに送信します。ゲームが終了すると、scrappers.jsonという名前のJSONファイル(現在は構成できません)が作成されます。これは、レンダラーがゲームのGIFを作成するために使用するものです。
TCP API
プレーヤープログラムとゲームエンジンは、改行で終了するJSON文字列をTCP接続でやり取りすることで通信します。送信または受信できるJSONメッセージは5つだけです。
レディメッセージ
READYメッセージは、ゲームからプレーヤープログラムに送信され、一度だけ送信されます。このメッセージは、プレーヤープログラムにプレーヤーID(PID)が何であるかを伝え、ゲーム内のすべてのボットのリストを提供します。PIDは、どのボットが味方か敵かを判断する唯一の方法です。以下のボットフィールドの詳細。
{
"Type":"READY", // Message type
"PID":1, // Player ID
"Bots":[ // Array of bots
{
"Type":"BOT",
"PID":1,
"BID":1,
"X":-592,
...
},
...
]
}
ボットメッセージ
BOTメッセージは、ゲームからプレーヤープログラムに送信され、ボットの属性が変更されたときに送信されます。たとえば、シールドが投影されるか、ヘルスが変化すると、BOTメッセージが送信されます。ボットID(BID)は、特定のプレーヤー内でのみ一意です。
{
"Type":"BOT", // Message type
"PID":1, // Player ID
"BID":1, // Bot ID
"X":-592, // Current X position
"Y":-706, // Current Y position
"Health":12, // Current health out of 12
"Fired":false, // If the Bot fired this tick
"HitX":0, // X position of where the shot landed
"HitY":0, // Y position of where the shot landed
"Scrap":0, // Future use. Ignore.
"Shield":false // If the Bot is currently shielded.
}
メッセージを移動
MOVEメッセージは、プレーヤープログラムからゲームへのコマンドです(ただし、ボットへのコマンドと考えてください)。移動したいボットと座標を特定するだけです。あなたはあなた自身のボットを指揮していると想定されているので、PIDは必要ありません。
{
"Cmd":"MOVE",
"BID":1, // Bot ID
"X":-592, // Destination X coordinate
"Y":-706, // Destination Y coordinate
}
対象メッセージ
TARGETメッセージは、ボットの1つに他のボットをターゲットにするよう指示します。
{
"Cmd":"TARGET",
"BID":1, // Bot ID
"TPID":0, // The PID of the bot being targeted
"TBID":0, // The BID of the bot being targeted
}
パワーメッセージ
POWERメッセージは、移動、火力、シールドの間でボットが使用できる12puを再割り当てします。
{
"Cmd":"POWER",
"BID":1, // Bot ID
"FPow":4, // Set fire power
"MPow":4, // Set move power
"SPow":4, // Set shield power
}
競争
あなたが手つかずの土地を探索するのに十分勇気があるなら、あなたはmerc兵仲間との二重排除トーナメントに参加します。投稿に対する回答を作成し、コードを貼り付けるか、gitリポジトリ、要点などへのリンクを提供してください。どの言語でも構いませんが、言語について何も知らないと仮定し、プログラムの実行手順を含めてください。好きなだけ投稿を作成し、必ず名前を付けてください!
サンプルプレイヤーのプログラムは、私は非常に彼らに対するあなたのボットをテストをお勧めしますので、トーナメントに含まれます。トーナメントは、4つのユニークなプログラムの提出を受けてから約2週間後に始まります。がんばろう!
--- Winner's Bracket ---
** Contestants will be randomly seeded **
__________________
|___________
__________________| |
|___________
__________________ | |
|___________| |
__________________| |
|________________
__________________ | |
|___________ | |
__________________| | | |
|___________| |
__________________ | |
|___________| |
__________________| |
|
--- Loser's Bracket --- |___________
|
___________ |
|___________ |
___________| |___________ |
| | |
___________| | |
|___________ |
___________ | | |
|___________ | |___________|
___________| |___________| |
| |
___________| ___________|
その他の重要な情報
- ゲームは毎秒12ティックで実行されるため、83ミリ秒ごとよりも頻繁にメッセージを受信することはありません。
- 各ボットの直径は60duです。シールドは追加のスペースを必要としません。+/- 2.5%の精度では、特定の距離でボットに当たる確率は次のグラフで表されます。
- 距離に対するレーザー損傷の減衰は、次のグラフで表されます。
- ボットの精度とレーザー減衰が組み合わされて、ショットあたりの平均ダメージが計算されます。つまり、特定の距離から発砲したときにボットが引き起こす平均的なダメージです。ショットあたりのダメージは次のグラフで表されます。
- ボットのレーザーは、ボットの中心とエッジの中間地点で発生します。したがって、ボットを積み重ねると、友好的な射撃が行われます。
- 敵のボットは約1440du離れて出現します。
- 120ティック(10秒)経過してもダメージが与えられない場合、ゲームは終了します。
- 勝者は、ボットが最も多いプレーヤーであり、ゲームが終了すると最も健康になります。
レンダリングされた画像を理解する
- プレーヤー1は円で、プレーヤー2は六角形で表されます。
- ボットの色は、その電力割り当てを表します。赤が多いほど、発砲により多くの電力が割り当てられていることを意味します。青が多いほどシールドが大きくなります。より多くの緑はより多くの動きを意味します。
- ボットのボディの「穴」は損傷を表します。穴が大きいほど、より多くのダメージを受けます。
- ボットを囲む白い円はシールドです。ボットがターンの終わりにシールドを持っている場合、それが表示されます。ダメージを受けてシールドが破裂した場合、表示されません。
- ボット間の赤い線は、撮影したショットを表します。
- ボットが殺されると、大きな赤い「爆発」が表示されます。