Pistol tercepat di barat, raja tantangan bukit

22

Ini adalah tantangan King of the Hill dalam round robin. Ini pertempuran untuk menemukan penembak terbaik di barat!

Untuk dapat bersaing dalam kontes ini, Anda harus membuat dua fungsi. Yang pertama mengatur atribut penembak Anda dan yang kedua adalah fungsi logika utama untuk penembak.

Fungsi Atribut

function () {

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

Fungsi atribut mencakup 5 variabel yang perlu Anda atur sesuai dengan beberapa aturan (dengan pengecualian nameyang bisa berupa string apa saja). Anda harus menghabiskan total tepat 15 poin untuk pria bersenjata Anda - pria bersenjata yang tidak menghabiskan semua 15 poin tidak memenuhi syarat. Inilah cara kerja atribut:

  • numbOfBullets - Menentukan berapa banyak peluru yang dipegang pistol Anda.

    Nilai awal dan minimum numbOfBulletsadalah 1. Setiap peluru tambahan berharga 1 poin dengan maksimum 16 peluru dengan 15 poin dihabiskan.

  • reloadSpeed - Menentukan berapa banyak putaran penembak Anda perlu memuat kembali senjatanya setelah dia kehabisan peluru.

    Nilai dasar dan maksimum adalah 4 dengan minimum adalah 1. Mengurangi atribut ini dengan 1 biaya 2 poin.

  • shotsPerTurn - Menentukan berapa kali penembak Anda dapat menembak dalam satu putaran.

    Nilai dasar dan minimum adalah 1. Setiap peningkatan sebesar 1 biaya 3 poin sehingga Anda dapat memiliki maksimum 6 tembakan per putaran dengan 15 poin yang dihabiskan. Menaikkan atribut ini di atas numbOfBulletsadalah kontra produktif karena Anda tidak dapat menembakkan lebih banyak peluru maka pistol Anda dapat menahannya.

  • moveSpeed - Menentukan berapa banyak ruang penembak Anda dapat berjalan dalam satu putaran.

    Nilai dasar dan minimum adalah 1. Setiap kenaikan sebesar 1 biaya 3 poin dengan kecepatan maksimum 6 dengan 15 poin yang dihabiskan. Penembak dapat berlari ke kiri atau kanan setiap belokan hingga kecepatan maksimum gerakannya. Dia juga bisa diam yang memberinya bonus (lebih lanjut tentang ini nanti).

Contoh fungsi di atas memiliki 6 poin untuk peluru, 6 poin untuk kecepatan reload dan 3 poin untuk pergerakan.

Fungsi utama

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;
}

Parameter:

  • bulletsLeft, jumlah peluru tersisa di pistolmu
  • yourShots, ini adalah array array dari semua posisi masa lalu yang telah ditembakkan oleh penembak Anda.

    Contoh untuk penembak yang dapat menembak 1 peluru per putaran:

    [[12],[4],[22],...]  
    

    Contoh untuk penembak yang dapat menembak 3 peluru per putaran:

    [[12,13,14],[11,15,16],[9,14],...]
    
  • enemyShots - Sama seperti di atas tetapi untuk musuh Anda

  • yourMovement - Array semua posisi pergerakan masa lalu Anda
  • enemyMovement, sama seperti di atas tetapi untuk musuh Anda

Apa yang perlu Anda kembalikan:

Anda diharuskan untuk mengembalikan variabel yang memiliki 3 atribut:

  • shots - Array angka yang menentukan di mana ruang penembak Anda akan menembak
  • move - nomor tunggal yang menentukan ke ruang mana penembak Anda akan mencoba untuk pindah ke
  • reload - nilai benar / salah yang dapat digunakan untuk mengisi ulang penembak

Pertarungan

Kontes mengikuti sistem round robin 1 lawan 1. Setiap pria bersenjata memiliki 50 putaran melawan setiap pria bersenjata lainnya. Putaran berlangsung sampai seseorang terkena peluru atau sampai 66 putaran berlalu (giliran adalah ketika kedua pemain menembak).

Penembak dapat memperoleh 2 poin dengan membunuh lawan mereka, 1 poin jika mereka berdua mati di tikungan yang sama atau 0 poin jika mereka mencapai batas 66 putaran. Bidang pemotretan adalah 24 ruang lebar (termasuk 1-24). Untuk memukul pemain dan memenangkan ronde Anda harus menembak di ruang yang sama dengan saat ini ia berdiri.

