Самое быстрое орудие Запада, вызов короля горы

22

Это испытание «Король горы» в круговой игре. Это битва, чтобы найти лучшего боевика на западе!

Чтобы участвовать в этом конкурсе, вам нужно выполнить две функции. Первый устанавливает атрибуты вашего стрелка, а второй - это основная логическая функция для стрелка.

Функция атрибута

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 стоит 3 очка, поэтому вы можете получить максимум 6 выстрелов за раунд при потраченных 15 очках. Повышение этого атрибута выше numbOfBulletsконтрпродуктивно, так как вы не можете стрелять больше, чем ваш пистолет.

  • moveSpeed - определяет, сколько пробелов ваш стрелок может пробежать за один ход.

    Базовое и минимальное значение равно 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 очко, если они оба умрут в одном ходу, или 0 очков, если они достигнут предела в 66 ходов. Стрельбище имеет ширину 24 места (1-24 включительно). Чтобы ударить игрока и выиграть раунд, вам нужно стрелять в то же пространство, на котором он сейчас стоит.

Вот пошаговое руководство о том, как работает дуэль. Это также охватывает все недопустимые команды и специальные правила:

  • В начале каждого поединка оба игрока помещаются в пространство 12, и их револьверы полностью загружены.
  • Вызывается основная функция, и боевик делает команду первого хода и выбирает, куда он хочет стрелять.
  • Сначала боевики переезжают на новое место. Если какой-либо неверный ввод был сделан по команде перемещения (позиции ниже 1 или выше 24 или они переместились на большее расстояние, чем им разрешено), они остаются на той же позиции.
  • Следующая перезагрузка проверяется, если у вас кончились патроны на предыдущем ходу или вы вызвали перезарядку, ваш стрелок входит в цикл перезарядки. Он перезагружается столько раз, сколько вы устанавливаете свою reloadSpeedценность. Если вы решили стоять на месте (возвращая то же число пробелов, что и на прежнем месте, либо просто возвращая недопустимое значение), то счетчик перезагрузки уменьшается на 2 оборота вместо одного.
  • Теперь приходит проверка ваших значений выстрела, каждый ход вы можете ввести столько мест для выстрела, сколько вам нужно, они всегда будут обрезаны до фактического действительного количества, которое определяется: количеством выстрелов за ход и количеством пуль в вашем револьвере ( что ниже). Ваша shotsPerTurnценность увеличивается на 1, если вы решите остановиться в этом ходу, поэтому вы можете сделать дополнительный выстрел, если решите стоять на месте. Если вы находитесь в цикле перезагрузки, у вас есть 0 выстрелов.
  • Теперь идет фактическая стрельба, есть 2 способа, которыми это может пойти вниз. Если оба боевика имеют одинаковую статистику скорости движения, то они оба стреляют одновременно и могут одновременно убивать друг друга. В случае, если у них разные характеристики скорости движения, бот с более высоким показателем скорости движения начинает стрелять первым, и если он убивает своего противника, он выигрывает в этом раунде. Если бандит может выстрелить одну или несколько пуль в один раунд, то он следует тем же правилам, что и выше, за исключением нескольких циклов в качестве примера: допустим, что у bot1 есть 3 пули и он быстрее, а у bot 2 2 пули, тогда он будет выглядеть следующим образом :

    Bot1 shoots, Bot2 shoots cycle 1
    Bot1 shoots, Bot2 shoots cycle 2
    Bot1 shoots              cycle 3
    

Это выглядело бы одинаково, если бы у них была одинаковая скорость движения, только если бы теперь Bot1 ударил Bot2 в том же цикле, Bot2 мог бы также ударить Bot1, и это было бы ничьей.

ПРАВИЛА

Сначала я копирую некоторые правила из записи Calvin's Hobbies, которые также применяются здесь.

При объявлении новой переменной JavaScript вы должны использовать ключевое слово var. Это связано с тем, что переменная, объявленная без var, становится глобальной, а не локальной, поэтому было бы легко случайно (или намеренно) связываться с контроллером или свободно общаться с другими игроками. Должно быть ясно, что вы не пытаетесь обмануть.

При объявлении функций лучше всего также использовать ключевое слово var, т. Е. Использовать var f = function(...) {...}вместо « function f(...) {...}.Я не совсем уверен, почему», но иногда кажется, что это имеет значение.

В вашем коде вы не можете ...

  • попытаться получить доступ или изменить контроллер или код другого игрока.
  • попытаться изменить что-либо встроенное в JavaScript.
  • делать веб-запросы.
  • делать иначе злые вещи.

Мои дополнительные правила:

  • Пользователи могут создавать столько боевиков, сколько они хотят, и изменять свои функции за любой период времени.
  • Я удалю любую запись из игры, которая либо занимает слишком много времени, либо пытается обмануть любым способом, который я считаю нужным
  • Имена атрибутов, которые должна возвращать ваша функция, должны быть такими же, как в примерах с той же структурой!

