Batının en hızlı silahı, tepe yarışmasının kralı


22

Bu, yuvarlak bir robinle tepenin kralı. Batının en iyi silahlı silahını bulmak için bir savaş!

Bu yarışmada rekabet edebilmek için iki işlev yapmanız gerekir. Birincisi, silahlı silahınızın özelliklerini belirler, ikincisi silahlı adam için ana mantık işlevidir.

Öznitelik işlevi

function () {

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

Attribute işlevi, bazı kurallara göre ayarlamanız gereken 5 değişken içerir (bunun dışında nameherhangi bir dize olabilir). Silahlı adamınıza toplamda 15 puan harcamalısınız - 15 puanın tümünü harcamamış silahlı adamlar uygun değildir. Niteliklerin çalışması:

  • numbOfBullets - Silahınızın kaç mermi alacağını tanımlar.

    İlk ve minimum değer numbOfBullets1'dir. Her ek mermi 1 puan harcar, maksimum 16 mermi harcanır ve 15 puan harcar.

  • reloadSpeed - mermi bittikten sonra silahlı adamın silahını kaç kez doldurması gerektiğini tanımlar.

    Taban ve maksimum değer, minimum 1 olan 4'tür. Bu özelliği 1 düşürmek 2 puan düşürür.

  • shotsPerTurn - Silahlı adamınızın bir defada kaç kez atış yapabileceğini tanımlar.

    Temel ve minimum değer 1'dir. Her bir artış 1 puan artar, bu sayede 15 puan harcayarak tur başına maksimum 6 atış yapabilirsiniz. Bu özelliği yukarı kaldırmak numbOfBullets, silahınızı tutabildiğinden daha fazla mermi atamadığınız için sayaç üretkendir.

  • moveSpeed - Silahlı adamınızın bir turda kaç boşluk kullanabileceğini tanımlar.

    Temel ve minimum değer 1'dir. Her 1 artışta 15 puan harcayarak maksimum 6 hız ile 3 puan artar. Silahlı adam, her dönüşünde maksimum veya maksimum hareket hızına kadar sola veya sağa koşabilir. Ayrıca ona bir bonus veren hala durabilir (bundan sonra daha fazlası için).

Yukarıdaki örnek fonksiyonda mermilerde 6 puan, yeniden doldurma hızında 6 puan ve hareket halinde 3 puan harcıyor.

Ana işlev

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

Parametreler:

  • bulletsLeft, silahında kalan mermi sayısı
  • yourShotsBu, silahlı adamın ateş ettiği tüm geçmiş konumlardan oluşan bir dizidir.

    Tur başına 1 mermi atabilecek bir silahlı adam için örnek:

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

    Tur başına 3 mermi atabilecek bir silahlı adam için örnek:

    [[12,13,14],[11,15,16],[9,14],...]
    
  • enemyShots - yukarıdakiyle aynı ama düşmanınız için

  • yourMovement - geçmiş tüm hareket konumlarınızdan oluşan bir dizi
  • enemyMovement, yukarıdaki gibi ama düşmanınız için

Dönmen gereken:

3 özelliğe sahip bir değişken döndürmeniz gerekiyor:

  • shots - silahlı adamın hangi alanda çekim yapacağını belirleyen bir sayı dizisi
  • move - silahlı adamın hangi alana taşınacağını belirleyen tek bir numara
  • reload - silahlı silahınızı yeniden yükleyebileceğiniz gerçek / yanlış değer

Düello

Yarışma, 1 sisteme karşı yuvarlak bir robin 1'i takip ediyor. Her silahlı adamın, diğer silahlı adamlara karşı 50 mermi vardır. Bir tur bir mermiye isabet edene veya 66 tur geçinceye kadar devam eder (her iki oyuncunun da atış yaptığı bir dönüş).

Topçu rakibini öldürerek 2 puan, aynı sırayla ölürlerse 1 puan, 66 puan limitine ulaşırsa 0 puan kazanabilir. Çekim alanı 24 boşluk genişliğindedir (1-24 dahil). Bir oyuncuya çarpmak ve bir raund kazanmak için, halihazırda üzerinde durduğu yerden aynı alanda çekim yapmanız gerekir.

İşte bir düello nasıl çalıştığını adım adım kılavuz. Bu, tüm geçersiz komutları ve özel kuralları da kapsar:

  • Her düello başında, her iki oyuncu da 12. boşluğa yerleştirilir ve tabancaları tamamen yüklenir
  • Ana fonksiyon denir ve silahlı adam ilk hareket komutunu verir ve nerede ateş etmek istediklerini seçer
  • İlk önce silahlı adamlar yeni yerlerine taşındı. Eğer hareket komutunda herhangi bir geçersiz giriş yapılırsa (1'den küçük veya 1'den yüksek pozisyonlar, 24'ten sonra veya daha fazla boşluk bıraktıkları zaman izin verilir) aynı pozisyonda kalırlar.
  • Bir sonraki dönüş, bir önceki dönüş sırasında mermileriniz bittiyse veya kendinizi yeniden yüklemeyi seçtiyseniz, silahşörünüz yeniden yükleme döngüsüne giriyorsa kontrol edilir. reloadSpeedDeğerinizi belirlediğiniz sayıda dönüş için yeniden yüklüyor . Hala durmaya karar verirseniz (önceden durduğunuzda veya sadece geçersiz bir değerle döndüğünüzde aynı boşluğa geri döndüğünüzde), yeniden yükleme sayacı bir yerine 2 tur düşecektir.
  • Şimdi, çekim değerlerinizi kontrol etmeye başlayın, istediğiniz her çekim konumuna girebildiğiniz her dönüş, daima aşağıdakiler tarafından belirlenen gerçek geçerli miktara kesilecektir: Dönüş başına çekim sayısı ve tabancadaki mermi sayısı ( Hangisi daha düşükse). Sizin shotsPerTurnhala bu dönüş durmak karar verirseniz hala ayakta karar verirseniz bir ekstra atış yapabilirsiniz değeri, 1 artırılır. Yeniden yükleme döngüsündeyseniz 0 çekiminiz olur.
  • Şimdi gerçek çekim geliyor, bunun aşağı inmesinin 2 yolu var. Her iki silahlı adamın da aynı hareket hızı statüsüne sahip olması durumunda, ikisi de aynı anda ateş eder ve her ikisi de aynı anda birbirini öldürebilir. Farklı hareket hızı istatistiklerine sahip olmaları durumunda, yüksek hareket hızı statüne sahip olan bot önce atış yapmaya başlar ve rakibini öldürürse bu turu kazanır. Eğer silahlı adam bir turda bir veya daha fazla mermi atabilirse, örnek olarak daha fazla devir haricinde yukarıdaki kurallara uymaktadır: Diyelim ki bot1 3 mermiye sahiptir ve daha hızlıdır ve bot 2 2 mermiye sahiptir. :

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

Bu, aynı hareket hızına sahip olsalardı, sadece aynı anda Bot1 Bot2'ye Bot2'yi vurursa, Bot2 aynı zamanda Bot1'e de varabilir ve bir kravat olurdu.

KURALLAR

İlk önce Calvin’in Hobbies’ın burada da geçerli olan girişinden bazı kuralları kopyalıyorum.

Yeni bir JavaScript değişkeni bildirirken, var anahtar sözcüğünü kullanmanız gerekir. Bunun sebebi var olmadan bildirilen bir değişkenin yerel olmaktan ziyade global hale gelmesidir, bu nedenle kontrol cihazına yanlışlıkla (veya bilerek) bulaşmak veya diğer oyuncularla serbestçe iletişim kurmak kolaydır. Hile yapmaya çalışmadığın açık olmalı.

İşlevleri bildirirken, var anahtar sözcüğünü de kullanmak en iyisidir, yani kullanmak var f = function(...) {...}yerine, function f(...) {...}.neden olduğundan tam olarak emin değilim, ancak bazen bir fark yaratıyor gibi görünüyor.

Kodunuzda olmayabilir ...

  • denetleyiciye veya diğer oynatıcının koduna erişme veya bunları değiştirme girişiminde bulunun.
  • JavaScript içine yerleşik bir şeyi değiştirmeye çalışın.
  • web sorguları yapabilir.
  • aksi takdirde kötü niyetli şeyler yapın.

Ek kurallarım:

  • Kullanıcılar istedikleri kadar silahlı adam yaratabilir ve istedikleri zaman işlevlerini değiştirebilirler.
  • Oyundan ya çok fazla zaman alan ya da uygun gördüğüm şekilde hile yapmaya çalışan girişleri kaldıracağım
  • İşlevinizin döndürmesi gereken özelliklerin adları, aynı yapıdaki örneklerde olduğu gibi aynı olmalıdır!

Cevabınız bu formatta olmalı, ilki işlev öznitelik işlevi, ikincisi mantık işlevi. Bir ünlem işareti kullandığımı fark et çünkü kod blokları arasında sadece yeni satırlar yaparsanız, ayrıştırıcı iki farklı kod bloğu görmez, bu nedenle bunları ayırmak için herhangi bir sembol kullanmanız gerekir (yalnızca bir ünlem işareti kullanın):

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

Ve işte denetleyici: OYUN KONTROLÖRÜ . Sadece bağlantıyı açın ve botların yüklenmesini bekleyin, daha sonra savaşta hangisini istediğinizi seçin (muhtemelen hepsi) ve başlat düğmesine basın.

Ayrıca, bir yarışmacıya cevabım verecek olan bir yarışmacı koydum, aynı zamanda cevabın yapısının nasıl olması gerektiğine dair bir örnek teşkil ediyor. Not olarak, küçük bir hata yaparsanız ve cevabınızı düzenlerseniz stackexchanges algoritması bunu hemen almayabilir ve denetleyicinin stackexchange tarafından oluşturulanları kullandığı site güncellenmez (ancak daha sonra veya önerdiğim daha büyük değişiklikler yaparsanız) yapıyorum, sadece sonuna biraz metin ekleyin). İşte site: codelink


Şu anda birbirleriyle kavga eden iki botu başarabilecek gibi görünmüyorum - eğer ikisini de seçtiysem, start basmak hiçbir şey yapmıyor gibi görünüyor ve bunun benim botumun yanlış olup olmadığından emin değilim. kontrolör uzun sürüyor
euanjt

Cevabınızı düzenlediğinizde sorumun sonunda açıkladığım gibi Evet, henüz stackexchange kod üretecinde düzenlemedi çünkü bir değişiklik olduğunu fark etmedi, cevabın sonuna biraz metin eklerseniz çalışması gerekir
Vajura

1
Sanırım (parmak çarpıştım) Bu hataları düzelttim - eğer kontrolör bana doğru çıktı sağlamadığımı söylemezse ve sadece sessizce hiçbir şey
yapmazsa

8
<!---->("Olmadan" !) kod bloklarını ayırmak için kullanabilirsiniz .
KRyan,

1
Hatayı buldum. "Play1 = maskedEval (oynatıcılar [a] .code, params)" değerini "play1 = maskedEval (playingPlayers [a] .code, params)" olarak değiştirin
play2

Yanıtlar:


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, mermilerden kurtulma hızına güvenir ve düşmanları nereye gideceklerini tahmin etmek için önceki hareketleri kullanır.


Apoligasyon yapmak zorundayım, skorlamada bir hata vardı, şimdi her şey düzgün çalışıyor.
Botumun

Oh ve gönderiminizde garip bir şey daha vardı, hareket komutunuzun sayıları, ondalık sayılar olduğu için, kontrol cihazına yuvarlama ekledim
Vajura


controller.log kaldırıldı çünkü denetleyiciyi kırdı
Vajura 14:15 '

Evet üzgünüm, her neyse (sonunda) çalışmasını
sağladım

5

Basit Bir Adam

Hiçbir şeyde mükemmel değil, fakat daha az gücüyle her şeyde oldukça iyidir.

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

Teşekkürler, sözdizimi vurgulama eklemek için @ProgramFOX, ancak bu program kırdı.
Marcus Blättermann

Bu tuhaf. Sözdizimi vurgulamayı eklemek yalnızca bir HTML yorumudir ve programı bozmamalıdır.
ProgramFOX

Bilmiyorum, ancak program artık kodumu yüklemedi, şimdi yine sorun değil.
Marcus Blättermann

Ahh, görüyorum, muhtemelen ayrıştırıcı HTML yorumunun biçimini anlamadı, bu yüzden programı gerçekten bozdu. Benim hatam!
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

Test botu, bu kontrol testi olarak eklendi. Biri bunu kaybederse utanmalısın :). Bot davranışı düzeltildi, kopya yanlış test botunu yapıştırdı (her zaman 12 alanında kaldı)


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;

