Tepenin Takımı!


27

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ığı 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:

9x9 ızgaradaki tek bir kırmızı kare, beyaz hücrelerle çevrili.

Bu durumda, etrafınızdaki hiç kimseyle yalnız değilsiniz (ya da öyle düşünüyorsunuz). Çevreleyen öğeleri ilk ontickiş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:

Profil resmim

Ardından kullanıcı kimliğinizi adres çubuğunda bulun:

/ Users / ve / kullanıcı adınız arasında

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 environmentparametresindeki 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 . numtaşınmak istediğiniz hücre:

    0 sol üst, 1 üst orta, 2 üst sağ, 3 orta sağ, 4 orta sol, 5 alt sol, 6 alt orta ve 7 sağ alt.

    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:

    0 üst, 1 sağ, 2 aşağı ve 3 sol

    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:

    Yukarıdakiyle aynı sayılar, 0 hücre yeşil, 1 mavi, 2 turuncu ve 3 sarı

    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:

    Her hücrede "x" s olan 9x9 bir ızgara vardır.

    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:

    9x9 ızgaradaki tek bir kırmızı kare, beyaz hücrelerle çevrili.

    Sonra çağırır this.landMine(4):

    [9x9 ızgara, ortada kırmızı bir "M" ve ortada kırmızı bir hücre.

    "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:

    İki 9x9 ızgara, ilkinde ortada mavi bir hücre, ilkinde ortada kırmızı bir "M", ikincisinde ortasında kırmızı "x" ve aralarında bir ok.

    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ı. Promise1 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 o onTickve onMessage. 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çersizse numveya 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) recipientstek bir bot (string), bir bot dizisi veya undefined/ olabilir null. Mesajı göndermek istediğin kişi o. teammesajı göndermek istediğiniz takımın dizesidir. "*"Herkese bir mesaj göndermek için kullanın . dataJS 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ı kaydedebilir storageve 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 pozisyonu
  • y: Oyuncunun y konumu
  • gridWidth: Ş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:

    0 sol üst, 1 üst orta, 2 üst sağ, 3 orta sağ, 4 orta sol, 5 alt sol, 6 alt orta ve 7 sağ alt.

    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):

    Sol üstte açık mavi, sağ üstte gri "M", ortada kırmızı, sol ortada sarı ve sol altta kırmızı "M" bulunan 9x9 ızgara.

    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:

0 sol üst, 1 üst orta, 2 üst sağ, 3 orta sağ, 4 orta sol, 5 alt sol, 6 alt orta ve 7 sağ alt.

Botunuz bunu etkili bir şekilde görüyor:

Üst solda açık mavi kutu, içinde siyah bir sayı 0, sol kenarında sarı bir kutu içinde siyah bir sayı 4, üzerinde solda siyah bir 5 kırmızı renkte bir "M".

  • onmessage(data, fromBot, fromTeam)

    this (mesajda iken)

    • sendMessage(recipients, team, data) Standart mesaj gönderme fonksiyonu.
    • storage Standart depolama

    dataGönderenden gönderilen veriler. fromPlayerMesajın gönderildiği oyuncu. fromTeamMesajı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 ontickiş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, ancak alert()değildir.
  • Herhangi bir şekildecreateBot 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.


1
Yorumlar genişletilmiş tartışmalar için değildir; bu konuşma sohbete taşındı .
Dennis,

Birden fazla bot yapabilir miyim? (özür dilerim, konuşmanın taşındığını biliyorum, ben sadece bu yüzden evet chatbanned)
Matthew Roh

@SIGSEGV evet, ancak başkası tarafından yayınlanmalı . Bir bot gönderebilir ve bir başkasının kodunu ekibinizdeki birine verebilirsiniz, ancak iki kez gönderemezsiniz.
programcı5000

Konumlandırma hakkında, [0, 0] -dekslenmiş hücre nerede, sol üst hücre mi? Ayrıca, mesajlaşma işleminizi (sıra başına) tüketiyor mu? Teşekkürler.
Thrax

@Thrax evet ve hayır. Bir mesaja cevap bile verebilirsin.
programcı5000

Yanıtlar:


7

xscared (rekabet etmeyen)