Berikut ini adalah panduan langkah demi langkah tentang bagaimana duel bekerja. Ini juga mencakup semua perintah dan aturan khusus yang tidak valid:

  • Pada awal setiap duel, kedua pemain ditempatkan di ruang 12 dan revolvernya terisi penuh
  • Fungsi utama disebut dan penembak membuat perintah bergerak pertama mereka dan memilih di mana mereka ingin menembak
  • Pertama orang-orang bersenjata itu pindah ke lokasi baru mereka. Jika ada input yang tidak valid dibuat pada perintah pindah (posisi lebih rendah dari 1 atau lebih tinggi dari 24 atau mereka memindahkan lebih banyak ruang maka mereka diizinkan juga) mereka tetap di posisi yang sama.
  • Pemuatan ulang berikutnya diperiksa, jika Anda kehabisan peluru pada giliran sebelumnya atau Anda memanggil pemuatan ulang diri sendiri, pria bersenjata Anda masuk ke siklus pemuatan ulang. Dia memuat ulang sebanyak mungkin saat Anda menetapkan reloadSpeednilai Anda . Jika Anda memutuskan untuk diam (mengembalikan bilangan bulat ruang yang sama dengan tempat Anda berdiri sebelumnya atau hanya mengembalikan nilai yang tidak valid), Anda memuat ulang penghitung turun selama 2 putaran, bukan satu.
  • Sekarang saatnya memeriksa nilai pemotretan Anda, setiap belokan yang dapat Anda masukkan sebagai lokasi pemotretan sebanyak yang Anda suka, akan selalu terpotong ke jumlah valid yang sebenarnya yang ditentukan oleh: Jumlah tembakan per putaran dan jumlah peluru di revolver Anda ( mana yang lebih rendah). shotsPerTurnNilai Anda dinaikkan 1 jika Anda memutuskan untuk diam di tikungan ini, sehingga Anda dapat melakukan pukulan tambahan jika Anda memutuskan untuk diam. Jika Anda berada dalam siklus reload Anda memiliki 0 tembakan.
  • Sekarang tiba pengambilan gambar yang sebenarnya, ada 2 cara ini bisa turun. Jika kedua penembak memiliki stat movepeed yang sama maka mereka berdua menembak pada saat yang sama dan keduanya dapat saling membunuh pada saat yang sama. Jika mereka memiliki statistik kecepatan gerak yang berbeda, bot dengan status kecepatan gerak yang lebih tinggi mulai menembak terlebih dahulu dan jika dia membunuh lawannya, dia memenangkan putaran ini. Jika penembak dapat menembak satu atau lebih peluru dalam satu putaran maka ia mengikuti aturan yang sama seperti di atas kecuali dalam lebih banyak siklus sebagai contoh: Mari kita katakan bahwa bot1 memiliki 3 peluru dan lebih cepat dan bot 2 memiliki 2 peluru maka akan seperti ini :

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

Ini akan terlihat sama jika mereka memiliki kecepatan gerakan yang sama hanya bahwa jika sekarang Bot1 memukul Bot2 dalam siklus yang sama Bot2 juga bisa menekan Bot1 dan itu akan menjadi dasi.

ATURAN

Pertama saya menyalin beberapa aturan dari entri Hobi Calvin yang juga berlaku di sini.

Saat mendeklarasikan variabel JavaScript baru, Anda harus menggunakan kata kunci var. Ini karena variabel yang dideklarasikan tanpa var menjadi global daripada lokal, sehingga akan mudah untuk secara tidak sengaja (atau sengaja) mengacaukan pengontrol atau berkomunikasi secara bebas dengan pemain lain. Harus jelas bahwa Anda tidak mencoba menipu.

Ketika mendeklarasikan fungsi, yang terbaik adalah menggunakan kata kunci var juga, yaitu menggunakan var f = function(...) {...}daripada function f(...) {...}.saya tidak sepenuhnya yakin mengapa, tetapi kadang-kadang tampaknya membuat perbedaan.

Dalam kode Anda, Anda mungkin tidak ...

  • mencoba mengakses atau memodifikasi controller atau kode pemain lain.
  • mencoba mengubah apa pun yang ada di dalam JavaScript.
  • buat kueri web.
  • jika tidak lakukan hal-hal jahat.

