ทีมของฮิลล์!


27

ความท้าทายนี้ได้แรงบันดาลใจจาก@HelkaHombaของความท้าทายที่ยอดเยี่ยมสีแดงกับสีน้ำเงิน - Pixel ทีม BattleBots ความท้าทายนั้นน่าจะเป็นสิ่งที่ดีที่สุดที่ฉันเคยเห็นในเว็บไซต์นี้ เคย

ความท้าทายของฉันยังคงแตกต่างกันมาก แต่ @HelkaHomba สมควรได้รับเครดิตสำหรับแรงบันดาลใจ

ภาพรวม

นี่คือทีมที่ทีมของคุณชนะโดยให้ผู้เล่นทุกคนมีชีวิตอยู่ในทีมของคุณ กล่าวอีกนัยหนึ่งการยืนทีมสุดท้ายชนะ การจับจะถูกทำใหม่

คุณอยู่บนกระดาน คุณรู้ตำแหน่งของคุณในรอบแรก (ติ๊ก 0) คุณยังรู้ว่าใครอยู่ในพื้นที่รอบ ๆ คุณ:

สี่เหลี่ยมสีแดงเดี่ยวในตาราง 9x9 ล้อมรอบด้วยเซลล์สีขาว

ในกรณีนี้คุณอยู่คนเดียว (หรืออย่างที่คุณคิด) โดยไม่มีใครอยู่รอบตัวคุณ คุณสามารถดูรายการที่อยู่รอบ ๆ ในอาร์กิวเมนต์แรกของontickตัวจัดการของคุณ เพิ่มเติมเกี่ยวกับ API ในภายหลัง

ทีมของคุณ

ทีมของคุณถูกกำหนดโดย ID ผู้ใช้ของคุณ หากต้องการทราบว่าคลิกที่รูปโปรไฟล์ของคุณ:

ภาพโปรไฟล์ของฉัน

จากนั้นค้นหา ID ผู้ใช้ของคุณในแถบที่อยู่:

มันอยู่ระหว่าง / users / และ / yourusername

ถ้ามันแปลกคุณอยู่ในทีมสีน้ำเงิน

ถ้าเป็นเช่นนั้นคุณจะอยู่ในทีมสีแดง

คุณยินดีต้อนรับสู่แวดวงที่วาดด้วยมือ