createBot({
    ontick: function(environment) {
        var reverse = [0, 1, 2, 3, 4, 5, 6, 7].reverse();
        return new Promise((resolve, reject)=>{
            (this.aroundMe || []).forEach((item,idx)=>{
                this.move(reverse[idx]);
                return resolve();
            });
            this.move(~~(Math.random() * 8));
            return resolve();
        });
    },
    onmessage: function() {
    },
    team: "none",
    name: "xscared",
    onkill: function(){
    }
});

İnsanlardan çok korkuyor. Gördüğü ilk kişiden (veya mayından) uzaklaşır. Aksi takdirde, rastgele hareket eder. Bunun bir rekabet olmadığını, sadece bir örnek olduğuna dikkat edin. Onu yenmeye çalış!


6

yedekleme, mavi bot

Sohbette uyarıldığı gibi, hayatımda javascriptte hiçbir şey yazmadım, bu yüzden herhangi bir hata bulursanız, lütfen bana söyleyin! (Bana zaten yardımcı olduğu için @ programmer5000'e teşekkürler)
Bu botun konsepti, aynı takımdaki diğer botlarla iletişim kurması ve bulunduğu mayınların haritasıyla birlikte konumunu göndermesidir. En yakın mavi botu birleştirmeye çalışır (eğer biri [x, y] dizisi olarak verilen konum verilerini gönderirse) ve kırmızı lekelere yaklaşarak ya da seyir ederek (mümkün olduğunca arkaya) mayınlar için ileri.

createBot({
    team: 'blue',
    name: 'backup',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            //if (typeof this.x != "undefined") this.storage['position'] = [this.x, this.y];
            if (typeof environment.x != "undefined") this.storage['position'] = [environment.x, environment.y]; //Modified according to @WasteD
            if (typeof this.storage['map'] == "undefined") { //Create empty map
                var map = [[]];
                //for(i=0;i<this.gridHeight;i++) map[i]=[];
                for(i=0;i<environment.gridHeight;i++) map[i]=[]; //Modified according to @WasteD
                this.storage['map'] = map;
            }
            var blue = []
            var red = []
            var x = this.storage['position'][0];
            var y = this.storage['position'][1];
            var dx = [-1, 0, 1, -1, 0, 1, -1, 0, 1]
            var dy = [1, 1, 1, 0, 0, 0, -1, -1, -1]
            (this.aroundMe || []).forEach((item, idx) => { // Update map and list positions of surrounding blues and reds
                if (item && item.team == 'red' && typeof item.name != "undefined") red += idx;
                if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx[idx]][y+dy[idx]] = 'M';
                if (item && item.team == 'blue' && typeof item.name != "undefined") blue += idx;
            });
            this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']}); //Send to buddies my position and the map
            if (red.indexOf([1, 4, 6, 3][this.direction]) > -1) this.kill() ; //If red guy is in front of
            else if (red.indexOf([1,4,6,3]) > -1) this.rotate(red.indexOf([1,4,6,3])); //If red guy is next but not in front of
            else if (blue.indexOf(3) > -1){ //If blue buddy on the left
                if (blue.indexOf(4) > -1){ //If another one is on the right
                    if (blue.indexOf(1) > -1 && this.direction != 2) this.rotate(2); //...and a third one at the top
                    else var digging = this.dig();
                    }
                else if (this.direction != 1) this.rotate(1);
                else var digging = this.dig();
            }
            else if (blue.indexOf(1) > -1){
                if (blue.indexOf(6) > -1 && this.direction != 3) this.rotate(3);
                else if (this.direction != 2) this.rotate(2);
                else var digging = this.dig();
            }
            else if (blue.indexOf(4) > -1){
                if (this.direction != 3) this.rotate(3);
                else var digging = this.dig();
            }
            else if (blue.indexOf(6) > -1 && this.direction != 0) this.rotate(0);
            else if (blue.indexOf([0,2]) > -1){ //If no blue next to me but one in diagonal, move next
                this.move(1);
                this.storage['position'][1] = y+1; //Update position
            }
            else if (blue.indexOf([5,7]) > -1){
                this.move(6);
                this.storage['position'][1] = y-1;
            }
            else if (typeof this.storage['other_blue'] != "undefined"){ //Check if buddies said where they were, try to go near the closest one
                var dmin = 99999;
                var pos = []
                (this.storage['other_blue'] || {}).forEach((item, idx) => {
                    var d = Math.sqrt(Math.pow(item['position'][0]-x,2) + Math.pow(item['position'][1]-y,2));
                    if (d < dmin){
                        dmin = d;
                        pos = item['position'];
                        }
                });
                if (pos[0]-x > 0){
                    this.move(4);
                    this.storage['position'][0] = x+1
                }
                else if (pos[0] < 0){
                    this.move(3);
                    this.storage['position'][0] = x-1
                }
                else if (pos[1] > 0){
                    this.move(1);
                    this.storage['position'][1] = y+1
                }
                else{
                    this.move(6);
                    this.storage['position'][1] = y-1
                }
            }
            else var digging = this.dig();
            if (typeof digging != "undefined"){ //Check out surroundings if dig() was played and update the map accordingly
                var dx2 = [-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2];
                var dy2 = [2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2];
                (digging || []).forEach((item, idx) => {
                    //if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M';
                    if (item) this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M'; //previously misread what dig() returned
                });
            }
            resolve();
        });
    },
    onmessage: function(data, fromTeam, fromBot) {
        if (typeof data['position'] != "undefined" && fromTeam == 'blue') { //If position sent by a blue bot
            if (typeof this.storage['other_blue'] == "undefined") this.storage['other_blue'] = [];
            for (i in this.storage['other_blue']){
                var found = false;
                if ('name' in i){
                    if (i['name'] == fromBot){
                        i['position'] = data['position'];
                        found = true; //Update if position already known from previous ticks
                        }
                }
            }
            if (!found) this.storage['other_blue'] += {'position':data['position'], 'name':fromBot}; //Add position if previously unknown
            this.sendMessage(fromBot, undefined, "roger.");
        }
    },
    onkill: function() {this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']});}
});

