最速の西の銃、キングオブザヒルチャレンジ


22

これは、ラウンドロビンでのキングオブザヒルチャレンジです。西の最高のガンマンを見つけるのは戦いです!

このコンテストに参加するには、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


現時点では、2つのボットを互いに戦わせることができないようです-両方を選択した場合、スタートを押しても何も行われないようで、それがボットが間違っているのか、それともコントローラーに時間がかかる
euanjt

私は私の質問の最後で説明したようにいや、あなたはあなたの答えの最後にいくつかのテキストを追加する場合、それはdidntの編集、それはまだstackexchangeコードジェネレータで、それはdidntは予告変更があったこと、それが動作するはずですので、あなたの答えを編集したとき
バジュラ

1
私はそれらのエラーを修正したと思います(私はそれらのエラーを修正しました-コントローラが正しい出力を提供しなかっただけで静かに何もしないとコントローラに教えられない場合、エラーを見つけるのは難しいです
-euanjt

8
<!---->「見えない」コードブロックを分離するために使用できます(なし!)。
KRyan

1
エラーが見つかりました。"PLAY1 = maskedEval(playingPlayers [A] .CODE、paramsは)"に変更し、 "PLAY1 = maskedEval(プレーヤー[A] .CODE、paramsは)" - PLAY2に対して同じ
QuadrExAtt

回答:


6

パンダラス

var bot = {
    name:"Pandarus",
    numbOfBullets: 2,
    reloadSpeed: 3,
    shotsPerTurn: 1,
    moveSpeed: 5
}
return bot

var myPos;
if(yourMovement.length > 0)
{
    myPos = yourMovement[yourMovement.length - 1];
}
else
{
    myPos = 12;

}
var EnemyPos;
if(enemyMovement.length>0) {
    EnemyPos = enemyMovement[enemyMovement.length - 1];
}
else
{
    EnemyPos = 12;
}

var play = {
    shots: [
    ],
    reload: true,
    move: 12
};
if (bulletsLeft < 1)
{
    //Reload
    play.reload = true;
    play.shots = [
    ];
}
else
{
    //FIRE!!!
    play.reload = false;
    var enemyMoveSum = 0;
    for (var i = 0; i < enemyMovement.length; i++)
    {
        var MoveSinceLast;
        if (i == 0)
        {
            MoveSinceLast = enemyMovement[i] - 12;
        }
        else
        {
            MoveSinceLast =enemyMovement[i] - enemyMovement[i-1];
        }

        enemyMoveSum += Math.abs(MoveSinceLast);
    }

    var enemyAvgMove;
    if (enemyMovement.length > 0)
    {
        enemyAvgMove = Math.round(enemyMoveSum / enemyMovement.length);
    }
    else
    {
        enemyAvgMove = 0;
    }

    var LeftShot = EnemyPos - enemyAvgMove;
    var RightShot = EnemyPos + enemyAvgMove;

    if (RightShot > 24 ||( (LeftShot>0) && (Math.random()*2 < 1)))
    {
        play.shots.push(
            LeftShot
        );
    }
    else
    {
        play.shots.push(
            RightShot
        );
    }
}

var MyMove = myPos;
do
{
    var move = Math.floor(Math.random() * 10) - 5;
    if(move == 0)
    {
        move = 5;
    }
    MyMove = myPos + move;
}
while (MyMove<1 || MyMove > 23)

play.move = MyMove;

return play;

パンダラスは、弾丸の道を抜け出すために彼の速度に依存し、敵の前の動きを使用して、どこに行くのかを推測します。


申し訳ありませんが、スコアリングにバグがあり、すべてが正しく動作するようになりました。私のボットが笑勝ったことが私にとって非常に奇妙だった
Vajura

ああ、あなたの提出は、あなたの移動コマンドで別の奇妙なこと、数字を持っていたところ小数私はコントローラに丸め追加して
Vajura

私はそれが小数を出力した理由を本当に知りません:-)私は明日それを改善しようと思います
-euanjt

私はそれがコントローラを破ったためにconsole.logを除去
Vajura