ชื่อ (bot's) ของคุณ

ชื่อบอทของคุณเริ่มต้นด้วยตัวอักษรตัวแรกของทีม ("r" หรือ "b") มันจะต้องตรงกับ /^(r|b)[A-Za-z_-]$/regex นอกจากนั้นคุณสามารถเลือกชื่อบอทของคุณ โปรดอย่าใช้อันที่มีอยู่แล้ว

ที่เริ่มต้น

ผู้เล่นสีแดงจะเริ่มใกล้ด้านบนของแผนที่และสีน้ำเงินจะเริ่มใกล้ด้านล่าง คุณจะได้รับข้อมูลพิเศษเกี่ยวกับเห็บแรก (เปิด) ในenvironmentพารามิเตอร์สำหรับontickฟังก์ชั่น ฉันแนะนำให้เก็บไว้ ดู API สำหรับรายละเอียด

เมื่อถึงตาคุณ

ลำดับการเลี้ยวถูกสุ่มในตอนแรก แต่จากนั้นยังคงเหมือนเดิม

หันการกระทำ

คุณสามารถทำได้เพียงหนึ่งการกระทำต่อเทิร์น

  • ย้าย

    เมื่อคุณต้องการย้ายคุณโทรthis.move(num)ใน API numเป็นเซลล์ที่คุณต้องการย้ายไปที่:

    0 คือซ้ายบน, 1 คือกลางบนสุด, 2 คือขวาบน, 3 คือกลางขวา, 4 คือกลางซ้าย, 5 คือซ้ายล่าง, 6 คือกลางล่าง, และ 7 คือขวาล่าง

    ตำแหน่งสัมพัทธ์ของหมายเลขที่คุณสามารถย้ายไปไว้จะถูกเก็บไว้ในค่าคงที่ส่วนกลางthreeByThree:

[
    [0, 1, 2],
    [3, undefined, 4],
    [5, 6, 7]
]

ถ้าคุณย้ายเข้าไปในกำแพงหรือผู้เล่นอื่นไม่มีอะไรเกิดขึ้น

  • หมุน

    this.rotate(num)หมุนที่คุณเรียก Num เป็นทิศทางที่คุณต้องการหมุน:

    0 คือด้านบน, 1 ถูกต้อง, 2 ลงและ 3 เหลือ

    การหมุนเป็นแบบสัมบูรณ์

  • ฆ่า

    หากผู้เล่นอื่น (จากทีมอื่น) อยู่ในเซลล์ที่คุณกำลังเผชิญคุณสามารถโทรthis.kill()และฆ่าพวกเขาได้ หากไม่มีใครอยู่ที่นั่นหรืออยู่ในทีมของคุณสิ่งนี้ไม่ได้ทำอะไรเลย ตัวอย่าง:

    ตัวเลขเดียวกันกับด้านบนเซลล์ 0 เป็นสีเขียว 1 เป็นสีน้ำเงิน 2 เป็นสีส้มและ 3 เป็นสีเหลือง

    หากคุณหันไป0คุณสามารถฆ่าสีเขียว หากคุณเปลี่ยนเป็น 1 คุณสามารถฆ่าสีน้ำเงินได้ หากคุณเปลี่ยนเป็น 2 คุณสามารถฆ่าส้มได้ หากคุณเปลี่ยนเป็น 3 คุณสามารถฆ่าสีเหลือง

  • วางระเบิด

    การทิ้งระเบิดฆ่าผู้เล่นทุกคนรวมถึงคุณและเพื่อนร่วมทีมใน 9 สี่เหลี่ยมรอบ ๆ ตัวคุณ ตัวอย่าง:

    มีตาราง 9x9 ที่มี "x" ในแต่ละเซลล์

    ทำไมคุณต้องการทำเช่นนี้? กองบินกล้าตาย หากมีผู้เล่นไม่ได้อยู่ในทีมของคุณใน 9 เซลล์รอบ ๆ ตัวคุณมีอยู่ในทีมคุณอาจพิจารณาวางระเบิด (ฉันแนะนำให้คุณแจ้งให้เพื่อนของคุณทราบก่อน!)

  • วางทุ่นระเบิด

    นี่เป็นการสร้างมรณะสำหรับผู้อื่นที่ไม่ได้อยู่ในทีมของคุณ เมื่อคุณวางทุ่นระเบิดคุณก็จะย้ายดังนั้นคุณจึงไม่เหยียบมัน คุณเรียกthis.landMine(num)ที่เป็นจำนวนตารางที่คุณต้องการไป ตัวอย่าง:

    สี่เหลี่ยมสีแดงเดี่ยวในตาราง 9x9 ล้อมรอบด้วยเซลล์สีขาว

    จากนั้นคุณโทรthis.landMine(4):

    [กริด 9x9 ที่มี "M" สีแดงอยู่ตรงกลางและเซลล์สีแดงที่ด้านขวาตรงกลาง

    เห็นไหมว่า "M"? มันเป็นทุ่นระเบิด คนอื่นสามารถดูได้ ... ตอนนี้ ทุกคนแม้กระทั่งผู้ที่ไม่ได้อยู่ในทีมของคุณก็สามารถเห็นทุ่นระเบิดบนเห็บได้ แต่หลังจากเห็บนั้นจบลงแล้วไม่มีใครเลยแม้แต่คุณก็สามารถเห็นได้ แต่มันจะระเบิดทันทีที่ศัตรูเดินข้ามมัน ตัวอย่าง:

    กริด 9x9 สองเซลล์สีน้ำเงินที่อยู่ตรงกลางด้านซ้ายในอันแรกสีแดง "M" ที่อยู่ตรงกลางของอันแรกสีแดง "x" ที่อยู่ตรงกลางของอันที่สองและลูกศรระหว่างพวกเขา

    บลูย้ายไปอยู่กับทุ่นระเบิดของคุณและบูม! คุณเพิ่งได้สังหารอีกครั้ง

    สำหรับทุก ๆ 2 การสังหารที่คุณได้รับ (จากการฆ่าโดยตรงหรือการระเบิดทุ่นระเบิด) คุณจะได้รับกับระเบิดเพิ่ม 1 ตัว คุณยังจะได้รับเมื่อเริ่มต้น

  • ขุด

    เมื่อคุณขุดคุณจะพบกับระเบิดในพื้นที่ 5x5 ที่อยู่กึ่งกลางรอบตัวคุณ สิ่งนี้ไม่ได้แสดงให้เห็นทีมของบอทที่วางกับระเบิด (โปรดจำไว้ว่าคุณไม่สามารถถูกทุ่นระเบิดฆ่าโดยคนในทีมของคุณ) ตัวอย่างเช่นถ้านี่เป็นกริดรอบตัวคุณ:

    จากนั้นค่าส่งคืนของthis.dig()จะเป็น:

[undefined,undefined,undefined,true,undefined,
undefined,undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,true,undefined,undefined,
true,undefined,undefined,undefined,undefined]

ดัชนีอาเรย์เริ่มจากด้านบนซ้ายไปทางขวาลงล่างไม่รวมตัวคุณ:

มีทั้งหมด 23 และสถานที่สัมพันธ์ของพวกเขาจะถูกเก็บไว้ในค่าคงที่ทั่วโลก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]
]