Hey Eğer bunu da girsem de umursamıyorum ama (farklı adla) Ben de
Christopher

@Christopher Hayır, umrumda değil, ama en azından biraz farklı yaparsanız (en azından zaten mevcut olan 2 botu tamamlamak için) bu sizin ve takım için biraz daha ilginç olurdu.
plannapus

Bunu yapacak. Bunu değiştireceğim
Christopher

Ben kullandığınız çünkü codepen öyle değil çalışmalarında bot çalıştırmayı denerseniz this.xve benzeri ama öyle environment.xya yanlış?
Atık

@WasteD dediğim gibi Javascript'i hiç tanımıyorum, bu yüzden mümkün. Ama eğer öyleyse, sanırım öyle olmalı environment.gridHeightve environment.aroundMe? Bu durumda diğer botlar kullandıklarından sonra da çalışmamalıdır this.aroundMe.
plannapus

5

Mavi, mavi, dünyam mavi

createBot({
    team: 'blue',
    name: 'blue-blue-my-world-is-blue',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            var red = 0;
            // See who's around me
            (this.aroundMe || []).forEach((item, idx) => {
                if (item && item.team == 'red') red++;
            });
            // If surrounded, take one for the team
            if (red >= 6) this.bomb();
            else {
                // Translate direction into position
                var kill = [1, 4, 6, 3][this.direction];
                // Random values
                var move = Math.floor(Math.random() * 8);
                var nsew = Math.floor(Math.random() * 4);
                // Lay a landmine if possible
                if (this.landMines) this.landMine(move);
                // Kill if someone is in the way
                else if (this.aroundMe && this.aroundMe[kill] && this.aroundMe[kill].team == 'red' && this.aroundMe[kill].name) this.kill();
                else {
                    // Move somewhere if already in the requested direction
                    if (nsew == this.direction) this.move(move);
                    // Otherwise just rotate to the requested direction
                    else this.rotate(nsew);
                }
            }
            resolve();
        });
    },
    onmessage: function(data, from, fromBot) {},
    onkill: function() {}
});

Çoğunlukla rastlantısaldır, ancak çevreler halinde bombalanır ve etrafta dolaşmayı ve hareket etmeyi öldürmeyi tercih eder.


Akıllı! Güzel bir.
programcı5000

3
Dinleyin, işte mavi dünyada yaşayan küçük bir adam hakkında bir hikaye.
Matthew Roh

3

Rahat-Bombacı