Öyleyse, düşman hiç durmazsa, keskin nişancı asla ateş etmiyor mu? : D
Vajura

3

Dokumacı

Öldürmekten çok hayatta kalmakla daha fazla ilgileniyor, her seferinde mesafesini artırarak ileri geri dokuyor. Ateş ettiği kanıtlanmış menzili içinde rastgele bir nokta seçer.

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;eşittir move = 11 + moveSpeed;, hayır? Aksi takdirde bu iyi bir bot gibi görünüyor;)
alkış

@ConfusedMr_C Haha evet, aynısı, sanırım sadece okunabilirlik için birincisini seçtim, başlangıç ​​noktasından maksimum moveSpeed ​​değerinden daha az hareket ettiğini daha açık bir şekilde gösteriyor. Ayrıca, haritanın boyutu değişirse veya herhangi bir şey olursa, 12'nin tümünü 15 ile değiştirmeyi kolaylaştırır
Cain

2
Tamam. Burada hepimiz programcıyız, bu yüzden başka kimsenin bahsetmediğine şaşırdım: P
alkış

3

Alexander Hamilton

İlk rauntta kazanmazsa, muhtemelen ölecek

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

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

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, düşman menzilini sınırlayan bir forma ateş eder. Ayrıca düşman atışlarına doğru koşuyor.

