これは、ラウンドロビンでのキングオブザヒルチャレンジです。西の最高のガンマンを見つけるのは戦いです!
このコンテストに参加するには、2つの機能を作成する必要があります。最初の1つは、ガンマンの属性を設定し、2つ目は、ガンマンのメインロジック関数です。
属性関数
function () {
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
}
属性関数には、いくつかの規則に従って設定する必要がある5つの変数が含まれます(例外はname
任意の文字列です)。ガンマンに正確に合計15ポイントを費やす必要があります。15ポイントすべてを費やしていないガンマンは資格がありません。属性の仕組みは次のとおりです。
numbOfBullets
-銃の弾数を定義します。の初期値と最小値
numbOfBullets
は1です。追加の弾丸ごとに1ポイントかかり、最大16個の弾丸に15ポイントが費やされます。reloadSpeed
-ガンマンが弾丸を使い果たした後に銃をリロードするのに必要なターン数を定義します。基本値と最大値は4で、最小値は1です。この属性を1減らすと、2ポイントかかります。
shotsPerTurn
-ガンマンが1ターンで撃てる回数を定義します。基本値と最小値は1です。1ずつ増加するごとに3ポイントかかるため、ラウンドごとに最大6ショット、15ポイントを使用できます。上記のこの属性を上げると
numbOfBullets
、銃が保持できる以上の弾丸を撃つことができないため、逆効果です。moveSpeed
-ガンマンが1ターンで実行できるスペースの数を定義します。基本値と最小値は1です。1ずつ増加するごとに3ポイント、最大6スピード、15ポイントが消費されます。ガンマンは、最大の移動速度まで、ターンごとに左または右に走ることができます。彼はまた、彼にボーナスを与えることができます(これについては後で説明します)。
上記の関数の例では、弾丸に6ポイント、リロード速度に6ポイント、動きに3ポイントを費やしています。
主な機能
function main(bulletsLeft, yourShots, enemyShots, yourMovement, enemyMovement) {
var shots = [];
shots.push(Math.floor((Math.random() * 24) + 1));
var move = yourMovement[yourMovement.length - 1] + 2
var play = [];
play.shots = shots;
play.move = move;
play.reload = false;
return play;
}
パラメーター:
bulletsLeft
、銃に残っている弾丸の数yourShots
、これはガンマンが発砲した過去のすべての位置の配列の配列です。ラウンドごとに1発の銃弾を発射できるガンマンの例:
[[12],[4],[22],...]
ラウンドごとに3発の銃弾を発射できるガンマンの例:
[[12,13,14],[11,15,16],[9,14],...]
enemyShots
-上記と同じですが、敵のためにyourMovement
-すべての過去の移動位置の配列enemyMovement
、上記と同じですが、敵のために
あなたが返す必要があるもの:
3つの属性を持つ変数を返す必要があります。
shots
-ガンマンが撃つスペースを決定する数字の配列move
-ガンマンが移動しようとするスペースを決定する単一の番号reload
-ガンマンをリロードできるtrue / false値
決闘
コンテストはラウンドロビン1対1のシステムに従います。各ガンマンは、他のすべてのガンマンに対して50ラウンドを持っています。ラウンドは、誰かが弾丸に当たるか、66ターンが経過するまで続きます(ターンは、両方のプレイヤーが撃ったときです)。
ガンマンは敵を殺すことで2ポイント、両方が同じターンで死亡した場合は1ポイント、66ターンの制限に達した場合は0ポイントを獲得できます。射撃場は24スペース幅(1-24を含む)です。プレイヤーをヒットしてラウンドに勝つには、彼が現在立っているのと同じスペースでシュートする必要があります。
決闘がどのように機能するかについてのステップバイステップガイドです。これは、すべての無効なコマンドと特別なルールもカバーします。
- 各決闘の開始時に、両方のプレイヤーがスペース12に置かれ、リボルバーが完全にロードされます
- 主な機能が呼び出され、ガンマンは最初の移動コマンドを実行し、撮影する場所を選択します
- 最初に、ガンマンは新しい場所に移動します。移動コマンドで無効な入力が行われた場合(1より低い位置または24より高い位置、またはより多くのスペースを移動した場合も許可されます)、同じ位置に留まります。
- 前のターンで弾丸がなくなった場合、または自分でリロードを呼び出した場合、ガンマンはリロードサイクルに入ります。彼はあなたがあなたの
reloadSpeed
価値を設定するのと同じ数のターンの間リロードしています。静止することを決めた場合(前に立っていた場所と同じスペース整数を返すか、単に無効な値を返す)、リロードカウンターは1ターンではなく2ターンダウンします。 - 射撃値をチェックするようになりました。ターンごとに好きなだけ射撃場所を入力することができます:ターンごとの射撃数とリボルバーの弾丸数(どちらか低い方)。
shotsPerTurn
このターンで静止することにした場合、あなたの価値は1増加します。したがって、静止することに決めた場合、追加のショットを作ることができます。リロードサイクルにいる場合、ショットはありません。 さて、実際の射撃が来ました。これには2つの方法があります。両方のガンマンが同じmovespeed statを持っている場合、彼らは両方を同時に撃ち、両方を同時に殺すことができます。移動速度の統計が異なる場合、より高い移動速度の統計を持つボットが最初に射撃を開始し、敵を殺すとこのラウンドに勝ちます。ガンマンが1ラウンドで1つ以上の弾丸を撃つことができる場合、例としてより多くのサイクルを除いて、上記と同じルールに従います:bot1には3つの弾丸があり、より高速であり、ボット2には2つの弾丸があるとしましょう:
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
同じ移動速度であれば、同じサイクルでBot1がBot2にヒットすれば、Bot2もBot1にヒットし、引き分けになります。
ルール
最初に、ここでも適用されるいくつかの規則をカルビンの趣味のエントリからコピーしています。
新しいJavaScript変数を宣言するときは、varキーワードを使用する必要があります。 これは、varなしで宣言された変数がローカルではなくグローバルになるため、誤って(または意図的に)コントローラーをいじったり、他のプレイヤーと自由に通信したりするためです。あなたが不正行為をしようとしていないことを明確にする必要があります。
関数を宣言するときは、varキーワードも使用するのが最善です。つまり、var f = function(...) {...}
代わりにuseを使用するのfunction f(...) {...}.
は完全に理由がわかりませんが、違いが生じる場合があります。
あなたのコードではあなたはできないかもしれません...
- コントローラーまたは他のプレーヤーのコードにアクセスまたは変更しようとします。
- JavaScriptに組み込まれているものを変更しようとします。
- Webクエリを作成します。
- そうでなければ悪意のあることを行います。
私の追加ルール:
- ユーザーは好きなだけガンマンを作成し、いつでも機能を変更できます
- ゲームからエントリを削除します。過度の時間がかかるか、適切と思われる方法でチートを試みます。
- 関数が返す必要がある属性の名前は、同じ構造を持つ例と同じでなければなりません!
回答はこの形式である必要があります。最初の関数は属性関数であり、2番目は論理関数です。感嘆符を使用したことに注意してください。コードブロック間に新しい行を作成するだけで、パーサーは2つの異なるコードブロックを表示しないため、記号を使用するだけで感嘆符を使用する必要があります(感嘆符を使用するだけです):
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
var shots = []
var testBot_moveUp = true
if(Math.random() * 2 > 1)
testBot_moveUp = false
shots.push(Math.floor((Math.random() * 24) + 1))
var move = 0
if (testBot_moveUp)
move = yourMovement[yourMovement.length - 1] + 2
else
move = yourMovement[yourMovement.length - 1] - 2
move = 12
var play = []
play.shots = shots
play.move = move
play.reload = false
return play
そしてここにコントローラーがあります:GAME CONTROLLER。リンクを開いて、ボットがロードされるのを待ってから、戦闘に参加するボット(おそらくすべて)を選択し、スタートボタンを押します。
また、競合するテストボットを回答として入力しました。これは、回答の構造がどのように見えるかを示す例にもなります。注として、あなたが小さな間違いをして答えを交換した場合、stackexchangesアルゴリズムはすぐにそれを拾わないかもしれず、stackexchangeによって生成されたコントローラが使用するサイトは更新されません(しかし、後でまたはあなたが提案するより大きな変更を加える場合最後にテキストを追加してください)。ここにサイトがあります:codelink
<!---->
「見えない」コードブロックを分離するために使用できます(なし!
)。