Bu bot her iki tarafta en az 1 boş hücreli bir nokta arar ve daha sonra bir mayın eker. Bir düşman yaklaşana kadar üzerinde kamp kurar. Birisi yaklaştığında, diğer botu yemesi için madeni üzerinde ileri geri adım atar. Ayrıca gerekirse dönecek ve öldürecek. Hiç mayını kalmadıysa, sol üst köşesinde sığınacak, duvarları arkasına gelecek ve tehdit ederse misilleme yapacak.

selfAnahtar kelimesiyle ekibine pozisyonunu yayınlamaktan başka özel bir öğretmen yok .

createBot({
    team: 'red',
    name: 'relaxed-bomber',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            if (typeof this.storage['dropped'] == "undefined") {
                this.storage['dropped'] = false;
                this.storage['covered'] = false;
                this.storage['baited'] = false;
            }
            if (typeof environment.x != "undefined" && typeof environment.y != "undefined") {
                this.storage['pos'] = [environment.x, environment.y];
            }
            if (typeof environment.gridWidth != "undefined" && typeof environment.gridHeight != "undefined") {
                this.storage['grid'] = [environment.gridWidth, environment.gridHeight];
            }
            var x = this.storage['pos'][0];
            var y = this.storage['pos'][1];
            var x0 = this.storage['grid'][0];
            var y0 = this.storage['grid'][1];
            var source = [1, 4, 6, 3];
            var dest = [6, 3, 1, 4];
            var rot = [0, 1, 2, 3];
            var movex = [-1, 0, 1, -1, 1, -1, 0, 1];
            var movey = [-1, -1, -1, 0, 0, 1, 1, 1];
            var action = false;
            if (this.landMines > 0) { 
                var move = [false, false, false, false];
                var moveIndex = -1;
                if (x <= 0) { move[1] = true; }
                if (x >= x0 - 1) { move[3] = true; }
                if (y <= 0) { move[2] = true; }
                if (y >= y0 - 1) { move[0] = true; }    
                if (move[0] && !move[1] && !move[2] && move[3]) { moveIndex = 0; }
                if (move[0] && !move[1] && !move[2] && !move[3]) { moveIndex = 1; }
                if (move[0] && move[1] && !move[2] && !move[3]) { moveIndex = 2; }
                if (!move[0] && !move[1] && !move[2] && move[3]) { moveIndex = 3; }
                if (!move[0] && move[1] && !move[2] && !move[3]) { moveIndex = 4; }
                if (!move[0] && !move[1] && move[2] && move[3]) { moveIndex = 5; }
                if (!move[0] && !move[1] && move[2] && !move[3]) { moveIndex = 6; }
                if (!move[0] && move[1] && move[2] && !move[3]) { moveIndex = 7; }  
                if (moveIndex >= 0) {
                    this.storage['pos'] = [ x + movex[moveIndex], y + movey[moveIndex]];
                    this.move(moveIndex);
                } else {
                    this.storage['dropped'] = true;
                    this.storage['covered'] = false;
                    this.landMine(1);
                }
            } else {
                if (this.storage['dropped']) {
                    this.storage['dropped'] = false;
                    this.storage['covered'] = true;
                    this.storage['pos'] = [ x + movex[6], y + movey[6]];
                    this.move(6);
                } else if (this.storage['covered']) {
                    for (var i = 0; i < source.length; i++) {
                        if (typeof environment.aroundMe[source[i]] != "undefined" && typeof environment.aroundMe[source[i]].team != "undefined" && environment.aroundMe[source[i]].team == "blue" && typeof environment.aroundMe[source[i]].name != "undefined") {
                            this.storage['covered'] = false;
                            this.storage['baited'] = true;
                            this.storage['mine'] = this.storage['pos'].slice();
                            this.storage['reverse'] = source[dest[i]];
                            this.storage['pos'] = [ x + movex[dest[i]], y + movey[dest[i]]];
                            this.move(dest[i]);
                            action = true;
                        }
                    }
                    if (!action) {
                        this.dig();
                    }
                } else if (this.storage['baited']) {
                    for (var i = 0; i < source.length; i++) {
                        if (typeof environment.aroundMe[source[i]] != "undefined" && typeof environment.aroundMe[source[i]].team != "undefined" && environment.aroundMe[source[i]].team == "blue" && typeof environment.aroundMe[source[i]].name != "undefined") {
                            if (this.direction == rot[source[i]]) {
                                this.kill();
                                this.storage['baited'] = false;
                                action = true;
                            } else {
                                this.rotate(rot[source[i]]);
                                action = true;
                            }
                        }
                    }
                    if (!action) {
                        if (this.storage['mine'][0] == this.storage['pos'][0] && this.storage['mine'][1] == this.storage['pos'][1]) {
                            this.storage['pos'] = [ x + movex[this.storage['reverse']], y + movey[this.storage['reverse']]];
                            this.move(this.storage['reverse']);
                            this.storage['reverse'] = source[this.storage['reverse']];
                        } else {
                            this.storage['pos'] = [ x + movex[this.storage['reverse']], y + movey[this.storage['reverse']]];
                            this.move(this.storage['reverse']);
                            this.storage['reverse'] = dest[this.storage['reverse']];
                        }
                    }
                } else {
                    for (var i = 0; i < source.length; i++) {
                        if (typeof environment.aroundMe[source[i]] != "undefined" && typeof environment.aroundMe[source[i]].team != "undefined" && environment.aroundMe[source[i]].team == "blue" && typeof environment.aroundMe[source[i]].name != "undefined") {
                            if (this.direction == rot[source[i]]) {
                                this.kill();
                                this.storage['baited'] = false;
                                action = true;
                            } else {
                                this.rotate(rot[source[i]]);
                                action = true;
                            }
                        }
                    }
                    if (!action) {
                        if (x > 0 && y > 0) {
                            this.storage['pos'] = [ x + movex[0], y + movey[0]];
                            this.move(0);
                        } else if (x > 0 && y == 0) {
                            this.storage['pos'] = [ x + movex[3], y + movey[3]];
                            this.move(3);
                        } else if (x == 0 && y > 0) {
                            this.storage['pos'] = [ x + movex[1], y + movey[1]];
                            this.move(1);
                        } else {
                            this.rotate(1);
                        }
                    }
                }
            }
            this.sendMessage(undefined, "red", {'self': this.storage['pos'] });
            resolve();
        });
    },
    onmessage: function(data, fromTeam, fromBot) {},
    onkill: function() {}
});