โปรดทราบว่าขุดเผยให้เห็นเหมืองวางไว้ในเห็บก่อนหน้าซึ่งแตกต่าง aroundMeหมายเหตุขุดที่เผยให้เห็นการทำเหมืองแร่ที่วางอยู่บนเห็บก่อนหน้านี้ซึ่งแตกต่างจาก

การสื่อสาร

this.sendMessage(recipients, team, data)เมื่อคุณต้องการที่จะพูดคุยกับใครสักคนที่คุณเรียก ข้อมูลสามารถเป็นอะไรก็ได้ที่คุณต้องการและคุณสามารถส่งไปยังทุกคนที่คุณต้องการแม้แต่ผู้เล่นในทีมอื่น ๆสิ่งนี้สามารถใช้ในการหลอกลวงบอทที่มีโปรแกรมไม่ดี แต่ผู้เล่นทุกคนสามารถเห็นว่าใครส่งข้อความและใครอยู่ในทีม

ตัวอย่าง:

ส่งบางสิ่งไปยังบอตชื่อ "redisbest":

this.sendMessage("redisbest", undefined, "Hi!");

ส่งบางสิ่งไปยังบอตชื่อ "redisbest" และ "blueiscool":

this.sendMessage(["redisbest", "blueiscool"], undefined, {hello: "there"});

ส่งอะไรถึงทีมสีแดงทั้งหมด

this.sendMessage(undefined, "red", {hello: "red"});

ส่งบางสิ่งถึงทุกคน

this.sendMessage(undefined, "*", {hello: "everyone"});

ส่งบางสิ่งไปยังทีมสีแดงทั้งหมดและบอทชื่อ "blueiscool":

this.sendMessage("blueiscool", "red", {hello: "bots"});

API

รหัสของคุณต้องประกอบด้วยการเรียกใช้createBotฟังก์ชันครั้งเดียว ไม่มีอะไรอีกแล้ว. รหัสตัวอย่าง:

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

(คุณมีอิสระในการคัดลอกวางเพียงแค่แก้ไขให้กับทีมของคุณ ฯลฯ )

