ความท้าทายนี้ได้แรงบันดาลใจจาก@HelkaHombaของความท้าทายที่ยอดเยี่ยมสีแดงกับสีน้ำเงิน - Pixel ทีม BattleBots ความท้าทายนั้นน่าจะเป็นสิ่งที่ดีที่สุดที่ฉันเคยเห็นในเว็บไซต์นี้ เคย
ความท้าทายของฉันยังคงแตกต่างกันมาก แต่ @HelkaHomba สมควรได้รับเครดิตสำหรับแรงบันดาลใจ
ภาพรวม
นี่คือทีมking-of-the-hillที่ทีมของคุณชนะโดยให้ผู้เล่นทุกคนมีชีวิตอยู่ในทีมของคุณ กล่าวอีกนัยหนึ่งการยืนทีมสุดท้ายชนะ การจับจะถูกทำใหม่
คุณอยู่บนกระดาน คุณรู้ตำแหน่งของคุณในรอบแรก (ติ๊ก 0) คุณยังรู้ว่าใครอยู่ในพื้นที่รอบ ๆ คุณ:
ในกรณีนี้คุณอยู่คนเดียว (หรืออย่างที่คุณคิด) โดยไม่มีใครอยู่รอบตัวคุณ คุณสามารถดูรายการที่อยู่รอบ ๆ ในอาร์กิวเมนต์แรกของontick
ตัวจัดการของคุณ เพิ่มเติมเกี่ยวกับ API ในภายหลัง
ทีมของคุณ
ทีมของคุณถูกกำหนดโดย ID ผู้ใช้ของคุณ หากต้องการทราบว่าคลิกที่รูปโปรไฟล์ของคุณ:
จากนั้นค้นหา ID ผู้ใช้ของคุณในแถบที่อยู่:
ถ้ามันแปลกคุณอยู่ในทีมสีน้ำเงิน
ถ้าเป็นเช่นนั้นคุณจะอยู่ในทีมสีแดง
คุณยินดีต้อนรับสู่แวดวงที่วาดด้วยมือ
ชื่อ (bot's) ของคุณ
ชื่อบอทของคุณเริ่มต้นด้วยตัวอักษรตัวแรกของทีม ("r" หรือ "b") มันจะต้องตรงกับ /^(r|b)[A-Za-z_-]$/
regex นอกจากนั้นคุณสามารถเลือกชื่อบอทของคุณ โปรดอย่าใช้อันที่มีอยู่แล้ว
ที่เริ่มต้น
ผู้เล่นสีแดงจะเริ่มใกล้ด้านบนของแผนที่และสีน้ำเงินจะเริ่มใกล้ด้านล่าง คุณจะได้รับข้อมูลพิเศษเกี่ยวกับเห็บแรก (เปิด) ในenvironment
พารามิเตอร์สำหรับontick
ฟังก์ชั่น ฉันแนะนำให้เก็บไว้ ดู API สำหรับรายละเอียด
เมื่อถึงตาคุณ
ลำดับการเลี้ยวถูกสุ่มในตอนแรก แต่จากนั้นยังคงเหมือนเดิม
หันการกระทำ
คุณสามารถทำได้เพียงหนึ่งการกระทำต่อเทิร์น
ย้าย
เมื่อคุณต้องการย้ายคุณโทร
this.move(num)
ใน APInum
เป็นเซลล์ที่คุณต้องการย้ายไปที่:ตำแหน่งสัมพัทธ์ของหมายเลขที่คุณสามารถย้ายไปไว้จะถูกเก็บไว้ในค่าคงที่ส่วนกลาง
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
ถ้าคุณย้ายเข้าไปในกำแพงหรือผู้เล่นอื่นไม่มีอะไรเกิดขึ้น
หมุน
this.rotate(num)
หมุนที่คุณเรียก Num เป็นทิศทางที่คุณต้องการหมุน:การหมุนเป็นแบบสัมบูรณ์
ฆ่า
หากผู้เล่นอื่น (จากทีมอื่น) อยู่ในเซลล์ที่คุณกำลังเผชิญคุณสามารถโทร
this.kill()
และฆ่าพวกเขาได้ หากไม่มีใครอยู่ที่นั่นหรืออยู่ในทีมของคุณสิ่งนี้ไม่ได้ทำอะไรเลย ตัวอย่าง:หากคุณหันไป
0
คุณสามารถฆ่าสีเขียว หากคุณเปลี่ยนเป็น 1 คุณสามารถฆ่าสีน้ำเงินได้ หากคุณเปลี่ยนเป็น 2 คุณสามารถฆ่าส้มได้ หากคุณเปลี่ยนเป็น 3 คุณสามารถฆ่าสีเหลืองวางระเบิด
การทิ้งระเบิดฆ่าผู้เล่นทุกคนรวมถึงคุณและเพื่อนร่วมทีมใน 9 สี่เหลี่ยมรอบ ๆ ตัวคุณ ตัวอย่าง:
ทำไมคุณต้องการทำเช่นนี้? กองบินกล้าตาย หากมีผู้เล่นไม่ได้อยู่ในทีมของคุณใน 9 เซลล์รอบ ๆ ตัวคุณมีอยู่ในทีมคุณอาจพิจารณาวางระเบิด (ฉันแนะนำให้คุณแจ้งให้เพื่อนของคุณทราบก่อน!)
วางทุ่นระเบิด
นี่เป็นการสร้างมรณะสำหรับผู้อื่นที่ไม่ได้อยู่ในทีมของคุณ เมื่อคุณวางทุ่นระเบิดคุณก็จะย้ายดังนั้นคุณจึงไม่เหยียบมัน คุณเรียก
this.landMine(num)
ที่เป็นจำนวนตารางที่คุณต้องการไป ตัวอย่าง:จากนั้นคุณโทร
this.landMine(4)
:เห็นไหมว่า "M"? มันเป็นทุ่นระเบิด คนอื่นสามารถดูได้ ... ตอนนี้ ทุกคนแม้กระทั่งผู้ที่ไม่ได้อยู่ในทีมของคุณก็สามารถเห็นทุ่นระเบิดบนเห็บได้ แต่หลังจากเห็บนั้นจบลงแล้วไม่มีใครเลยแม้แต่คุณก็สามารถเห็นได้ แต่มันจะระเบิดทันทีที่ศัตรูเดินข้ามมัน ตัวอย่าง:
บลูย้ายไปอยู่กับทุ่นระเบิดของคุณและบูม! คุณเพิ่งได้สังหารอีกครั้ง
สำหรับทุก ๆ 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"}
ดัชนีของอาร์เรย์:โปรดทราบว่าทุ่นระเบิดที่วางบนเครื่องหมายอื่นนอกเหนือจากที่เป็นปัจจุบันจะไม่ถูกแสดง
aroundMe
ตัวอย่าง:สมมติว่านี่คือตาราง (คุณแดง):
คุณ
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.
]
ดัชนีของอาร์เรย์มีการอธิบายไว้ที่นี่:
บอทของคุณเห็นสิ่งนี้ได้อย่างมีประสิทธิภาพ:
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 เงินรางวัล