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 name
herhangi 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
numbOfBullets
1'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ıyourShots
Bu, 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çinyourMovement
- geçmiş tüm hareket konumlarınızdan oluşan bir dizienemyMovement
, 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ı dizisimove
- silahlı adamın hangi alana taşınacağını belirleyen tek bir numarareload
- 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.
reloadSpeed
Değ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
shotsPerTurn
hala 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
<!---->
("Olmadan" !
) kod bloklarını ayırmak için kullanabilirsiniz .