ええ、すみません、とにかく(最終的に)動作するようになりました(そしてテストボットを破りました):)
euanjt

5

シンプルな男

何も完璧ではありませんが、少ない力ですべてが得意です。

return {
    name: "A Simple Man",
    numbOfBullets: 7,   /* 9 points */
    shotsPerTurn: 2,    /* 3 points */
    reloadSpeed: 4,     /* 0 points */
    moveSpeed: 3        /* 3 points */
}
var lastPos = yourMovement[ yourMovement.length - 1 ],
    lastEnemyPos = enemyMovement[ enemyMovement.length - 1 ],
    lastEnemyMove = enemyMovement.length > 1 ? 
        ( function () {
            var i = 0,
                currentMove,
                minMove = Infinity;
            while ( i < enemyMovement.length ) {
                currentMove = Math.abs( enemyMovement[ enemyMovement.length - 1 ] - enemyMovement[ enemyMovement.length - 2 ] );
                if ( currentMove < minMove ) { minMove = currentMove; }
                return minMove;
            }
        } )()
        : 1,
    needsToReload = bulletsLeft === 0;

return {
    shots: [ yourMovement.length === 1 ? 12 : lastEnemyPos + lastEnemyMove, lastEnemyPos - lastEnemyMove ],
    move: needsToReload ? lastPos : lastPos + Math.floor( Math.random() * 3 + 1 ) * ( ( Math.random() > 0.5 ) ? -1 : 1 ),
    reload: needsToReload
};

構文の強調表示を追加してくれた@ProgramFOXに感謝しますが、これはプログラムを壊しました。
マーカスブレッターマン

それは変だ。構文の強調表示の追加はHTMLコメントにすぎず、プログラムを中断することはありません。
ProgramFOX

わかりませんが、プログラムは私のコードをロードしませんでした。
マーカスブラッターマン

ああ、おそらく、パーサーはHTMLコメントのフォーマットを理解していなかったので、実際にプログラムを壊しました。私の悪い!
ProgramFOX

4
var bot = {
    name: "testBot",
    numbOfBullets: 7,
    reloadSpeed: 1,
    shotsPerTurn: 1,
    moveSpeed: 2
}
return bot
var shots = []
var testBot_moveUp = true
if(Math.random() * 3 > 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
var play = []
play.shots = shots
play.move = move
play.reload = false
return play

テストボット。これはコントロールテストとして追加されました。誰かがこれに負けたら恥ずかしいはずです:)。ボットの動作を修正し、間違ったテストボットをコピーして貼り付けました(常にフィールド12に留まりました)


4
var bot = {
    name: "Sniper",
    numbOfBullets: 4,   /* 3 points */
    reloadSpeed: 4,     /* 0 points */
    shotsPerTurn: 1,    /* 0 points */
    moveSpeed: 5        /* 12 points */
};
return bot;
var play = {};
var my_speed = 5;

var gatherStatistics = function(moves) {
    var enemyMoves = [];

    for (var m = 1; m < moves.length; ++m) {
        var diff = moves[m]-moves[m-1];

        var found = false;
        for (var i = 0; i < enemyMoves.length; ++i) {
            if (enemyMoves[i][0] === diff) {
                ++enemyMoves[i][1];
                found = true;
                break;
            }
        }
        if (!found) enemyMoves.push([diff,1]);
    }

    return enemyMoves;
};
var calcOptimalTarget = function(moves, histogram) {
    var enemy_pos = moves[moves.length-1];
    var optimalDiffs = [];
    var optimalScore = 0;

    for (var i = 0; i < histogram.length; ++i) {
        var diff = histogram[i][0];
        var score = histogram[i][1];

        if (score > optimalScore) {
            optimalScore = score;
            optimalDiffs = [diff];
        } else if (score === optimalScore) {
            optimalDiffs.push(diff);
        }
    }

    var chosenDiff = optimalDiffs[Math.floor(Math.random() * optimalDiffs.length)];
    return enemy_pos + chosenDiff;
};

/* Never reload */
play.reloading = false;

/* Run around like a mad man */
var my_pos = yourMovement[yourMovement.length-1];
var rand_sign = 2*Math.floor(2*Math.random())-1;