Sıfırlamayı zorlamak için bunu burada bırakacağım.


2

SMG

Silahı onun kapağı. Ne yazık ki, onun görüşü engelliyor gibi görünüyor. Ayrıca daha hızlı yeniden yükleme ve fazladan çekimler yapmak için durmadan ayakta durmakta fayda var.

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

Bu asla yeniden yükleme olmadığından, yeniden yükleme hızında herhangi bir nokta boşa harcamamış ve bunun yerine daha fazla mermi satın alsanız daha iyi olur.
QuadrExAtt 16:15 te

@QuadrExAtt: Çekimleriniz bittiğinde, yeniden yükleme otomatiktir.
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
Hey, "senin MyShots" benim myShots değil, şimdi düşünüyorum ki "myShots" daha iyi bir lol olurdu, oh ve hareket bir dizi değil, sadece tek bir sayı
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, düşmanın olabileceğini düşündüğü her yere acımasızca ateş eden mermilere inanıyor, ama biraz yavaş.


1

ASCIIGunInTheWest

Bir tur 2 atış yapar ve ne kadar hızlı hareket ettiğine bağlı olarak düşmanın nereye gidebileceğini tahmin eder. Herhangi bir hata olursa beni affet, ben çok fazla JavaScript kodlamadım.

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: Görünüşe göre benim bot (sadece benim) JSFiddle'da kullanılamaz. Bunun neden olduğunu bilen var mı? Tüm puanlarımı silahlı adamım için kullanıyorum, bu yüzden diskalifiye edildiğimi sanmıyorum.


Bu muhtemelen 3 yıl önce çok daha faydalı olurdu, ama bir KotH turnuva koşucusunu yeniden düzenlemede, neden olduğunu biliyorum: Bir ana işlevinin zaten bir ana işlevin turnuva koşucusu tarafından yaratıldığı bir kapsamda ilan ettiniz. evet, uygulama detayları).
eaglgenes101

Ayrıca, senin forma senin garip şekilli. Altıncı çizginin içinde noktalı virgül olmalıdır.
eaglgenes101
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.