วิธีการ

  • ontick(environment)

    เรียกว่าเมื่อถึงตาคุณ ต้องส่งคืนค่าPromiseที่แก้ไขใน 1 วินาทีหรือน้อยกว่ามิฉะนั้นจะถูกละเว้น นี่คือเหตุผลด้านประสิทธิภาพและมีผลข้างเคียงที่ดีที่ไม่มีแท็บค้าง

    this (เมื่ออยู่ใน ontick)

    • landMines คุณมีที่ดินเหลืออยู่กี่เหมือง ยิ่งฆ่าคุณได้มากเท่าไหร่คุณก็ยิ่งได้รับที่ดินมากขึ้นเท่านั้น สำหรับทุกๆ 2 บอทที่คุณฆ่าคุณจะได้รับกับระเบิดเพิ่มอีก 1 ตัว คุณจะได้รับ 1 เพื่อเริ่มต้น
    • direction ทิศทางที่คุณกำลังเผชิญ
    • storage การจัดเก็บข้อมูลที่ยังคงอยู่ระหว่างการโทรไปและonTick onMessageวัตถุเปล่าเมื่อเริ่มต้น ปรับเปลี่ยนเพื่อวัตถุประสงค์ใด ๆ แต่ตรวจสอบให้แน่ใจว่าเป็นอาร์เรย์หรือวัตถุเสมอ
    • move(num) ย้ายไปยังตำแหน่งที่ระบุ ไม่ทำอะไรเลยถ้าไม่ถูกต้อง ดูรายละเอียดด้านบน
    • rotate(num) หมุนไปยังตำแหน่งที่ระบุ ไม่ทำอะไรเลยถ้าไม่ถูกต้อง ดูรายละเอียดด้านบน
    • kill() สังหารผู้เล่นที่คุณกำลังเผชิญหน้าหากมีอยู่และไม่ได้อยู่ในทีมของคุณ ดูรายละเอียดด้านบน
    • bomb() ฆ่าทุกคนใน 9 สี่เหลี่ยมรอบ ๆ ตัวคุณรวมถึงตัวคุณเองด้วย
    • landMine(num) วางทุ่นระเบิดที่คุณอยู่จากนั้นย้ายไปยังตำแหน่งที่ระบุ ไม่ทำอะไรเลยถ้าไม่ถูกต้องnumหรือคุณไม่มีเหลือ ดูรายละเอียดด้านบน
    • dig() ใหม่! ส่งคืนอาร์เรย์ของข้อมูลเกี่ยวกับกับระเบิดในพื้นที่ 5x5 ที่อยู่กึ่งกลางรอบตัวคุณ ดูรายละเอียดด้านบน
    • sendMessage(recipients, team, data) recipientsสามารถเป็นได้ทั้งบอเดียว (สตริง) อาร์เรย์ของบอทหรือ/undefined nullเป็นคนที่คุณต้องการส่งข้อความ teamเป็นสตริงของทีมที่คุณต้องการส่งข้อความ ใช้"*"เพื่อส่งข้อความถึงทุกคน dataเป็นสิ่งที่สามารถส่งผ่านไปยังฟังก์ชัน JS มันถูกส่งไปยังผู้รับ ถ้ามันเป็นวัตถุหรืออาร์เรย์มันจะถูกส่งผ่านโดยการอ้างอิงดังนั้นคุณและผู้รับสามารถบันทึกสิ่งนั้นไปstorageยังวัตถุและการปรับเปลี่ยนใด ๆ ของวัตถุที่มีผลต่อสำเนาของบอท โปรดทราบว่าผู้รับที่อยู่ในทั้งรายชื่อของบอท, บอทที่แน่นอนที่ระบุไว้ในสตริงหรือบอทในทีมที่คุณระบุไว้ก็จะได้รับข้อความ

environment

เมื่อขีดแรก

  • x: ตำแหน่ง x ของผู้เล่นของคุณ
  • y: ตำแหน่ง y ของผู้เล่นของคุณ
  • gridWidth: ความกว้างของกริด (เป็นเซลล์)
  • gridHeight: ความสูงของกริด (เป็นเซลล์)

    เมื่อเห็บทั้งหมด

  • aroundMe: อาร์เรย์ของผู้เล่นและกับระเบิด ผู้เล่นที่เป็นวัตถุที่มีลักษณะเหมือนและระเบิดที่มี{name: "bot name", team: "bot team"} {team: "team of bot who placed mine"}ดัชนีของอาร์เรย์:

    0 คือซ้ายบน, 1 คือกลางบนสุด, 2 คือขวาบน, 3 คือกลางขวา, 4 คือกลางซ้าย, 5 คือซ้ายล่าง, 6 คือกลางล่าง, และ 7 คือขวาล่าง

    โปรดทราบว่าทุ่นระเบิดที่วางบนเครื่องหมายอื่นนอกเหนือจากที่เป็นปัจจุบันจะไม่ถูกแสดง

    aroundMe ตัวอย่าง:

    สมมติว่านี่คือตาราง (คุณแดง):

    ตาราง 9x9 มีสีน้ำเงินอ่อนที่มุมบนซ้ายสีเทา "M" ที่มุมขวาบนสีแดงตรงกลางสีเหลืองตรงกลางด้านซ้ายและสีแดง "M" ที่ด้านล่างซ้าย

    คุณaroundMeจะมีลักษณะเช่นนี้:

[
    {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.
]

ดัชนีของอาร์เรย์มีการอธิบายไว้ที่นี่:

0 คือซ้ายบน, 1 คือกลางบนสุด, 2 คือขวาบน, 3 คือกลางขวา, 4 คือกลางซ้าย, 5 คือซ้ายล่าง, 6 คือกลางล่าง, และ 7 คือขวาล่าง

บอทของคุณเห็นสิ่งนี้ได้อย่างมีประสิทธิภาพ:

กล่องสีฟ้าอ่อนที่ด้านซ้ายบนโดยมีตัวเลขสีดำ 0 อยู่ในนั้นกล่องสีเหลืองที่ขอบซ้ายมีหมายเลขสีดำ 4 อยู่ในนั้นและมี "M" สีแดงที่ด้านล่างซ้ายกับ 5 สีดำ

  • onmessage(data, fromBot, fromTeam)

    this (เมื่ออยู่ในข้อความ)

    • sendMessage(recipients, team, data) ฟังก์ชั่นการส่งข้อความมาตรฐาน
    • storage ที่เก็บข้อมูลมาตรฐาน

    dataข้อมูลที่ส่งจากผู้ส่ง fromPlayerผู้เล่นข้อความถูกส่งจาก fromTeamทีมที่ส่งข้อความจาก

  • onkill()

    this (เมื่ออยู่ใน onkill)

    • sendMessage(recipients, team, data) ฟังก์ชั่นการส่งข้อความมาตรฐาน

สะดวกทั่วโลก (คงที่) อาร์เรย์:

threeByThree:

[
    [0, 1, 2],
    [3, undefined, 4],
    [5, 6, 7]
]

aroundMeที่เป็นประโยชน์สำหรับการส่งผ่านข้อมูลไปยังฟังก์ชั่นการย้ายเช่นเดียวกับการตีความ ดูด้านบน.

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]
]

ประโยชน์สำหรับthis.dig()ฟังก์ชั่นในontickจัดการ

ลอง!

คอนโทรลเลอร์จะถูกเรียกใช้จากเครื่องของฉันบน localhost ด้วยเหตุผลด้านประสิทธิภาพ แต่คุณสามารถใช้CodePen ได้เพื่อทดสอบบอทของคุณ

โปรดทราบว่าคุณต้องวางรหัสในคอนโซลและกด Enterก่อนคลิกเรียกใช้ คุณสามารถวางบอทได้มากเท่าที่คุณต้องการ "บอททดสอบ" เป็นตัวอย่างสำหรับคุณที่จะทดสอบ หากคุณสามารถเอาชนะหรือผูกพวกเขาทั้งหมดคุณมีอย่างน้อยบอทที่ดี

การส่ง

กฎระเบียบ

กฎ (บังคับโดยผู้ควบคุม)

  • หลักของคุณ ontickรหัสจะต้องไม่เกิน 1 วินาที เราไม่ต้องการให้รอบใช้เวลาตลอดไป หากรหัสของคุณใช้เวลา> 1 วินาทีรหัสนั้นจะหยุด
  • หากคุณพยายามกระทำมากกว่า 1 ครั้งต่อเทิร์นหรือทำสิ่งที่ไม่ถูกต้อง (เช่น this.move(-1)ย้ายไปที่กำแพง) มันจะถูกละเว้น
  • อาจมาเร็ว ๆ นี้ ...

กฎ (บังคับโดยฉันอาจส่งผลให้ DQ)

  • อย่าเขียนตัวแปรทั่วโลก ( การอ่านไม่เป็นไร )
  • รหัสของคุณจะต้องทำงานใน Nodejs (ในกรณีที่ตัวควบคุมนั้นถูกย้ายไปยัง Nodejs) ดังนั้นJSON.parse(...)ก็ใช้ได้ แต่alert()ก็ไม่เป็นเช่นนั้น
  • คุณไม่ได้รับอนุญาตให้โทรcreateBotหรือรบกวนผู้ควบคุมในทางใดทางหนึ่ง
  • อย่าใช้รหัสของผู้อื่นโดยไม่ได้รับอนุญาตและการเปลี่ยนแปลงที่สำคัญ ไม่มีสำเนา
  • กรุณาไม่มีช่องโหว่!
  • อาจมาเร็ว ๆ นี้ ...

บอทของฉัน

นี่คือบางบอท:

บอทนี้สุ่มเลือกการกระทำ มันเป็นการสุ่มน้ำหนัก แต่ก็ยังค่อนข้างสุ่ม หากคุณสามารถฆ่าบอทนี้ได้ (ในที่สุดมันจะฆ่าตัวเองมันไม่นับ) กว่าที่คุณมีบอทที่ดี โพสต์ไว้และดูว่าเกิดอะไรขึ้น!