/* Never run into walls */
if (my_pos <= my_speed+1) {
    rand_sign = 1;
} else if (my_pos >= 24 - my_speed - 1) {
    rand_sign = -1;
}

if (yourMovement.length === 1) { /* Leap out of the way on first move */
    play.move = yourMovement[yourMovement.length-1] + rand_sign*my_speed;
} else {
    play.move = yourMovement[yourMovement.length-1] + rand_sign*((my_speed-1)*Math.floor(2*Math.random()) + 1);
}

/* Shoot all bullets by the end of the game */
var random_shot = (Math.random() > 0.15) ? true : false;

if (enemyMovement[enemyMovement.length-1] === enemyMovement[enemyMovement.length-2]) {
    /* Enemy is standing still; now is our time to STRIKE! */
    play.shots = [ enemyMovement[enemyMovement.length-1] ];
} else if (enemyMovement.length >= 2 && random_shot) {
    /* We take a random shot; best guess by enemies movement */
    var histogram = gatherStatistics(enemyMovement);
    play.shots = [ calcOptimalTarget(enemyMovement, histogram) ];
} else {
    /* No default shooting */
    play.shots = [];
}

return play;

敵が止まらない場合、狙撃兵は撃たれませんか?:D
バジュラ

3

ウィーバー

殺すことよりも生き続けることに関心があり、彼は前後に織り、毎回距離を広げます。射撃する敵の証明された範囲内でランダムなスポットを選びます。

var bot = {
    name: "TheWeaver",
    numbOfBullets: 4, // 3 points
    reloadSpeed: 4, // 0 points
    shotsPerTurn: 1, // 0 points
    moveSpeed: 5 // 12 points
}
return bot;

var play = {};
var moveSpeed = 2;

//Guess the enemies speed
var enSpeed = 1; 
var prev = 12;
for(var move in enemyMovement){
    if(Math.abs(move - prev) > enSpeed){
        enSpeed = Math.abs(move - prev);
    }
    prev = move;
}

//Randomly shoot in his range
var enemyPos = 12;
if(enemyMovement.length > 0){
    enemyPos = enemyMovement[enemyMovement.length - 1];
}
var shots = [];

//Shoot somewhere in his range
var distance = Math.random()*enSpeed;
var direction = 1;
if(Math.random() < 0.5){ direction = -1;}
if(enemyPos + enSpeed > 24){ direction = -1;}
if(enemyPos - enSpeed <= 0){ direction = 1;}
shots.push(enemyPos + distance*direction);





var move = 12;

//Start with a dash
if(yourMovement.length == 0){
    move = 12 + moveSpeed - 1;
}
//Quick switch
else if(yourMovement.length == 1){
    move = 11
}
//Wave baby, weave
else{
    var lastPos = yourMovement[yourMovement.length - 1];
    var lastMove = yourMovement[yourMovement.length - 1] - yourMovement[yourMovement.length - 2];
    var distance = Math.abs(lastMove + 1);
    if(distance > moveSpeed) { distance = 0;}
    var direction = lastMove/Math.abs(lastMove)*(-1);
    move = lastPos + distance*direction;
}


//Correct move
if(move > 24){
    move = 24;
}
if(move < 1){
    move = 1;
}

play.move = move;
play.reload = false;
play.shots = shots;



return play;

move = 12 + moveSpeed - 1;と同等move = 11 + moveSpeed;ですか?良いボットのようなそうでない場合は、このルックス;)
拍手

@ConfusedMr_Cはい、同じです。読みやすさのために最初のものを選んだと思いますが、開始点から最大moveSpeedよりも1つ少ない動きであることがより明確になります。また、マップのサイズが変更された場合、それは簡単に15で全12を交換することができますか何か
カイン

2
ああ、大丈夫。私たちはみなここにいるプログラマーなので、誰もそれについて言及していなかったことに驚きました。P
15年

3

アレクサンダー・ハミルトン

彼が最初のラウンドで勝てなければ、おそらく死ぬでしょう