Hangi takımdasın?
programcı5000

@ programmer5000 Botların isimlerinin takımın mektubu ile başlaması gerektiğinden, sanırım ben Kırmızı Takımım :) :)
Thrax

Güzel bot! Ben de etrafındakileri ekibine aktarmanı öneririm.
programcı5000

1

Başka bir mavi bot yedekle (daha önce bunu yapmayı unuttum)

createBot({
    team: 'blue',
    name: 'backup1',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            //if (typeof this.x != "undefined") this.storage['position'] = [this.x, this.y];
            if (typeof environment.x != "undefined") this.storage['position'] = [environment.x, environment.y]; //Modified according to @WasteD
            if (typeof this.storage['map'] == "undefined") { //Create empty map
                var map = [[]];
                //for(i=0;i<this.gridHeight;i++) map[i]=[];
                for(i=0;i<environment.gridHeight;i++) map[i]=[]; //Modified according to @WasteD
                this.storage['map'] = map;
            }
            var blue = []
            var red = []
            var x = this.storage['position'][0];
            var y = this.storage['position'][1];
            var dx = [-1, 0, 1, -1, 0, 1, -1, 0, 1]
            var dy = [1, 1, 1, 0, 0, 0, -1, -1, -1]
            (this.aroundMe || []).forEach((item, idx) => { // Update map and list positions of surrounding blues and reds
                if (item && item.team == 'red' && typeof item.name != "undefined") red += idx;
                if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx[idx]][y+dy[idx]] = 'M';
                if (item && item.team == 'blue' && typeof item.name != "undefined") blue += idx;
            });
            this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']}); //Send to buddies my position and the map
            if (red.indexOf([1, 4, 6, 3][this.direction]) > -1) this.kill() ; //If red guy is in front of
            else if (red.indexOf([1,4,6,3]) > -1) this.rotate(red.indexOf([1,4,6,3])); //If red guy is next but not in front of
            else if (blue.indexOf(3) > -1){ //If blue buddy on the left
                if (blue.indexOf(4) > -1){ //If another one is on the right
                    if (blue.indexOf(1) > -1 && this.direction != 2) this.rotate(2); //...and a third one at the top
                    else var digging = this.dig();
                    }
                else if (this.direction != 1) this.rotate(1);
                else var digging = this.dig();
            }
            else if (blue.indexOf(1) > -1){
                if (blue.indexOf(6) > -1 && this.direction != 3) this.rotate(3);
                else if (this.direction != 2) this.rotate(2);
                else var digging = this.dig();
            }
            else if (blue.indexOf(4) > -1){
                if (this.direction != 3) this.rotate(3);
                else var digging = this.dig();
            }
            else if (blue.indexOf(6) > -1 && this.direction != 0) this.rotate(0);
            else if (blue.indexOf([0,2]) > -1){ //If no blue next to me but one in diagonal, move next
                this.move(1);
                this.storage['position'][1] = y+1; //Update position
            }
            else if (blue.indexOf([5,7]) > -1){
                this.move(6);
                this.storage['position'][1] = y-1;
            }
            else if (typeof this.storage['other_blue'] != "undefined"){ //Check if buddies said where they were, try to go near the closest one
                var dmin = 99999;
                var pos = []
                (this.storage['other_blue'] || {}).forEach((item, idx) => {
                    var d = Math.sqrt(Math.pow(item['position'][0]-x,2) + Math.pow(item['position'][1]-y,2));
                    if (d < dmin){
                        dmin = d;
                        pos = item['position'];
                        }
                });
                if (pos[0]-x > 0){
                    this.move(4);
                    this.storage['position'][0] = x+1
                }
                else if (pos[0] < 0){
                    this.move(3);
                    this.storage['position'][0] = x-1
                }
                else if (pos[1] > 0){
                    this.move(1);
                    this.storage['position'][1] = y+1
                }
                else{
                    this.move(6);
                    this.storage['position'][1] = y-1
                }
            }
            else var digging = this.dig();
            if (typeof digging != "undefined"){ //Check out surroundings if dig() was played and update the map accordingly
                var dx2 = [-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2];
                var dy2 = [2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2];
                (digging || []).forEach((item, idx) => {
                    //if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M';
                    if (item) this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M'; //previously misread what dig() returned
                });
            }
            resolve();
        });
    },
    onmessage: function(data, fromTeam, fromBot) {
        if (typeof data['position'] != "undefined" && fromTeam == 'blue') { //If position sent by a blue bot
            if (typeof this.storage['other_blue'] == "undefined") this.storage['other_blue'] = [];
            for (i in this.storage['other_blue']){
                var found = false;
                if ('name' in i){
                    if (i['name'] == fromBot){
                        i['position'] = data['position'];
                        found = true; //Update if position already known from previous ticks
                        }
                }
            }
            if (!found) this.storage['other_blue'] += {'position':data['position'], 'name':fromBot}; //Add position if previously unknown
            this.sendMessage(fromBot, undefined, "roger.");
        }
    },
    onkill: function() {this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']});}
});