Aturan tambahan saya:

  • Pengguna dapat membuat sebanyak mungkin penembak yang mereka inginkan dan mengubah fungsi mereka untuk jangka waktu tertentu
  • Saya akan menghapus entri apa pun dari game yang membutuhkan waktu terlalu banyak atau mencoba menipu dengan cara apa pun yang menurut saya cocok
  • Nama-nama atribut yang harus dikembalikan oleh fungsi Anda harus sama dengan pada contoh dengan struktur yang sama!

Jawaban Anda harus dalam format ini, fungsi pertama adalah fungsi atribut dan yang kedua adalah fungsi logika. Perhatikan bahwa saya menggunakan tanda seru karena jika Anda hanya membuat baris baru di antara blok kode parser tidak akan melihat dua blok kode yang berbeda sehingga Anda harus menggunakan simbol apa pun (cukup gunakan tanda seru) untuk memisahkannya:

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

Dan inilah pengontrolnya: GAME CONTROLLER . Cukup buka tautan dan tunggu bot dimuat, lalu pilih yang mana yang Anda inginkan dalam pertarungan (mungkin semua) dan tekan tombol mulai.

Saya juga memasukkan testbot sebagai jawaban saya yang akan bersaing, juga berfungsi sebagai contoh tentang bagaimana struktur jawaban seharusnya. Sebagai catatan, jika Anda membuat kesalahan kecil dan mengedit jawaban Anda, algoritma stackexchanges mungkin tidak langsung mengambilnya dan situs yang menggunakan pengontrol yang dihasilkan oleh stackexchange tidak diperbarui (tetapi akan nanti atau jika Anda membuat perubahan lebih besar yang saya sarankan lakukan, cukup tambahkan beberapa teks di akhir). Inilah situsnya: codelink

Vajura
sumber
Saya sepertinya tidak bisa membuat dua bot bertarung satu sama lain saat ini - jika saya memilih keduanya, menekan start sepertinya tidak melakukan apa-apa dan saya tidak yakin apakah itu salah bot saya atau controller membutuhkan waktu lama
euanjt
Ya seperti yang saya jelaskan di akhir pertanyaan saya ketika Anda mengedit jawaban Anda itu belum diedit di generator kode stackexchange karena itu tidak melihat bahwa ada perubahan, jika Anda menambahkan beberapa teks di akhir jawaban Anda itu harus bekerja
Vajura
1
Saya pikir (semoga saja) saya telah memperbaiki kesalahan-kesalahan itu - hanya sulit untuk menemukan kesalahan jika controller tidak memberi tahu saya bahwa saya tidak memberikan output yang benar dan hanya diam-diam tidak melakukan apa pun
euanjt
8
Anda dapat menggunakan <!---->untuk memisahkan kode kunci "tanpa terlihat" (tanpa !).
KRyan
1
Ditemukan kesalahan. Ubah "play1 = maskedEval (pemain [a] .code, params)" menjadi "play1 = maskedEval (playPlayers [a] .code, params)" - sama untuk play2
QuadrExAtt

Jawaban:

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;

Pandarus mengandalkan kecepatannya untuk keluar dari jalan peluru, dan menggunakan gerakan musuh sebelumnya untuk menebak ke mana mereka akan pergi.

euanjt
sumber
Harus meminta maaf, ada bug dalam penilaian sekarang semuanya berfungsi dengan benar. Sangat aneh bagi saya bahwa bot saya menang lol
Vajura
Oh dan kiriman Anda memiliki hal aneh lainnya, angka untuk perintah pemindahan Anda di mana desimal jadi saya menambahkan pembulatan ke controller
Vajura
Saya benar-benar tidak tahu mengapa itu menghasilkan desimal :-) Saya akan mencoba dan memperbaikinya besok
euanjt
saya menghapus console.log karena itu melanggar controller
Vajura
Ya maaf, toh saya sudah (akhirnya) membuatnya bekerja (dan mengalahkan bot pengujian Anda) sekarang :)
euanjt
5

Pria Sederhana