var bot = {
    name: "Hamilton",
    numbOfBullets: 7, // 6 pts
    reloadSpeed: 4, // 0 pts
    shotsPerTurn: 4, // 9 pts
    moveSpeed: 1 // 0pts
}
return bot

var shots = []
var move = yourMovement[yourMovement.length - 1] + 1
var play = []
play.shots = [12,11,10,13,14,9,15,8,16,7,17,6,18]
play.move = move
play.reload = false
return play

3

アーロン・バー

var bot = {
    name: "Burr",
    numbOfBullets: 7, // 6 pts
    reloadSpeed: 4, // 0 pts
    shotsPerTurn: 3, // 6 pts
    moveSpeed: 2 // 3pts
}
return bot  

var shots = []
var move = yourMovement[yourMovement.length - 1]
// Dodging dance
switch (yourMovement.length % 4) {
  case 1:
    move += 2
    break;
  case 2:
    move -= 1
    break;
  case 3:
    move -= 2
    break;
  case 0:
    move += 1
    break;
}
var play = []
var elast = enemyMovement[enemyMovement.length - 1]
play.shots = [elast + 1, elast -1, elast]
play.move = move
play.reload = false
return play

3
var bot = {
    name: "Winger",
    numbOfBullets: 7, // 6 points
    reloadSpeed: 4, // 0 points
    shotsPerTurn: 3, // 6 points
    moveSpeed: 2 // 3 points
}
return bot;
var play = {};
var moveSpeed = 2;

//Guess the enemies speed
var enSpeed = 5; // Assume they are fast on the first turn
var prev = 12;
for(var move in enemyMovement){
    if(Math.abs(move - prev) > enSpeed){
        enSpeed = Math.abs(move - prev);
    }
    prev = move;
}


var move = 12;
if(Math.random() < 0.5){ moveSpeed = 1; }
//Move against the enemies shots
if(yourMovement.length == 0 || enemyShots.length == 0){
    move = 12 + moveSpeed;
}
else if(enemyShots.length == 1){
    if(enemyShots[0] <= 12){
        move = yourMovement[yourMovement.length - 1] - moveSpeed;
    }
    else{
        move = yourMovement[yourMovement.length - 1] + moveSpeed;
    }
}
else{
    var dir = enemyShots[enemyShots.length - 1][0] - yourMovement[yourMovement.length - 1];
    if(dir > 0){
        move = yourMovement[yourMovement.length - 1] + moveSpeed;
    }
    else{
        move = yourMovement[yourMovement.length - 1] - moveSpeed;
    }
}

//reload?
var reload = false;
if(bulletsLeft < 3){
    reload=true;
}

var enemyPos = 12;
if(enemyMovement.length > 0){
    enemyPos = enemyMovement[enemyMovement.length - 1];
}
var shots = [];
if(reload == false){
    //Shoot a spread around the opponent
    shots.push(enemyPos);
    if(enemyPos + enSpeed <= 24){ shots.push(enemyPos + enSpeed);}
    if(enemyPos - enSpeed > 0){ shots.push(enemyPos - enSpeed);}

}

//Correct move
if(move > 24){
    move = 24;
}
if(move < 1){
    move = 1;
}
if(reload && (yourMovement[yourMovement.length - 1] - yourMovement[yourMovement.length - 2]) != 0){
    move = yourMovement[yourMovement.length - 1];
}

play.move = move;
play.reload = reload;
play.shots = shots;



return play;

ウィンガーは、敵の範囲を制限するスプレッドを発射します。彼はまた敵のショットに向かって走ります。

ここに置いてリセットをプッシュします。


2

SMG

彼の銃は彼のカバーです。残念ながら、それは彼の見解を妨げるようです。彼はまた、静止状態を利用してリロードを高速化し、追加のショットを得るのにも優れています。

var bot = {
    name: "SMG",
    numbOfBullets: 12, //11pt
    reloadSpeed: 2,    //4pt
    shotsPerTurn: 1,   //0pt
    moveSpeed: 1       //0pt
}
return bot
var shots = [];
shots.push(Math.floor((Math.random() * 24) + 1));
shots.push(Math.floor((Math.random() * 24) + 1));
var play = [];
if (bulletsLeft < 1) {
play.reload = true;
play.shots = [];
}
play.shots = shots;
play.move = Math.floor((Math.random() * 24) + 1);
play.reload = false;
return play;

