Найшвидший пістолет заходу, виклик короля пагорба


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 - справжнє / хибне значення, за допомогою якого ви можете змусити перезавантажувати свою зброю

Поєдинок

Змагання слідкують за системою круглої форми 1 проти 1. Кожен бойовик має 50 патронів проти кожного іншого зброяря. Раунд триває до тих пір, поки когось не вдарить куля або поки не пройде 66 оборотів (поворот - це коли обидва гравці вистрілили).

Навідник може заробити 2 очки, вбивши свого опонента, 1 бал, якщо вони обоє загинуть за один і той же поворот, або 0 балів, якщо вони досягнуть межі 66 оборотів. Ширина поля для зйомки - 24 простори (1-24 включно). Щоб вдарити гравця і виграти раунд, вам потрібно стріляти в тому ж просторі, на якому він зараз стоїть.

Ось покрокове керівництво про те, як працює поєдинок. Це стосується також усіх недійсних команд та спеціальних правил:

  • На початку кожного поєдинку обидва гравці ставлять на пробіл 12, а їх револьвери повністю завантажені
  • Викликається головна функція, і бойовик робить свою першу команду переміщення і вибирає, куди хоче стріляти
  • Спочатку бойовики переїжджають на своє нове місце. Якщо будь-який недійсний ввід зроблено в команді переміщення (позиції нижче 1 або вище 24 або вони перемістили більше пробілів, то їм також дозволено) вони залишаються в тому ж самому положенні.
  • Наступне перезавантаження перевіряється, якщо у попереднього ходу у вас закінчилися кулі або ви назвали перезавантаження, ваш бойовик переходить у цикл перезавантаження. Він перезаряджається стільки ж оборотів, скільки ви встановлюєте своє reloadSpeedзначення. Якщо ви вирішили стояти нерухомо (повертаючи те саме ціле пробіл, що і ви, коли стоїте перед або просто повертаєте недійсне значення), то лічильник перезарядження знижується на 2 витки замість одного.
  • Тепер приходить перевірка ваших значень для стрілянини, кожен виток ви можете вводити стільки місць зйомки, скільки вам подобається, вони завжди будуть відрізані до фактичної дійсної суми, яка визначається: Кількістю пострілів за оборот та кількістю куль у вашому револьвері ( що нижче). Ваша shotsPerTurnцінність збільшується на 1, якщо ви вирішите стояти на цьому рубежі, тому ви можете зробити додатковий знімок, якщо вирішите стояти на місці. Якщо ви перебуваєте в циклі перезавантаження, у вас є 0 пострілів.
  • Тепер іде фактична зйомка, є два способи, як це може знизитися. Якщо обоє збройовика мають однакову ходу швидкості, то вони обидва стріляють одночасно і можуть одночасно вбивати один одного. У випадку, якщо вони мають різний хід швидкості, статистика бота з вищим станом рухається швидкістю, починає стріляти першим, і якщо він вбиває опонента, він виграє цей раунд. Якщо бойовик може вистрілити одну або декілька куль в один раунд, то він дотримується тих же правил, що і вище, за винятком кількох циклів, як приклад: Скажімо, що 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(...) {...}замість цього, 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, не буде оновлений (але пізніше або якщо ви внесете більші зміни, які я пропоную робити, просто додайте текст наприкінці). Ось сайт: codelink


Я, здається, не в змозі змусити двох ботів битися один з одним на даний момент - якщо я обидва обидва обрані, натискання пуску, здається, нічого не робить, і я не впевнений, що це мій бот помиляється чи тривалий час
контролер

Так, як я пояснював наприкінці запитання, коли ви редагували свою відповідь, ще не редагували її ще в генераторі коду stackexchange, оскільки не помітили, що відбулися зміни, якщо ви додасте текст у кінці своєї відповіді, це має спрацювати
Ваджура

1
Я думаю (схрещеними пальцями) я виправив ці помилки - важко знайти помилки, якщо контролер не скаже мені, що я не
подав

8
Ви можете використовувати <!---->для розділення блоків коду "невидимо" (без цього !).
KRyan

1
Знайшли помилку. Змініть "play1 = maskedEval (гравці [a] .код, парами)" на "play1 = maskedEval (граєPlayers [a]. Код, парами)" - те саме для play2
QuadrExAtt

Відповіді:


6

Pandarus

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;

Пандарус покладається на свою швидкість, щоб вийти з кулі, і використовує вороги попередніх рухів, щоб здогадатися, куди вони йдуть.


Вибачтесь, у балах виникла помилка, зараз все працює правильно. Мені було дуже дивно, що мій бот вигравав лол
Ваджура

О, і у вашої подачі була ще одна дивна річ - цифри для вашої команди переміщення, де десяткові
знаки,

Я дійсно не знаю, чому він
виводив десятичні знаки

Я видалив 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 Так, це те саме, я думаю, що я просто вибрав перший для читабельності, дає зрозуміти, що він рухається на один менше, ніж максимальний хід. Швидкість від початкової точки. Також полегшує заміну всіх 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

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: Перезавантаження автоматично, коли у вас не вистачає знімків.
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;

1
Ей, його "ваші знімки", а не мої MyShots, тепер, коли я думаю про це, "myShots" було б краще lol, о, і перемістити isnt масив його просто єдине число
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

Стріляє з 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
}

EDIT: Очевидно, мій бот (тільки мій) не може бути використаний у JSFiddle. Хтось знає, чому це? Я використовую всі мої бали для свого збройовика, тому не думаю, що мене дискваліфікували.


Це, мабуть, було б набагато корисніше 3 роки тому, але, коли рефакторинг бігу турніру KotH, я думаю, знаю, чому: Ви оголосили головну () функцію в межах, коли головну функцію вже створив бігун турніру ( так, деталі реалізації).
eaglgenes101

Крім того, ваш для петлі має дивну форму. Шостий рядок повинен мати в ньому крапки з комою.
eaglgenes101
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.