Tidak sempurna dalam segala hal, tetapi cukup baik dalam segala hal melalui kekuatan yang lebih rendah.

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
};
Marcus Blättermann
sumber
Terima kasih @ProgramFOX karena menambahkan penyorotan sintaks, tetapi ini merusak programnya.
Marcus Blättermann
Itu aneh. Menambahkan sorotan sintaks hanya berupa komentar HTML dan tidak boleh merusak program.
ProgramFOX
Tidak tahu, tetapi programnya tidak memuat kode saya lagi, sekarang tidak masalah lagi.
Marcus Blättermann
Ahh, saya mengerti, mungkin parser tidak mengerti format dengan komentar HTML, jadi itu memang merusak program. Salahku!
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

Bot pengujian, ini ditambahkan sebagai tes kontrol. Jika ada yang kalah, Anda harus malu :). Memperbaiki perilaku bot, salin menempel bot tes yang salah (selalu tetap di bidang 12)

Vajura
sumber
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
sumber
jadi jika musuh tidak pernah diam, penembak jitu tidak pernah menembak? : D
Vajura
3

Sang Penenun

Lebih peduli dengan tetap hidup daripada membunuh, dia menjalin bolak-balik, meningkatkan jarak setiap kali. Pilihan tempat acak dalam jangkauan musuh yang telah terbukti untuk menembak

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;
Kain
sumber
move = 12 + moveSpeed - 1;setara dengan move = 11 + moveSpeed;, bukan? Kalau tidak, ini terlihat seperti bot yang bagus;)
bertepuk tangan
@ ConfusedMr_C Haha ya, itu sama, saya kira saya baru saja memilih yang pertama untuk dibaca, membuatnya lebih jelas bahwa itu bergerak kurang dari maksimum moveSpeed ​​dari titik awal. Juga membuatnya lebih mudah untuk mengganti semua 12 dengan 15 jika ukuran peta berubah atau apa pun
Kain
2
Oh baiklah. Kita semua programmer di sini, jadi saya terkejut bahwa tidak ada orang lain yang menyebutkannya: P
clap
3

Alexander Hamilton

Jika dia tidak menang di babak pertama, mungkin akan mati

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
sang filsuf
sumber
3

Aaron Burr

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
sang filsuf
sumber
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;

Winger menembakkan sebaran yang membatasi jangkauan musuh. Dia juga agak berlari ke arah tembakan musuh.

Biarkan saja ini di sini untuk mendorong reset.

Kain
sumber
2

SMG

Senjatanya adalah sampulnya. Sayangnya, itu sepertinya menghalangi pandangannya. Dia juga pandai memanfaatkan posisi diam untuk memuat ulang lebih cepat dan mendapatkan tembakan tambahan.

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
sumber
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
sumber
Karena ini tidak pernah dimuat ulang, akan lebih baik jika Anda tidak membuang poin pada kecepatan muat ulang dan malah membeli lebih banyak peluru.
QuadrExAtt
@ QuadrExAtt: Reload otomatis ketika Anda kehabisan tembakan.
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
sumber
1
Hei "yourShots" -nya bukan myShots saya, sekarang saya berpikir tentang itu "myShots" akan lebih baik lol, oh dan pindah bukan array yang hanya satu nomor
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;

Diephobus percaya pada peluru tanpa ampun menembak di mana pun dia pikir musuhnya, tapi dia agak lambat.

euanjt
sumber
1

ASCIIGunInTheWest

Menembak 2 tembakan satu putaran, dan menebak ke mana musuh bisa pergi berdasarkan seberapa cepat dia bergerak. Maafkan saya jika ada kesalahan, saya belum banyak kode di 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: Rupanya bot saya (hanya milik saya) tidak dapat digunakan di JSFiddle. Adakah yang tahu mengapa ini terjadi? Saya menggunakan semua poin saya untuk penembak saya, jadi saya tidak berpikir saya telah didiskualifikasi.

ASCIIThenANSI
sumber
Ini mungkin akan jauh lebih berguna 3 tahun yang lalu, tetapi dalam refactoring pelari turnamen KotH, saya pikir tahu mengapa: Anda mendeklarasikan fungsi utama (), dalam lingkup di mana fungsi utama sudah dibuat oleh pelari turnamen ( ya, detail implementasi).
eaglgenes101
Juga, untuk loop Anda berbentuk aneh. Baris keenam harus memiliki titik koma di dalamnya.
eaglgenes101