Bu zorluk esinlenerek @HelkaHomba 'ın mükemmel meydan Piksel Takım BattleBots - Kırmızı vs Blue . Bu meydan okuma muhtemelen bu sitede gördüğüm en iyisiydi. Hiç.
Mücadelem hala çok farklı, ama @HelkaHomba, ilham için krediyi hak ediyor.
genel bakış
Bu, tüm oyuncuların ekibinizde canlı olarak kazandığı takımın kazandığı tepenin kralı bir takım. Başka bir deyişle, son takım ayakta kazanır. Beraberlik yapılacaktır.
Bir tahtadasın. İlk turdaki pozisyonunuzu biliyorsunuz (kene 0). Ayrıca etrafınızdaki alanda kim olduğunu da biliyorsunuz:
Bu durumda, etrafınızdaki hiç kimseyle yalnız değilsiniz (ya da öyle düşünüyorsunuz). Çevreleyen öğeleri ilk ontick
işleyicide işleyicinize görebilirsiniz. API hakkında daha sonra.
Takımın
Takımınız kullanıcı kimliğiniz tarafından belirlenir. Bunu bulmak için profil resminizi tıklayın:
Ardından kullanıcı kimliğinizi adres çubuğunda bulun:
Tuhafsa, mavi takımdasın.
Eğer öyleyse, kırmızı takımdasın.
Çizilmiş daireler için açığız.
İsminiz
Botunuzun adı takımınızın ilk harfiyle ("r" veya "b") başlar. Regex ile eşleşmesi gerekir /^(r|b)[A-Za-z_-]$/
. Bunun dışında botunuzun ismini seçebilirsiniz. Lütfen önceden var olanı kullanmayın.
Başlangıç
Kırmızı oyuncular haritanın tepesine yakın bir yerde başlayacak ve mavi dibe yakın bir yerde başlayacak. İşlev environment
parametresindeki ilk tik (dönüş) konusunda size özel bilgi verilir ontick
. Saklamanı tavsiye ederim. Ayrıntılar için API'ye bakın.
Sıra sende
Dönüş sırası başlangıçta randomize edilir, ancak daha sonra aynı kalır.
İşlemleri çevir
Tur başına sadece bir işlem yapabilirsiniz.
Hareket
Taşımak istediğinizde
this.move(num)
, API’yı çağırırsınız .num
taşınmak istediğiniz hücre:Taşıyabileceğiniz sayıların göreceli konumları, genel sabitte saklanır
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
Bir duvara veya başka bir oyuncuya geçerseniz hiçbir şey olmaz.
Döndürme
Döndürmek için ara
this.rotate(num)
. Num, döndürmek istediğiniz yöndür:Dönme mutlaktır.
Öldürmek
Eğer başka bir oyuncu (başka bir takımdan) karşı karşıya olduğunuz hücredeyse,
this.kill()
onları arayabilir ve öldürebilirsiniz. Orada kimse yoksa veya ekibinizde varsa, bu hiçbir şey yapmaz. Örnek:Eğer dönerseniz
0
, yeşili öldürebilirsiniz. 1'e getirilirseniz maviyi öldürebilirsiniz. 2'ye getirilirseniz, portakalı öldürebilirsiniz. 3 yaşına getirilirseniz sarıyı öldürebilirsiniz.Bomba
Bombalama, etrafınızdaki 9 meydanda siz ve takım arkadaşları dahil tüm oyuncuları öldürür . Örnek:
Bunu neden yapmak istiyorsun? Kamikaze . Eğer takımınızda olmayan ve etrafınızdaki 9 hücrede daha fazla oyuncu varsa, o zaman takımınızda var, bombalamayı düşünebilirsiniz. (İlk önce yoldaşlarına haber vermeni öneririm!)
Bir mayın yerleştirin
Bu, ekibinizde olmayan diğerleri için bir ölüm meydanı yaratır. Bir mayın mayını yerleştirdiğinde, aynı zamanda hareket edersin, böylece üzerine basmazsın.
this.landMine(num)
Gitmek istediğiniz karenin num olduğu yere çağırabilirsiniz . Örnek:Sonra çağırır
this.landMine(4)
:"M" yi gördün mü? Bu bir mayın. Diğerleri onu görebilir ... şimdilik. Takımınızda olmayanlar bile, yerleştirildikleri sırada bir mayın görebilir. Ama bu kene bittikten sonra kimse göremiyor bile. Ancak bir düşman üzerine yürür gelmez patlar. Örnek:
Mavi mayın üzerinde hareket etti ve BOOM! Daha yeni öldürdün.
Aldığınız her 2 ölüm için (doğrudan öldürme veya kara mayınlarından), yerleştirilecek 1 ekstra mayın elde edersiniz. Ayrıca başlangıçta bir tane alırsınız.
kazmak
Kaztığınızda, etrafınızdaki merkezde 5x5 alanda mayınları ararsınız. Bu, mayını yerleştiren botun ekibini göstermiyor. (Ekibinizdeki bir kişi tarafından yerleştirilmiş bir kara mayını tarafından öldürülemeyeceğinizi unutmayın.) Örneğin, etrafınızdaki ızgara ise:
Sonra dönüş değeri
this.dig()
olacaktır:
[undefined,undefined,undefined,true,undefined,
undefined,undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,true,undefined,undefined,
true,undefined,undefined,undefined,undefined]
Dizi dizinleri sol üstten başlayarak, sağdan başlayarak aşağıya değil, kendiniz dahil değil:
Toplamda 23 vardır ve göreceli konumları global sabitte saklanır fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
Kazmanın aksine, önceki işaretlere konan mayınları ortaya çıkardığına dikkat edin aroundMe
.
İletişim
Biriyle konuşmak istediğinizde, arayın this.sendMessage(recipients, team, data)
. Veriler istediğiniz herhangi bir şey olabilir ve istediğiniz kişilere , hatta diğer takımlardaki oyunculara bile gönderebilirsiniz . Bu, kötü programlanmış botları kandırmak için kullanılabilir, ancak tüm oyuncular kimin mesaj yolladığını ve kimin takımda olduklarını görebilir.
Örnek:
"Redisbest" adlı bir botta bir şey gönder:
this.sendMessage("redisbest", undefined, "Hi!");
"Redisbest" ve "blueiscool" adlı bir botta bir şey gönder:
this.sendMessage(["redisbest", "blueiscool"], undefined, {hello: "there"});
Kırmızı takıma bir şey yolla
this.sendMessage(undefined, "red", {hello: "red"});
Herkese bir şey gönder
this.sendMessage(undefined, "*", {hello: "everyone"});
Tüm kırmızı takıma ve "blueiscool" isimli bir botuna bir şey gönder:
this.sendMessage("blueiscool", "red", {hello: "bots"});
API
Kodunuz , fonksiyona yapılan tek bir aramadan oluşmalıdır createBot
. Başka hiçbir şey. Basit kod:
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, from, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
(Bunu kopyalayıp yapıştırmakta özgürsünüz. Sadece ekibiniz için değiştirin.)
Yöntemler
ontick(environment)
Senin sıran geldiğinde aradı.
Promise
1 saniye veya daha kısa sürede çözen bir geri dönüş yapmalısınız yoksa yoksayılır. Bu performans nedenleriyle ve sekmenin askıda kalmamasının hoş bir yan etkisi var.this
(ontick'deyken)landMines
Kaç tane kara mayını kaldı? Ne kadar çok öldürürseniz, o kadar çok kara mayını alırsınız. Öldürdüğünüz her 2 bot için 1 mayın daha alırsınız. Ayrıca başlamak için 1 olsun.direction
Karşılaştığınız yön.storage
Depolama için çağrılar arasında devam ederse oonTick
veonMessage
. Başlangıçta boş bir nesne. Herhangi bir amaç için değiştirin, ancak doğru şekilde devam etmesini sağlamak için her zaman bir dizi veya nesne olduğundan emin olun.move(num)
Belirtilen konuma taşıyın. Geçersiz olursa hiçbir şey yapmaz. Ayrıntılar için yukarıya bakın.rotate(num)
Belirtilen konuma çevirin. Geçersiz olursa hiçbir şey yapmaz. Ayrıntılar için yukarıya bakın.kill()
Varsa ve takımda değilse, karşılaştığınız oyuncuyu öldürür. Ayrıntılar için yukarıya bakın.bomb()
Çevrenizdeki 9 meydandaki herkesi, kendiniz de dahil olmak üzere öldürür.landMine(num)
Bulunduğunuz yere bir mayın mayını yerleştirir ve ardından belirtilen konuma taşınır. Geçersizsenum
veya hiçbiri kalmadıysa hiçbir şey yapmaz . Ayrıntılar için yukarıya bakın.dig()
yeni! Çevrenizdeki 5x5 alandaki kara mayınları hakkında bir dizi bilgi döndürür. Ayrıntılar için yukarıya bakın.sendMessage(recipients, team, data)
recipients
tek bir bot (string), bir bot dizisi veyaundefined
/ olabilirnull
. Mesajı göndermek istediğin kişi o.team
mesajı göndermek istediğiniz takımın dizesidir."*"
Herkese bir mesaj göndermek için kullanın .data
JS işlevine geçirilebilecek bir şeydir. Alıcılara gönderilir. Bir nesne veya dizi ise, başvuruya göre iletilir , böylece siz ve alıcı (lar) bunları kaydedebilirstorage
ve nesnede yapılan herhangi bir değişiklik her iki botun kopyalarını da etkiler. Not olan alıcılar bu ya botlara listesinde, tam bot dize, belirtilen veya belirttiğiniz ekibinde bir bot, bu mesajı alırsınız.
environment
İlk kene
x
: Oyuncunun x pozisyonuy
: Oyuncunun y konumugridWidth
: Şebekenin genişliği (hücrelerde)gridHeight
: Şebekenin yüksekliği (hücrelerde)Tüm keneler
aroundMe
: Bir dizi oyuncu ve kara mayınları. Oyuncular benzeyen nesneler{name: "bot name", team: "bot team"}
ve kara mayınları{team: "team of bot who placed mine"}
. Dizinin indeksleri:Mevcut olanın dışındaki bir keneye yerleştirilmiş mayınların gösterilmeyeceğini unutmayın.
aroundMe
örnek:Diyelim ki bu ızgara (kırmızısınız):
Sizin
aroundMe
şu şekilde görünecektir:
[
{name: "bexamplebluebot", team: "blue"},
undefined,//sparse array, nothing in index 1
undefined,//there is technically a landmine here, but it wasn't placed this tick, so it is not shown
undefined,//nothing in 3
{name: "yexampleyellowbot", team: "yellow"},
{team: "red"},//this is a landmine, you can tell is not a bot because it has no name. mines have the team name of the player they were placed by. This mine was placed this tick, otherwise you couldn't see it
//nothing else after index 5, so the array's length is 5.
]
Dizinin indeksleri burada açıklanmıştır:
Botunuz bunu etkili bir şekilde görüyor:
onmessage(data, fromBot, fromTeam)
this
(mesajda iken)sendMessage(recipients, team, data)
Standart mesaj gönderme fonksiyonu.storage
Standart depolama
data
Gönderenden gönderilen veriler.fromPlayer
Mesajın gönderildiği oyuncu.fromTeam
Mesajın gönderildiği ekip.onkill()
this
(onkill'deyken)sendMessage(recipients, team, data)
Standart mesaj gönderme fonksiyonu.
Kullanışlı (sabit) global diziler:
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
Verileri taşıma işlevine aktarmak ve yorumlamak için kullanışlıdır aroundMe
. Yukarıyı görmek.
fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
İçin yararlı this.dig()
işlev ontick
işleyicisi.
Denemek!
Denetleyici performans nedenleriyle makinemden localhost'ta çalıştırılacak, ancak CodePen'i kullanabilirsiniz test etmek için .
Kodunuzu konsola yapıştırmanız gerektiğini ve Enter
çalıştır'ı tıklatmadan önce . İstediğiniz sayıda botu yapıştırabilirsiniz. "Test botları", test edebileceğiniz örneklerdir. Hepsini yenebilir ya da bağlayabilirseniz, en azından iyi bir botunuz var.
gönderimler
kurallar
Kurallar (denetleyici tarafından uygulanır)
- Senin ana
ontick
kodunuz 1 saniyeden uzun sürmemelidir. Sonsuza kadar mermi sürmesini istemiyoruz. Kodunuz> 1 saniye sürerse, durur. - Tur başına 1'den fazla işlem yapmaya kalkarsanız veya geçersiz bir işlem yaparsanız (ör.
this.move(-1)
Veya duvara taşınırsanız), dikkate alınmaz. - Yakında daha fazlası gelebilir ...
Kurallar (benim tarafımdan uygulanan, DQ ile sonuçlanabilir)
- Do not yazma küresel değişkenler ( okuma gayet ).
- Kodunuz Nodejs'de çalışmalıdır (denetleyicinin Nodejs'e taşınması durumunda), yani
JSON.parse(...)
iyidir, ancakalert()
değildir. - Herhangi bir şekilde
createBot
denetleyiciyi aramanıza veya müdahaleye izin verilmez . - Başka birinin kodunu izinsiz ve önemli değişiklikler olmadan kullanmayın. Boşluk yok.
- Lütfen boşluklar yok!
- Yakında daha fazlası gelebilir ...
Botlarım
İşte bazı botlar:
Bu bot rastgele bir eylem seçer. Evet, ağırlıklı rastgele ama yine de oldukça rastgele. Eğer Eğer öldürmek bu bot En az iyi bir bot var daha, (sonunda sayılmaz, kendisini öldürecek). Yayınla ve ne olduğunu görün!
Botlarımın "x" ile başlayan bir ismi ve "none" bir takımı var. Bu kodun bazılarını kullanabilirsiniz, ancak en azından bazı değişiklikler yapın. En azından bir sayıya ince ayar yapmaktan rahatsız olamazsanız, kazanamazsınız.
Gönderinizi biçimlendirme
Lütfen bu formatı kullanın:
# rmyamazingbot
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, fromTeam, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
Long, but cool explanation...
Özellik istekleri, hatalar, sorular vb.
Aşağıya yorum yapın! Lütfen bununla ilgili bir yorum olup olmadığını kontrol edin. Zaten bir tane varsa, onu oyla.
Takımınla konuşmak ister misin?
Sohbet odalarını kırmızı ve mavi için kullanın .
Dil
Şu anda, yalnızca JS ve JS'yi derleyen bir şey desteklenmektedir, ancak diğer dilleri Nodejs ile çalıştırmanın bir yolunu biliyorsanız, denetleyiciyi Nodejs'e taşımaktan mutlu olurum.
Final notları
Strateji fikirleri
Takımına yardım et! Başka bir bot yardımcı olmak ve birlikte çalışmak için tasarlanmış bir bot oluşturma. Bu strateji iyi çalıştı için Pixel Takımı BattleBots - Kırmızı vs Blue
Temsilciler
Kazanan takımda en yüksek oyu alan cevabı kabul edeceğim. Daha önceki cevapların daha fazla oy alma eğiliminde olduğunu, ancak zayıf yönlerinin bulunmasının ve istismar edilmesinin daha muhtemel olduğunu unutmayın.
Ayrıca, yakında cevap verirseniz, +100 ödülünü alabilirsiniz.