บอทของฉันมีชื่อขึ้นต้นด้วย "x" และทีม "none" คุณจะยินดีที่จะใช้บางส่วนของรหัสนี้ แต่โปรดทำอย่างน้อยบางส่วนปรับเปลี่ยน หากคุณไม่สามารถปรับแต่งตัวเลขได้อย่างน้อยคุณจะไม่ชนะ

จัดรูปแบบการส่งของคุณ

โปรดใช้รูปแบบนี้:

# 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...

คำขอคุณสมบัติข้อบกพร่องคำถาม ฯลฯ ?

แสดงความคิดเห็นด้านล่าง! โปรดตรวจสอบเพื่อดูว่ามีความคิดเห็นด้วยหรือไม่ หากมีอยู่แล้วให้โหวตขึ้น

ต้องการคุยกับทีมของคุณหรือไม่

ใช้ห้องแชทสำหรับสีแดงและสีน้ำเงินสีฟ้า

ภาษา

ปัจจุบันรองรับเฉพาะ JS และบางอย่างที่รวบรวมไปยัง JS แต่ถ้าคุณรู้วิธีที่จะทำให้ภาษาอื่นทำงานร่วมกับ Nodej ได้ฉันยินดีที่จะย้ายพอร์ตคอนโทรลเลอร์ไปยัง Nodejs

บันทึกสุดท้าย

ความคิดเชิงกลยุทธ์

ช่วยทีมของคุณ! การสร้างบอทที่ออกแบบมาเพื่อช่วยบอตตัวอื่นและทำงานร่วมกัน กลยุทธ์นี้ใช้งานได้ดีสำหรับRed & Blue - Pixel Team Battlebots

ตัวแทนผู้แสวงหา

ฉันจะยอมรับคำตอบที่ได้รับการโหวตสูงสุดในทีมที่ชนะ โปรดทราบว่าคำตอบก่อนหน้ามีแนวโน้มที่จะได้รับคะแนนเสียงมากขึ้น แต่จุดอ่อนของพวกเขามีแนวโน้มที่จะพบและใช้ประโยชน์

นอกจากนี้หากคุณตอบเร็ว ๆ นี้คุณอาจได้รับ +100 เงินรางวัล


1
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Dennis

ฉันขอบอทมากกว่าหนึ่งบอทได้ไหม (ขออภัยฉันรู้ว่าบทสนทนาได้รับการเปลี่ยนแปลงฉันแค่แชทโดนห้ามแล้ว)
Matthew Roh

@SIGSEGV ใช่ แต่คนอื่นต้องโพสต์ คุณสามารถโพสต์บอทหนึ่งอันและมอบรหัสของอีกอันให้กับใครบางคนในทีมของคุณ แต่คุณไม่สามารถโพสต์ได้สองครั้ง
programmer5000

เกี่ยวกับการวางตำแหน่งเซลล์ที่อยู่ในดัชนี [0, 0] มันเป็นเซลล์มุมบนซ้ายหรือไม่ การส่งข้อความใช้การกระทำของคุณ (ต่อเทิร์น) หรือไม่ ขอบคุณ
Thrax

@ Thrax ใช่และไม่ใช่ คุณสามารถส่งข้อความเพื่อตอบกลับข้อความได้
programmer5000

คำตอบ:


7

xscared (ไม่แข่งขัน)

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(){
    }
});

ผู้คนกลัวมาก ห่างจากคนแรก (หรือกับระเบิด) ที่เห็น มิฉะนั้นมันจะย้ายแบบสุ่ม โปรดทราบว่านี่ไม่ใช่การแข่งขันเพียงตัวอย่าง พยายามเอาชนะมัน!


6

สำรอง, บอทสีน้ำเงิน

ตามคำเตือนในการแชทฉันไม่เคยเขียนอะไรในจาวาสคริปต์ในชีวิตของฉันดังนั้นหากคุณพบข้อผิดพลาดใด ๆ โปรดบอกฉัน! (ขอบคุณ @ programmer5000 ที่ช่วยฉันด้วยแล้ว)
แนวคิดของบอทนี้คือมันสื่อสารกับบอตอื่น ๆ จากทีมเดียวกันและส่งตำแหน่งไปพร้อมกับแผนที่ของเหมืองที่พบ มันพยายามที่จะเข้าร่วมบอทสีน้ำเงินที่ใกล้ที่สุด (ถ้ามีใครส่งข้อมูลตำแหน่ง [ให้เป็น [x, y] อาร์เรย์]) และอยู่ใกล้กับมัน (โดยให้มันกลับมาให้มากที่สุด) ฆ่าบอทสีแดงหรือมองหา ข้างหน้าสำหรับเหมือง

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']});}
});

