この課題は、@ HelkaHombaの優れた課題である赤対青ピクセルチームバトルボットに触発されました。このチャレンジは、おそらくこのサイトで見た中で最高のチャレンジでした。今まで。
私の挑戦はまだ大きく異なりますが、@ HelkaHombaはそのインスピレーションに感謝します。
概要
これは、すべてのプレイヤーがあなたのチームで生き残っていることによってあなたのチームが勝つ丘のチームです。つまり、最後のチームに立って勝ちます。抽選はやり直されます。
あなたはボードに乗っています。最初のラウンドでのポジションを知っています(0にチェックマークを付けます)。また、あなたはあなたの周りの地域に誰がいるか知っています:
この場合、あなたの周りには誰もいませんでした。ontick
ハンドラーの最初の引数で周囲のアイテムを見ることができます。APIについては後で詳しく説明します。
あなたのチーム
チームはユーザーIDによって決定されます。それを見つけるには、プロフィール画像をクリックしてください:
次に、アドレスバーでユーザーIDを見つけます。
奇妙な場合、あなたは青いチームにいます。
偶数の場合、あなたは赤チームです。
手描きのサークルを歓迎します。
あなたの(ボットの)名前
ボットの名前は、チームの最初の文字(「r」または「b」)で始まります。正規表現と一致する必要があり/^(r|b)[A-Za-z_-]$/
ます。それ以外は、ボットの名前を選ぶことができます。既存のものを使用しないでください。
起動
赤いプレーヤーはマップの上部近くから始まり、青色のプレーヤーは下部近くから始まります。関数のenvironment
パラメーターの最初のティック(ターン)に関する特別な情報が提供されontick
ます。保管することをお勧めします。詳細については、APIをご覧ください。
あなたの番
順番は最初はランダム化されますが、その後は変わりません。
ターンアクション
ターンごとに1つのアクションしか行えません。
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
壁や他のプレイヤーに移動しても、何も起こりません。
回転
回転するには、を呼び出します
this.rotate(num)
。Numは、回転させる方向です。回転は絶対です。
殺します
(別のチームの)他のプレイヤーが直面しているセルにいる場合、
this.kill()
それらを呼び出して殺すことができます。誰もいない場合、または彼らがあなたのチームにいる場合、これは何もしません。例:になっている場合
0
、緑を殺すことができます。1になっている場合、青を殺すことができます。2になったら、オレンジを殺すことができます。3になったら、黄色を殺すことができます。爆弾
爆撃は、あなたとあなたの周りの9マスのチームメイトを含むすべてのプレイヤーを殺します。例:
なぜあなたはこれをしたいのですか? 神風。あなたの周りの9つのセルにあなたのチームにいないプレイヤーがもっといるなら、あなたのチームにもいるので、爆撃を検討するかもしれません。(最初に仲間に通知することをお勧めします!)
地雷を配置する
これにより、チームにいない他の人の死の広場が作成されます。地雷を配置すると、その上に足を踏み入れないように移動します。あなたは呼んで
this.landMine(num)
numは、あなたがに行きたいの正方形です。例:それからあなたは電話する
this.landMine(4)
:その「M」を参照してください?それは地雷です。他の人はそれを見ることができます...今のところ。あなたのチームにいない人も含め、誰でもそれが置かれたダニの地雷を見ることができます。しかし、そのダニが終わった後、誰も、あなたもそれを見ることができません。しかし、敵がその上を歩くとすぐに爆発します。例:
青が地雷の上を移動し、ブーム!新たに殺されました。
(直接的な殺人または地雷から)2キルごとに、1発追加の地雷を獲得します。また、最初に取得します。
掘る
掘るとき、あなたはあなたの周りにある5x5のエリアで地雷を探します。これは、地雷を置いたボットのチームを示していません。(あなたのチームの誰かが設置した地雷で殺すことはできないことを思い出してください。)例えば、これがあなたの周りのグリッドだった場合:
の戻り値は次の
this.dig()
ようになります。
[undefined,undefined,undefined,true,undefined,
undefined,undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,true,undefined,undefined,
true,undefined,undefined,undefined,undefined]
配列のインデックスは、左上から始まり、右ではなく、下から始まります。自分自身は含まれません。
合計で23あり、それらの相対位置はグローバル定数に保存されfiveByFive
ます:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
digは、とは異なり、以前のティックに配置された地雷を明らかにすることに注意してくださいaroundMe
。
コミュニケーション
誰かと話したいときは、を呼び出しますthis.sendMessage(recipients, team, data)
。データをすることができ、あなたが欲しいもの、あなたはそれを送ることができますあなたが望むだれでも、他のチームにも、選手たち。これは、プログラミングが不十分なボットをだますために使用できますが、すべてのプレイヤーは誰がメッセージを送信し、誰がチームに所属しているかを確認できます。
例:
「redisbest」という名前のボットに何かを送信します。
this.sendMessage("redisbest", undefined, "Hi!");
「redisbest」および「blueiscool」という名前のボットに何かを送信します。
this.sendMessage(["redisbest", "blueiscool"], undefined, {hello: "there"});
赤チーム全体に何かを送る
this.sendMessage(undefined, "red", {hello: "red"});
みんなに何かを送る
this.sendMessage(undefined, "*", {hello: "everyone"});
赤いチーム全体と「blueiscool」という名前のボットに何かを送信します。
this.sendMessage("blueiscool", "red", {hello: "bots"});
API
コードは、関数の1回の呼び出しで構成する必要がありますcreateBot
。他に何もありません。サンプルコード:
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, from, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
(これを自由にコピーして貼り付けます。チームなどに合わせて変更するだけです。)
方法
ontick(environment)
あなたの番になったときに呼び出されます。
Promise
1秒以内に解決するを返す必要があります。そうしないと無視されます。これはパフォーマンス上の理由によるもので、タブがハングしないという素晴らしい副作用があります。this
(オンティックの場合)landMines
残っている地雷の数。キルが多いほど、地雷が多くなります。ボットを2つ倒すごとに、地雷が1つ増えます。また、1を開始します。direction
あなたが向いている方向。storage
ストレージへの呼び出しの間持続することonTick
とonMessage
。開始時の空のオブジェクト。目的に合わせて変更しますが、正しく保持されるように、常に配列またはオブジェクトであることを確認してください。move(num)
指定した位置に移動します。無効な場合は何もしません。詳細については上記を参照してください。rotate(num)
指定した位置に回転します。無効な場合は何もしません。詳細については上記を参照してください。kill()
直面しているプレイヤーが存在し、チームにいない場合、プレイヤーを殺します。詳細については上記を参照してください。bomb()
あなた自身を含む、あなたの周りの9つの正方形の誰でも殺しますlandMine(num)
現在地に地雷を置き、指定された位置に移動します。無効な場合、num
または何も残っていない場合は何もしません。詳細については上記を参照してください。dig()
新しい! あなたを中心とした5x5のエリアの地雷に関する情報の配列を返します。詳細については上記を参照してください。sendMessage(recipients, team, data)
recipients
単一のボット(文字列)、ボットの配列、またはundefined
/のいずれかnull
です。あなたがメッセージを送りたい人です。team
メッセージを送信したいチームの文字列です。"*"
全員にメッセージを送信するために使用します。data
JS関数に渡すことができるものです。受信者に送信されます。オブジェクトまたは配列の場合、参照によって渡されるため、ユーザーと受信者はそれを自分storage
やオブジェクトに保存でき、オブジェクトへの変更は両方のボットのコピーに影響します。ボットのリスト、文字列で指定された正確なボット、または指定したチームのボットのいずれかにいる受信者は、メッセージを取得することに注意してください。
environment
最初のティックで
x
:プレーヤーのx位置y
:プレーヤーのYポジションgridWidth
:グリッドの幅(セル単位)gridHeight
:グリッドの高さ(セル単位)すべてのティックで
aroundMe
:プレイヤーと地雷の配列。プレイヤーは似たオブジェクト{name: "bot name", team: "bot team"}
であり、地雷はそう{team: "team of bot who placed mine"}
です。配列のインデックス:現在のティック以外のティックに配置された地雷は表示されないことに注意してください。
aroundMe
例:これがグリッドであるとしましょう(あなたは赤です):
次の
aroundMe
ようになります。
[
{name: "bexamplebluebot", team: "blue"},
undefined,//sparse array, nothing in index 1
undefined,//there is technically a landmine here, but it wasn't placed this tick, so it is not shown
undefined,//nothing in 3
{name: "yexampleyellowbot", team: "yellow"},
{team: "red"},//this is a landmine, you can tell is not a bot because it has no name. mines have the team name of the player they were placed by. This mine was placed this tick, otherwise you couldn't see it
//nothing else after index 5, so the array's length is 5.
]
配列のインデックスは次のとおりです。
ボットはこれを効果的に確認します。
onmessage(data, fromBot, fromTeam)
this
(onmessageの場合)sendMessage(recipients, team, data)
標準メッセージ送信機能。storage
標準ストレージ。
data
送信者から送信されたデータ。fromPlayer
メッセージの送信元のプレーヤー。fromTeam
メッセージの送信元のチーム。onkill()
this
(オンキルのとき)sendMessage(recipients, team, data)
標準メッセージ送信機能。
便利な(定数)グローバル配列:
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
データをmove関数に渡したり解釈したりするのに便利ですaroundMe
。上記を参照。
fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
ハンドラーthis.dig()
内の関数に役立ちontick
ます。
やってみて!
コントローラは、パフォーマンス上の理由からローカルホスト上の私のマシンから実行されますが、CodePenを使用してボットをテストできます。
Enter
実行をクリックする前に、コードをコンソールに貼り付けて押す必要があることに注意してください。好きなだけボットを貼り付けることができます。「テストボット」は、テスト対象の例です。あなたがそれらのすべてを打ち負かすか、または結ぶことができるならば、あなたは少なくともまともなボットを持っています。
提出
ルール
ルール(コントローラーにより実施)
- メイン
ontick
コードは1秒以上かかることはありません。ラウンドが永遠に続くことは望ましくありません。コードに1秒以上かかる場合、停止します。 - ターンごとに複数のアクションを実行しようとした場合、または無効なアクション(
this.move(-1)
壁への移動など)を実行した場合、それは無視されます。 - もっとすぐに来るかもしれません...
ルール(私によって実施され、DQになる可能性があります)
- グローバル変数を書き込まないでください(読み取りは問題ありません)。
- あなたのコードは、そう、(場合にコントローラがNodejsに移植される)Nodejsで作業しなければならない
JSON.parse(...)
細かいですが、alert()
ではありません。 - あなたは呼び出すことが許可されていない
createBot
かのコントローラに干渉する任意の方法。 - 他人のコードを許可なく使用したり、大幅な変更を加えたりしないでください。コピーボットはありません。
- 抜け穴はありません!
- もっとすぐに来るかもしれません...
私のボット
ボットは次のとおりです。
このボットは、アクションをランダムに選択します。まあ、それは加重ランダムですが、それでもかなりランダムです。少なくともまともなボットを持っているよりも、このボットを殺すことができれば(最終的には自殺しますが、カウントされません)。それを投稿して、何が起こるか見てください!
ボットの名前は「x」で始まり、チームは「none」です。このコードの一部を使用することはできますが、少なくともいくつかの変更を行ってください。少なくとも数字を微調整することに煩わされなければ、勝つことはできません。
提出物のフォーマット
次の形式を使用してください:
# rmyamazingbot
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, fromTeam, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
Long, but cool explanation...
機能のリクエスト、バグ、質問など?
以下にコメントしてください!そのコメントが既にあるかどうかを確認してください。すでにある場合は、それを投票します。
チームと話をしたいですか?
言語
現在、JSとJSにコンパイルされるもののみがサポートされていますが、Nodejsで他の言語を動作させる方法を知っている場合は、コントローラーをNodejsに移植できます。
最終ノート
戦略のアイデア
あなたのチームを助けてください!別のボットを支援し、連携するように設計されたボットを作成します。この戦略は赤対青でうまく機能しました-Pixel Team Battlebots
担当者
優勝チームで最も高い投票数の回答を受け入れます。以前の回答はより多くの票を獲得する傾向がありますが、それらの弱点は発見され、悪用される可能性が高いことに留意してください。
また、すぐに答えると、+ 100の賞金がもらえるかもしれません。