2
var bot = {
    name: "Random Evader",
    numbOfBullets: 7,
    reloadSpeed: 4, 
    shotsPerTurn: 1,
    moveSpeed: 4 
}
return bot
var getSpeed=function(Moves){
    var m = 0;
    for(var i=1;i<Moves.length;i++){
        var d = Math.abs(Moves[i]-Moves[i-1]);
        m = m>d?m:d;
    }
    return m;
}
var validMove=function(moves,speed){
    speed = speed||getSpeed(moves);
    var m;
    do{
        m=moves[moves.length-1]+Math.floor(Math.random()*(speed*2+1)-speed);
    }while(m>25 && m<0);
    return m;
}
var shots = [];
shots.push(validMove(enemyMovement));
var move = validMove(yourMovement,4);
return {
    shots:shots,
    move:move,
    reload:false
};

これは決してリロードされないため、リロード速度にポイントを無駄にせず、代わりに弾丸を追加購入する方が良いでしょう。
QuadrExAtt

@QuadrExAtt:ショットがなくなると、リロードが自動的に行われます。
メガトム

2
var bot = {
    name: "Gun and run",
    numbOfBullets: 4,   /* 3 points */
    reloadSpeed: 4,     /* 0 points */
    shotsPerTurn: 3,    /* 6 points */
    moveSpeed: 3        /* 6 points */
};
return bot;
var play = {};
play.reload = false;
if (yourShots.length === 1) { /* Opening move */
    if (Math.random() < 0.5) {
        play.shots = [13,14,15,16];
    } else {
        play.shots = [8,9,10,11];
    }
    play.move = 12;
} else { /* YOLO */
    play.shots = [];
    switch (yourMovement[yourMovement.length - 1]) {
        case 12:
            play.move = 15; 
            break;
        case 15:
            play.move = 18;
            break;
        case 18:
            play.move = 15;
            break;
    }
}
return play;

1
その「yourShots」ではない、私のmyShots、今私はそれについて考える「myShots」はもっと良かったはず笑、オハイオ州および移動イマイチ配列の1つだけの数ねえ
Vajura

1

ディエポブス

var bot = {
    name: 'Deiphobus',
    numbOfBullets: 5,
    reloadSpeed: 3,
    shotsPerTurn: 4,
    moveSpeed: 1
};
return bot