เฮ้คุณแคร์ถ้าฉันป้อนสิ่งนี้ด้วย แต่ (ด้วยชื่ออื่น) ฉันเป็นสีน้ำเงิน
Christopher

@ คริสโตเฟอร์ไม่ฉันไม่สนใจ แต่มันจะน่าสนใจกว่าสำหรับคุณและทีมถ้าคุณทำอย่างน้อยหนึ่งอย่างแตกต่างกันเล็กน้อย (อย่างน้อยก็เติมเต็ม 2 บอทที่มีอยู่แล้ว)
plannapus

จะทำเช่นนั้น ฉันจะเปลี่ยนมันขึ้น
Christopher

ถ้าฉันพยายามเรียกใช้ bot ของคุณใน codepen มันไม่ทำงานเพราะคุณกำลังใช้this.xและอื่น ๆ แต่มันเป็นenvironment.xหรือฉันผิดหรือเปล่า?
WasteD

@WasteD ตามที่ฉันบอกว่าฉันไม่รู้จัก Javascript เลยดังนั้นจึงเป็นไปได้ แต่ถ้าเป็นกรณีนั้นฉันคิดว่ามันควรจะเป็นenvironment.gridHeightและenvironment.aroundMe? ซึ่งในกรณีนี้แล้วบอทอื่น ๆ this.aroundMeที่ไม่ควรจะทำงานอย่างใดอย่างหนึ่งตั้งแต่ที่พวกเขาใช้
plannapus

5

สีฟ้าสีน้ำเงินโลกของฉันเป็นสีฟ้า

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() {}
});

สุ่มส่วนใหญ่ แต่จะวางระเบิดถ้าล้อมและชอบตรวจสอบและฆ่ามากกว่าการเคลื่อนไหว


ฉลาด! ทำได้ดีนี่.
programmer5000

3
โยฟังนี่คือเรื่องราวเกี่ยวกับผู้ชายตัวเล็ก ๆ ที่อาศัยอยู่ในโลกสีฟ้า
Matthew Roh

3

ผ่อนคลายเครื่องบินทิ้งระเบิด

บอทนี้ทำการค้นหาจุดที่มีเซลล์ว่างอย่างน้อย 1 เซลล์ในแต่ละด้านจากนั้นทำการขุด มันตั้งค่ายอยู่จนกระทั่งศัตรูเข้ามาใกล้ เมื่อมีคนเข้ามาใกล้เขาจะถอยกลับไปมาเพื่อหลอกหลอนบอตอื่น ๆ เขาจะหมุนและฆ่าถ้าจำเป็น เมื่อเขาไม่มีเหมืองเหลืออยู่เขาจะหาที่หลบภัยที่มุมบนซ้ายพร้อมกลับไปที่กำแพงและตอบโต้หากเขาถูกคุกคาม

ไม่มีการเล่นเป็นทีมพิเศษที่นี่นอกเหนือจากการถ่ายทอดตำแหน่งของเขาไปยังทีมของเขาด้วยselfคำหลัก

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() {}
});

คุณอยู่ทีมไหน
programmer5000

@ programmer5000 เนื่องจากชื่อบอทจะต้องเริ่มต้นด้วยตัวอักษรของทีมฉันเดาว่าฉันคือ Team Red :)
Thrax

เยี่ยมบอท! ฉันขอแนะนำให้คุณแนะนำสิ่งที่อยู่รอบตัวคุณให้กับทีมของคุณเช่นกัน
programmer5000

1

สำรอง 1 บอทสีน้ำเงินอีกอันหนึ่ง (ลืมที่จะทำก่อนหน้านี้)

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

Blue Fighter

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(){}
});

นักมวยสีน้ำเงินเคลื่อนย้ายและทุ่นระเบิดสุ่มและหมุนไปทางผู้เล่นสีแดง หากบล็อกโดยรอบมีสีแดงมากกว่าสีน้ำเงินมันจะระเบิด หากมันหันหน้าไปทางผู้เล่นสีแดงก็จะฆ่ามัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.