Ваш ответ должен быть в этом формате, первая функция - функция атрибута, а вторая - логическая функция. Обратите внимание, что я использовал восклицательный знак, потому что если вы просто создадите новые строки между блоками кода, то парсер не увидит два разных блока кода, поэтому вам придется использовать любой символ (просто используйте восклицательный знак) для их разделения:

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

А вот и контроллер: КОНТРОЛЛЕР ИГРЫ . Просто откройте ссылку и дождитесь загрузки ботов, затем выберите того, кого вы хотите в бою (вероятно, всех), и нажмите кнопку запуска.

В качестве ответа я также добавляю тестового робота, который также служит примером того, как должна выглядеть структура ответа. Как примечание, если вы допустите небольшую ошибку и отредактируете свой ответ, алгоритм stackexchanges может не сразу его забрать, и сайт, который использует контроллер, созданный stackexchange, не обновится (но будет позже или если вы внесете более значительные изменения, которые я предлагаю делать, просто добавить текст в конце). Вот сайт: кодовая ссылка

Vajura
источник
Кажется, я не могу заставить двух ботов сражаться друг с другом на данный момент - если я выбрал их обоих, нажатие кнопки start не дает никаких результатов, и я не уверен, что мой бот ошибается или контроллер занимает много времени
euanjt
Да, как я объяснил в конце моего вопроса, когда вы редактировали свой ответ, он еще не редактировал его в генераторе кода stackexchange, потому что он не заметил изменения, если вы добавите какой-то текст в конце вашего ответа, он должен работать
Ваджура
1
Я думаю (скрестив пальцы) Я исправил эти ошибки - просто трудно найти ошибки, если контроллер не говорит мне, что я не предоставил правильный вывод и просто молча ничего не делает
euanjt
8
Вы можете использовать <!---->для разделения кодовых блоков "невидимо" (без !).
KRyan
1
Нашел ошибку. Измените «play1 = maskedEval (Players [a] .code, params)» на «play1 = maskedEval (playingPlayers [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;

Пандар полагается на свою скорость, чтобы уйти от пуль, и использует врагов предыдущими движениями, чтобы угадать, куда они пойдут.

euanjt
источник
Приходится извиняться, в скоринге была ошибка, теперь все работает правильно. Мне было очень странно, что мой бот выиграл LOL
Vajura
О, и в вашем представлении была еще одна странная вещь: числа для вашей команды перемещения, где десятичные дроби, поэтому я добавил округление в контроллер
Vajura
Я действительно не знаю, почему он выводил десятичные дроби :-) Я постараюсь улучшить его завтра
euanjt
я удалил console.log, так как он
ломал
Да, извини, во всяком случае, я (наконец-то) заставил его работать (и бить твоего тестового бота) сейчас :)
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, поэтому он действительно сломал программу. Виноват!
Программа Fox
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)

Vajura
источник
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;
QuadrExAtt
источник
так, если враг никогда не стоит на месте, снайпер никогда не стреляет? : 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 ​​от начальной точки. Также облегчает замену всех 12 на 15, если размер карты меняется или что-то еще
Каин
2
Ох, ну ладно. Мы все здесь программисты, поэтому я был удивлен, что никто другой не упомянул об этом: P
хлоп
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
thefistopher
источник
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
thefistopher
источник
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;
Timtech
источник
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
};
MegaTom
источник
Так как это никогда не перезаряжается, было бы лучше, если бы вы не тратили очки на скорость перезарядки и вместо этого покупали больше пуль.
QuadrExAtt
@QuadrExAtt: Перезагрузка происходит автоматически, когда у вас заканчиваются снимки.
MegaTom
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;
QuadrExAtt
источник
1
Эй, это "yourShots", а не мои myShots, теперь, когда я думаю об этом, "myShots" было бы лучше, лол, ох, и двигаться не массив это просто одно число
Vajura
1

Diephobus

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;

Дифобус безжалостно стреляет пулями везде, где, по его мнению, может быть его враг, но он немного медлителен.

euanjt
источник
1

ASCIIGunInTheWest

Выпускает 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. Кто-нибудь знает, почему это? Я использую все свои очки для своего стрелка, поэтому я не думаю, что меня дисквалифицировали.

ASCIIThenANSI
источник
Это, вероятно, было бы намного более полезно 3 года назад, но при рефакторинге бегуна турнира KotH, я думаю, знаю почему: Вы объявили функцию main () в области, где главная функция уже была создана бегуном турнира ( ага, детали реализации).
eaglgenes101
Кроме того, ваш цикл for имеет странную форму. Шестая строка должна содержать точку с запятой.
eaglgenes101