var getSorted = function(list)
{
    var modifiedList = [0,0,0,0,0,0,0,0,0,0,0,0,0];
    modifiedList[0] = list[6];
    modifiedList[1] = list[7];
    modifiedList[2] = list[5];
    modifiedList[3] = list[8];
    modifiedList[4] = list[4];
    modifiedList[5] = list[9];
    modifiedList[6] = list[3];
    modifiedList[7] = list[10];
    modifiedList[8] = list[2];
    modifiedList[9] = list[11];
    modifiedList[10] = list[1];
    modifiedList[11] = list[12];
    modifiedList[12] = list[0];

    var messedUpOrder = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];
    for(var order = 0; order < 13; order++) {
        var currBest = -2;

        for (var i = 0; i < 13; i++) {
            if ((messedUpOrder.indexOf(i) < 0) && (modifiedList[i] > modifiedList[currBest] || currBest<0)) {

                currBest = i;
            }
        }

        messedUpOrder[order] = currBest;
    }

    var toRet = [0,0,0,0,0,0,0,0,0,0,0,0,0];
    toRet[6] = messedUpOrder[0];
    toRet[7] = messedUpOrder[1];
    toRet[5] = messedUpOrder[2];
    toRet[8] = messedUpOrder[3];
    toRet[4] = messedUpOrder[4];
    toRet[9] = messedUpOrder[5];
    toRet[3] = messedUpOrder[6];
    toRet[10] = messedUpOrder[7];
    toRet[2] = messedUpOrder[8];
    toRet[11] = messedUpOrder[9];
    toRet[1] = messedUpOrder[10];
    toRet[12] = messedUpOrder[11];
    toRet[0] = messedUpOrder[12];

    return toRet;
};
var myPos;
if(yourMovement.length>0) {
   myPos  = yourMovement[yourMovement.length - 1];
}
else{
    myPos = 12;
}
var EnemyPos;
var play = {
    shots: [
    ],
    reload: true,
    move: 12
};
if(enemyMovement.length>0) {
    EnemyPos = enemyMovement[enemyMovement.length - 1];
}
else
{
    EnemyPos = 12;
}
if(bulletsLeft<4)
{
    play.reload = true;
}
else
{
    play.reload = false;
    var enemyChanges = [0,0,0,0,0,0,0,0,0,0,0,0,0];
    for(var i = 0; i<enemyMovement.length; i++)
    {
        var enemyChange;
        if(i == 0)
        {
            enemyChange = enemyMovement[i] - 12;
        }
        else
        {
            enemyChange = enemyMovement[i] - enemyMovement[i-1];
        }

        enemyChanges[enemyChange+6] = enemyChanges[enemyChange+6]+1;
    }

    var orderedEnemyChanges = getSorted(enemyChanges);
    var CurrentShot = 0;
    play.shots = [12,12,12,12];
    for(var i = 0; i<orderedEnemyChanges.length && CurrentShot<4; i++)
    {
        var pos = orderedEnemyChanges[i] + EnemyPos - 6;
        if(pos<24 && pos>0)
        {
            play.shots[CurrentShot] = pos;
            CurrentShot ++;
        }
    }
}
if(myPos == 1)
{
    play.move = 2;
}
else if (myPos == 23)
{
    play.move = 22;
}
else
{
    play.move = myPos + (Math.floor((Math.random() * 3)) %3) - 1;
}
return play;

ディエフォブスは、敵がいると思われるところならどこでも容赦なく弾丸を発射しますが、少し遅いです。


1

ASCIIGunInTheWest

1ターンに2発発射し、敵の移動速度に基づいて敵がどこに行くことができるかを推測します。エラーがある場合はご容赦ください。JavaScriptをあまりコーディングしていません。

var bot = {
    name: "ASCIIGunInTheWest",
    numbOfBullets: 4,
    reloadSpeed: 1,
    shotsPerTurn: 2,
    moveSpeed: 2
}
return bot

function main(bulletsLeft, yourShots, enemyShots, yourMovement, enemyMovement) {
    var randnum = function (min, max) { return Math.floor( Math.random() * (max - min + 1) ) + min }
    var getDiff = function (num1, num2) { return Math.abs( (num1 > num2) ? num1-num2 : num2-num1 ) }
    var shots = []
    var enemyMaxMovement = 0
    for (index = 0 index < enemyMovement.length ++index) {
    var moveDiff = getDiff(enemyMovement[index], enemyMovement[index - 1])
        if (index != 0 && moveDiff > enemyMaxMovement) {
           enemyMaxMovement = moveDiff
        }
    }
    var enemyCurrentPosition = enemyMovement[enemyMovement.length - 1]
    var enemyMinMoveRange = enemyCurrentPosition - enemyMaxMovement
    var enemyMaxMoveRange = enemyCurrentPosition + enemyMaxMovement
    shots.push( randnum(enemyMinMoveRange, enemyMaxMoveRange) )
    shots.push( randnum(enemyMinMoveRange, enemyMaxMoveRange) )
    var move = yourMovement[yourMovement.length - 1] + randnum(-2, 2)
    var play = []
    play.shots = shots
    play.move = move
    play.reload = false
    return play
}

編集:どうやら私のボット(ちょうど私のもの)はJSFiddleで使用することはできません。これがなぜだれか知っていますか?私はすべてのポイントをガンマンに使用しているので、失格したとは思わない。


これはおそらく3年前よりもずっと便利だったでしょうが、KotHトーナメントランナーのリファクタリングでは、理由を知っていると思います。ええ、実装の詳細)。
eaglgenes101

また、forループは奇妙な形をしています。6行目にはセミコロンが含まれているはずです。
eaglgenes101
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.