ในโลกที่ว่างเปล่าสงครามที่ซึ่งเมืองถูกโจรและโจรถูกทำลายอารยธรรมได้สร้างตัวเองใหม่ในรูปแบบของสหกรณ์อุตสาหกรรมขนาดเล็กโดดเดี่ยวกระจัดกระจายไปทั่วภูมิทัศน์ที่ไม่มีคนอาศัยอยู่ก่อนหน้านี้ การมีอยู่ของชุมชนเหล่านี้ขึ้นอยู่กับทีมงานของทหารรับจ้างที่เรียกว่า "scrappers" ซึ่งค้นหาดินแดนเปลี่ยวสำหรับวัสดุที่มีค่าเพื่อขายให้กับตำรวจ เมื่อวัสดุเหล่านี้มีน้อยมากการทิ้งเป็นอาชีพที่ยากและอันตรายมากขึ้นเรื่อย ๆ คนงานที่เปราะบางส่วนใหญ่ถูกแทนที่ด้วยหุ่นยนต์ยืนห่างจากระยะไกลเรียกว่า "บอท" และทหารรับจ้างทั่วไปมีแนวโน้มที่จะเป็นโปรแกรมเมอร์ที่มีทักษะมากกว่าช่างเชื่อมติดอาวุธ เมื่อการปรากฏตัวของมนุษย์ในการทำลายล้างได้ลดลงดังนั้นความเคารพระหว่างกลุ่มทหารรับจ้างจึงมีต่อกันเช่นกัน บอทติดตั้งไม่เพียง แต่จะเก็บรวบรวมเศษเหล็ก แต่เพื่อป้องกันและในบางกรณีก็ใช้แรง โปรแกรมเมอร์ของ Bot ทำงานอย่างไม่รู้จักเหน็ดเหนื่อยเพื่อกำหนดกลยุทธ์ใหม่ ๆ เพื่อเอาชนะคู่แข่งที่ไม่พอใจส่งผลให้บอทมีความก้าวร้าวมากขึ้นและเป็นอันตรายต่อมนุษย์ที่เข้ามาอยู่นอกกำแพงชุมชนของพวกเขา
(ใช่โลโก้ถูกครอบตัดอย่างสนุกสนาน)
ยินดีต้อนรับสู่ Scrappers!
นี่เป็นรุ่นแรก ๆ ของ Scrappers ซึ่งยังไม่มีการรวบรวมเศษซากและโรงงาน มันเป็น "shoot 'em up"
คุณเป็นโปรแกรมเมอร์ทหารรับจ้างที่ได้รับมอบหมายให้สร้างโปรแกรมเพื่อจัดการบอทของคุณจากระยะไกลเพื่อชัยชนะเหนือกลุ่มสแครปเปอร์คู่ต่อสู้ บอทของคุณเป็นเครื่องจักรที่เหมือนแมงมุมซึ่งประกอบด้วยเครื่องกำเนิดไฟฟ้าและเครื่องกำเนิดไฟฟ้าที่แกนกลางของพวกเขาล้อมรอบไปด้วยอวัยวะต่าง ๆ มากมายที่มีการจับการตัดและการโจมตีอุปกรณ์ เครื่องกำเนิดไฟฟ้าสามารถผลิตพลังงาน 12 หน่วย (pu) ต่อหนึ่งขีด (หน่วยเวลาของ scrapper) คุณเป็นผู้ควบคุมวิธีการกระจายพลังนี้ท่ามกลางความต้องการหลักสามประการของบ็อต: การเคลื่อนไหว, เกราะ, และพลังยิง
บอท Scrapper เป็นเครื่องจักรที่คล่องตัวเป็นพิเศษและสามารถเคลื่อนที่ข้ามใต้และรอบ ๆ สิ่งกีดขวางที่พบได้อย่างง่ายดาย ดังนั้นการชนไม่ใช่สิ่งที่โปรแกรมของคุณต้องคำนึงถึง คุณมีอิสระที่จะจัดสรรทั้งหมดบางส่วนหรือไม่มี 12pu ที่พร้อมใช้งานสำหรับบอตของคุณสำหรับการเคลื่อนไหวตราบใดที่คุณจัดการเป็นจำนวนเต็ม การจัดสรร 0pu ให้กับฟังก์ชั่นการเคลื่อนไหวของบ็อตจะทำให้ไม่สามารถเคลื่อนที่ได้ การจัดสรร 2pu จะทำให้บอทสามารถย้าย 2 หน่วยระยะทาง (du) ต่อหนึ่งขีด 5pu จะส่งผลให้ 5du / tick, 11pu จะส่งผลให้ 11du / tick และอื่น ๆ
เครื่องกำเนิดไฟฟ้าโล่บอทของคุณฉายฟองพลังงานการโกลาหลรอบ ๆ ร่างกาย เกราะสามารถเบี่ยงเบนความเสียหายได้มากถึง 1 ดาเมจก่อนที่จะโผล่ออกมาดังนั้นจึงปล่อยบอทของคุณออกมาจนกว่ามันจะสร้างเครื่องกำเนิดพลังงานสร้างพลังงานเพียงพอที่จะสแนปโล่กลับเข้าที่ คุณมีอิสระในการจัดสรรทั้งหมด, บางส่วน, หรือไม่มี 12pu ที่พร้อมใช้งานสำหรับ bot ของคุณที่มีเกราะป้องกัน การจัดสรร 0pu ให้กับโล่ของบอทหมายความว่ามันจะไม่สร้างเกราะป้องกันขึ้นมา การจัดสรร 2pu จะอนุญาตให้บอทสร้างโล่ใหม่ 2 จาก 12 เห็บหรือทุกๆ 6 เห็บ 5pu จะส่งผลให้เกิด regeneration 5 จากทุก ๆ 12 ติ๊กเป็นต้น
ด้วยการสร้างประจุในเลเซอร์เชื่อมของพวกเขาบอทของคุณสามารถยิงลำแสงที่สร้างความเสียหายในระยะทางสั้น ๆ ได้อย่างแม่นยำ เช่นเดียวกับการสร้างโล่อัตราการยิงของบ็อตของคุณขึ้นอยู่กับพลังที่จัดสรรให้กับเลเซอร์ของพวกเขา การจัดสรร 0pu ให้กับเลเซอร์ของบอทหมายความว่ามันจะไม่ยิง การจัดสรร 2pu จะอนุญาตให้บอทยิง 2 จากทุก ๆ 12 ติ๊กเป็นต้น เลเซอร์ของบ็อตจะเคลื่อนที่จนกว่าจะพบวัตถุหรือกระจายไปสู่ความไร้ประโยชน์ดังนั้นจงระวังไฟที่เป็นมิตร แม้ว่าบอทของคุณจะค่อนข้างแม่นยำ แต่มันก็ไม่สมบูรณ์แบบ คุณควรคาดหวังความแปรปรวน +/- 2.5 องศาอย่างแม่นยำ เมื่อลำแสงเลเซอร์เคลื่อนที่ไปอนุภาคของมันจะถูกเบี่ยงเบนไปตามชั้นบรรยากาศจนกระทั่งลำแสงนั้นไม่เป็นอันตรายอย่างมีประสิทธิภาพในระยะทางที่เพียงพอ เลเซอร์จะสร้างความเสียหายได้ 1 จุดที่ระยะเผาขนและ 2.5% จะสร้างความเสียหายได้น้อยลงทุกความยาวบอทที่เคลื่อนที่
บอท Scrapper เป็นอิสระพอที่จะจัดการฟังก์ชั่นพื้นฐาน แต่พึ่งพาคุณโปรแกรมเมอร์ของพวกเขาที่จะทำให้พวกเขามีประโยชน์เป็นกลุ่ม ในฐานะโปรแกรมเมอร์คุณอาจใช้คำสั่งต่อไปนี้สำหรับแต่ละ bot
- ย้าย: ระบุพิกัดของบอทที่จะย้าย
- เป้าหมาย: ระบุบอทเพื่อเล็งและยิงเมื่อการจัดสรรพลังงานอนุญาต
- อำนาจ: กระจายอำนาจระหว่างการเคลื่อนไหวเกราะและพลังยิง
รายละเอียดเกมทางเทคนิค
มีสามโปรแกรมที่คุณจะต้องคุ้นเคย เกมเครื่องยนต์เป็นรถยกของหนักและให้ API TCP ว่าโปรแกรมเล่นเชื่อมต่อไปยัง โปรแกรมเล่นคือสิ่งที่คุณจะเขียนและผมได้ให้บางตัวอย่างกับไบนารีที่นี่ ในที่สุดRendererประมวลผลเอาต์พุตจาก Game Engine เพื่อสร้าง GIF ของการต่อสู้
เกมเอ็นจิ้น
คุณสามารถดาวน์โหลดเกมเครื่องยนต์จากที่นี่ เมื่อเปิดตัวเกมมันจะเริ่มฟังพอร์ต 50000 (ปัจจุบันไม่สามารถกำหนดค่าได้) สำหรับการเชื่อมต่อของผู้เล่น เมื่อได้รับการเชื่อมต่อผู้เล่นสองคนมันจะส่งข้อความ READY ไปยังผู้เล่นและเริ่มเกม โปรแกรมเล่นส่งคำสั่งไปยังเกมผ่านทาง TCP API เมื่อเกมสิ้นสุดลงไฟล์ JSON ชื่อ scrappers.json (เช่นนั้นยังไม่สามารถกำหนดค่าได้ในปัจจุบัน) จะถูกสร้างขึ้น นี่คือสิ่งที่ renderer ใช้สร้าง GIF ของเกม
TCP API
โปรแกรมของผู้เล่นและเอ็นจิ้นเกมสื่อสารโดยการส่งสตริง JSON ที่ยกเลิกบรรทัดใหม่และที่สี่ผ่านการเชื่อมต่อ TCP มีข้อความ JSON เพียงห้าข้อความที่สามารถส่งหรือรับได้
ข้อความพร้อม
ข้อความ READY จะถูกส่งจากเกมไปยังโปรแกรมเล่นและส่งเพียงครั้งเดียว ข้อความนี้บอกโปรแกรมผู้เล่นว่า ID ผู้เล่น (PID) คืออะไรและแสดงรายการบอตทั้งหมดในเกม PID เป็นวิธีเดียวที่จะตัดสินว่าบอทใดที่เป็นมิตรกับศัตรู ข้อมูลเพิ่มเติมเกี่ยวกับฟิลด์ bot ด้านล่าง
{
"Type":"READY", // Message type
"PID":1, // Player ID
"Bots":[ // Array of bots
{
"Type":"BOT",
"PID":1,
"BID":1,
"X":-592,
...
},
...
]
}
ข้อความ ธ ปท
ข้อความ BOT จะถูกส่งจากเกมไปยังโปรแกรมผู้เล่นและจะถูกส่งเมื่อคุณลักษณะของบอทเปลี่ยนไป ตัวอย่างเช่นเมื่อมีการคาดการณ์โล่หรือการเปลี่ยนแปลงสุขภาพข้อความ BOT จะถูกส่ง Bot ID (BID) จะไม่ซ้ำกันภายในผู้เล่นที่เฉพาะเจาะจง
{
"Type":"BOT", // Message type
"PID":1, // Player ID
"BID":1, // Bot ID
"X":-592, // Current X position
"Y":-706, // Current Y position
"Health":12, // Current health out of 12
"Fired":false, // If the Bot fired this tick
"HitX":0, // X position of where the shot landed
"HitY":0, // Y position of where the shot landed
"Scrap":0, // Future use. Ignore.
"Shield":false // If the Bot is currently shielded.
}
ย้ายข้อความ
ข้อความ MOVE เป็นคำสั่งจากโปรแกรมเล่นของเกม (แต่คิดว่ามันเป็นคำสั่งไปยังบอท) เพียงระบุบอทที่คุณต้องการย้ายและพิกัด สันนิษฐานว่าคุณเป็นผู้บังคับบัญชาบอทของคุณเองดังนั้นจึงไม่จำเป็นต้องใช้ PID
{
"Cmd":"MOVE",
"BID":1, // Bot ID
"X":-592, // Destination X coordinate
"Y":-706, // Destination Y coordinate
}
ข้อความเป้าหมาย
ข้อความเป้าหมายบอกให้บ็อตหนึ่งของคุณกำหนดเป้าหมายบ็อตอื่น
{
"Cmd":"TARGET",
"BID":1, // Bot ID
"TPID":0, // The PID of the bot being targeted
"TBID":0, // The BID of the bot being targeted
}
ข้อความพลังงาน
ข้อความ POWER จัดสรร 12pu ที่มีให้บอทของคุณระหว่างการเคลื่อนไหวอาวุธและเกราะป้องกัน
{
"Cmd":"POWER",
"BID":1, // Bot ID
"FPow":4, // Set fire power
"MPow":4, // Set move power
"SPow":4, // Set shield power
}
การแข่งขัน
หากคุณกล้าพอที่จะสำรวจดินแดนเปลี่ยวคุณจะเข้าร่วมทัวร์นาเมนต์กำจัดคู่ต่อสู้กับทหารรับจ้างของคุณ โปรดสร้างคำตอบสำหรับการส่งของคุณและวางรหัสของคุณหรือให้ลิงก์ไปยัง repo git, gist และอื่น ๆ ภาษาใดก็ได้ แต่คุณควรถือว่าฉันรู้อะไรเกี่ยวกับภาษาและมีคำแนะนำสำหรับการใช้โปรแกรมของคุณ สร้างผลงานส่งให้ได้มากเท่าที่คุณต้องการและอย่าลืมตั้งชื่อ!
โปรแกรมเล่นตัวอย่างจะถูกรวมอยู่ในการแข่งขันดังนั้นฉันขอแนะนำให้ทดสอบบอทของคุณกับพวกเขา ทัวร์นาเมนต์จะเริ่มประมาณสองสัปดาห์หลังจากที่เราได้รับผลงานที่เป็นเอกลักษณ์สี่รายการ โชคดี!
--- Winner's Bracket ---
** Contestants will be randomly seeded **
__________________
|___________
__________________| |
|___________
__________________ | |
|___________| |
__________________| |
|________________
__________________ | |
|___________ | |
__________________| | | |
|___________| |
__________________ | |
|___________| |
__________________| |
|
--- Loser's Bracket --- |___________
|
___________ |
|___________ |
___________| |___________ |
| | |
___________| | |
|___________ |
___________ | | |
|___________ | |___________|
___________| |___________| |
| |
___________| ___________|
ข้อมูลสำคัญอื่น ๆ
- เกมทำงานที่ 12 เห็บ / วินาทีดังนั้นคุณจะไม่ได้รับข้อความบ่อยกว่าทุก ๆ 83 มิลลิวินาทีหรือมากกว่านั้น
- บอทแต่ละอันมีเส้นผ่านศูนย์กลาง 60 องศา โล่ไม่เพิ่มพื้นที่ว่าง ด้วยความแม่นยำ +/- 2.5% อัตราต่อรองของการกดปุ่มบอทที่ระยะทางที่กำหนดจะถูกแสดงด้วยกราฟนี้:
- กราฟของการชำรุดของเลเซอร์ในระยะไกลแสดงโดย:
- ความแม่นยำของบอทและการสลายตัวของเลเซอร์รวมกันเพื่อคำนวณความเสียหายเฉลี่ยต่อการยิง นั่นคือค่าเฉลี่ยดาเมจของบ็อตจะเกิดขึ้นเมื่อมันยิงจากระยะไกล กราฟนี้จะแสดงความเสียหายต่อนัด:
- เลเซอร์ของบ็อตมาครึ่งทางระหว่างกึ่งกลางของบอทกับขอบ ดังนั้นการวางบอทของคุณจะส่งผลให้เกิดกองไฟที่เป็นมิตร
- บอทศัตรูวางไข่ห่างกันประมาณ 1,404 อัน
- เกมจะจบลงหากมี 120 เห็บ (10 วินาที) ผ่านไปโดยไม่มีความเสียหายใด ๆ เกิดขึ้น
- ผู้ชนะคือผู้เล่นที่มีบอทมากที่สุดจากนั้นจะมีสุขภาพที่ดีที่สุดเมื่อจบเกม
ทำความเข้าใจกับภาพที่แสดงผล
- ผู้เล่น 1 แสดงโดยวงกลมและผู้เล่น 2 เป็นรูปหกเหลี่ยม
- สีของบ็อตแสดงถึงการจัดสรรพลังงาน สีแดงมากขึ้นหมายถึงพลังงานมากขึ้นได้รับการจัดสรรให้กับการยิง สีน้ำเงินมากกว่าหมายถึงโล่เพิ่มเติม สีเขียวมากขึ้นหมายถึงการเคลื่อนไหวมากขึ้น
- "รู" ในร่างกายของบอทแสดงถึงความเสียหาย ยิ่งหลุมยิ่งมีความเสียหายมากขึ้น
- วงกลมสีขาวรอบ ๆ บ็อตเป็นเกราะกำบัง ถ้าบอทมีเกราะป้องกันในตอนท้ายของเทิร์นมันจะปรากฏขึ้น หากโล่ถูกเปิดโดยได้รับความเสียหายจะไม่ปรากฏขึ้น
- เส้นสีแดงระหว่างบอตเป็นตัวแทนของภาพที่ถ่าย
- เมื่อบอทถูกฆ่าจะมีการ "ระเบิด" สีแดงขนาดใหญ่ขึ้น