1

Mavi Avcı

createBot({
  team: "blue",
  name: "blue-fighter",
  ontick: function(environment) {
    return new Promise((resolve, reject)=>{
      let map = environment.aroundMe;
      let sides = [1, 4, 6, 3];
      let facing = sides[this.direction];
      let isTeam = (team,a) => a && a.team === team;
      let isRed = (a)=>isTeam("red",a);
      let isBlue = (a)=>isTeam("blue",a);
      let randomSquare = ()=>Math.floor(Math.random()*8);
      let redNum = map.filter(isRed).length;
      let blueNum =  map.filter(isBlue).length;
      if(redNum > blueNum && redNum > 2){
        this.bomb();
      }else if(isRed(map[facing])){
        this.kill();
      }else if(sides.includes(map.findIndex(isRed))){
        this.rotate(sides.indexOf(map.findIndex(isRed)));
      }else if(Math.random() < 0.5 && this.landMines > 0){
        this.landMine(randomSquare());
      }else{            
        this.move(randomSquare());
      }
      resolve();
    });
  },
  onmessage: function(data, from, fromBot) {},
  onkill: function(){}
});

Mavi savaşçı rastgele hareket eder ve kara mayınları kırmızı oyunculara doğru döner. Çevreleyen blokların maviden daha kırmızı olması durumunda bombalar. Kırmızı bir oyuncuya dönükse, onu öldürür.

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.