บทนำ
สำหรับ KOTH ที่ 5 ของฉันฉันขอเสนอความท้าทายให้กับคุณตามเกมBattleship ที่เป็นที่รู้จักและมีการบิดเล็กน้อย คุณจะสั่งเรือหนึ่งลำซึ่งมีประเภทที่คุณสามารถเลือกได้ระหว่าง 5 คลาส "ประเพณี" แต่คุณจะสามารถดำเนินการหลายอย่างในแต่ละเทิร์นรวมถึงการเคลื่อนย้าย! สิ่งนี้เล่นเป็น FFA (ฟรีสำหรับทุกคน) และเป้าหมายของคุณคือการเป็นเรือรบลำสุดท้าย
หลัก
เกมดังกล่าวเป็นแบบเลี้ยว ในช่วงเริ่มต้นของเกมคุณจะต้องเลือกคลาสของเรือของคุณ จากนั้นในแต่ละเทิร์นผู้เล่นจะสามารถดำเนินการได้หลายอย่างขึ้นอยู่กับเรือของพวกเขา
เกมดังกล่าวเกิดขึ้นบนกริด 2 มิติ (X, Y) ที่ด้านข้างถูกกำหนดด้วยวิธีนี้:
X = 30 + numberOfPlayer
Y = 30 + numberOfPlayer
ตำแหน่งเริ่มต้นของเรือแต่ละลำจะสุ่ม
ลำดับการเล่นจะถูกสุ่มในแต่ละเทิร์นและคุณจะไม่ทราบตำแหน่งของคุณใน "คิว" หรือจำนวนผู้เล่น เกมดังกล่าวใช้เวลา100 รอบหรือจนกว่าจะมีเรือรบเพียงลำเดียวที่ยังมีชีวิตอยู่
ทุกครั้งที่คุณโจมตีเรือศัตรูหรือโดนโจมตีคุณจะได้รับหรือเสียคะแนน ผู้เล่นที่มีคะแนนสูงสุดจะเป็นผู้ชนะ รางวัลจะมอบให้กับผู้ชนะ (มูลค่าขึ้นอยู่กับจำนวนผู้เข้าร่วม)
คอนโทรลเลอร์จะให้อินพุตกับคุณผ่านอาร์กิวเมนต์ของคำสั่งและโปรแกรมของคุณจะต้องเอาต์พุตผ่าน stdout
วากยสัมพันธ์
เทิร์นแรก
โปรแกรมของคุณจะถูกเรียกใช้ครั้งเดียวโดยไม่มีข้อโต้แย้งใด ๆ คุณจะต้องใช้จำนวนเต็มตั้งแต่ 1 ถึง 5 (รวม) เพื่อเลือกเรือของคุณ:
1
: Destroyer [ความยาว: 2, ย้าย / เทิร์น: 3, นัด / เทิร์น: 1, ช่วง: 9, เหมือง: 4]
ทักษะ : การหมุนของเรือฟรี (ไม่มีคูลดาวน์)
2
: Submarine [ความยาว: 3, ย้าย / เทิร์น: 2, นัด / เทิร์น: 1, ช่วง: 5, เหมือง: 4]
ทักษะ : Can Plunge / Surface (ดูผลลัพธ์) ในขณะที่ใต้น้ำคุณสามารถใช้การกระทำ "การเคลื่อนไหว" เท่านั้นและสามารถมองเห็นได้ด้วยการสแกน คุณไม่สามารถถูกยิงได้ แต่สามารถรับความเสียหายจากเหมืองได้
3
: Cruiser [ความยาว: 3, ย้าย / เทิร์น: 1, นัด / เทิร์น: 2, ช่วง: 9, เหมือง: 2]
ทักษะ : Can Repair (ดูผลลัพธ์)
4
: Battleship [length: 4, ย้าย / เทิร์น: 1, นัด / เทิร์น: 3, ช่วง: 7, เหมือง: 1]
ทักษะ : Can Shield (ดูผลลัพธ์)
5
: ผู้ให้บริการ [ความยาว: 5, ย้าย / เทิร์น: 1, นัด / เทิร์น: 1, ช่วง: 7, เหมือง: 3]
ทักษะ : ช็อตสร้างความเสียหาย AOE (Area Of Effect) แก่เป้าหมาย (สร้างความเสียหาย 1 ช่วง) ถ้าเป้าหมายถูกตีด้วยการยิงได้ถึง 2 เซลล์นี้เรือยังจะได้รับความเสียหาย
ย้อนกลับ
อินพุต
แต่ละครั้งที่โปรแกรมของคุณถูกเรียกมันจะได้รับข้อโต้แย้งในรูปแบบนี้:
Round;YourPlayerId;X,Y,Direction;Hull;Moves,Shots,Mines,Cooldown;Hits,Sunken,Damage;Underwater,Shield,Scan;Map
การปัดเศษเป็น 1 การจัดทำดัชนี
ตัวอย่างอินพุต
1;8;1,12,0;111;1,2,2,0;0,0,0;0,0,0;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.O.....UUUUUUUUXXXX.O.....UUUUUUUUXXXX.O.....UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
นี่คือรอบที่ 1 คุณเป็นผู้เล่น 8
เรือของคุณอยู่ในตำแหน่ง (X = 1, Y = 12) และทิศทางของคุณไปทางด้านบน (0 = ด้านบน, 1 = ขวา, 2 = ด้านล่าง, 3 = ซ้าย )
ลำเรือของคุณไม่เสียหาย (เรือของคุณมีความยาว 3 และแต่ละบิตเป็นจริง [1 = ตกลง, 0 = เสียหาย]) คุณสามารถย้าย 1 ครั้งยิง 2 ครั้งเหลือ 2 นาทีและ "ทักษะ" ของคุณพร้อมใช้งาน (คูลดาวน์ = 0)
คุณไม่ได้ตีอะไรเลยและไม่จมเรือและคุณก็ไม่ได้ถูกตีเช่นกัน
คุณไม่ได้อยู่ใต้โล่ของคุณ (ถ้ามี) ไม่เปิดใช้งานและการสแกนของคุณก็ไม่เหมือนกัน
เพิ่มเติมบนแผนที่ในภายหลัง ...
เอาท์พุต
คุณต้องแสดงผลเป็นสตริงซึ่งอธิบายถึงการกระทำที่คุณจะทำในเทิร์นนี้ คำสั่งของตัวละครในเอาท์พุทสตริงของคุณจะกำหนดคำสั่งของการกระทำ คุณสามารถแสดงผลการกระทำเดียวกันหลาย ๆ ครั้งหากไม่เกินขีด จำกัด ของเรือของคุณ W
หากหนึ่งหรือการกระทำที่ไม่ถูกต้องหลายแต่ละคนจะแยกกันถือได้ว่าเป็น นี่คือรายการของการกระทำที่มี:
M
: เคลื่อนย้าย 1 เซลล์ในทิศทางที่คุณกำลังเผชิญ (กิน 1 ย้าย)
B
: ย้อนกลับ 1 เซลล์จากทิศทางที่คุณกำลังเผชิญ (กิน 1 ย้าย)
C
: หมุนเรือของคุณตามเข็มนาฬิกา (กิน 1 ย้าย / ฟรีสำหรับ Destroyers)
K
: หมุนเรือของคุณ ทวนเข็มนาฬิกา (กิน 1 ครั้ง / เป็นอิสระสำหรับเรือพิฆาต)
A
: กระแทกเรือของคุณไปในทิศทางที่คุณกำลังเผชิญ (ใช้งานได้เฉพาะเมื่อเรือลำอื่นครอบครองเซลล์ในทิศทางที่คุณหันหน้าไป / ไม่ย้ายเรือของคุณ / กินการเคลื่อนไหวทั้งหมด)
F
: ยิง 1 ช็อตไปยังเซลล์ที่อยู่ในระยะ (กิน 1 ช็อต) จะต้องปฏิบัติตามโดยเซลล์ที่ระบุไว้ในรูปแบบนี้ ([+ -] X [+ -]) Y / ตัวอย่างเช่นF+2-3
)
N
: สถานที่ 1 เหมืองกับเซลล์ที่อยู่ติดกับเรือของคุณ (ใช้ภาพทั้งหมดและ 1 เหมือง) จะต้องปฏิบัติตามโดยเซลล์ที่ระบุไว้ในรูปแบบนี้ ([+ -] X [+ -]) Y / ตัวอย่างเช่น: N+0+1
)
S
: เปิดใช้งานการสแกนของคุณในเทิร์นถัดไป (กินทุกช็อต)
R
: ซ่อมตัวถังที่ชำรุดใกล้กับ "หัว" ของเรือของคุณ (กินทุกช็อต, คูลดาวน์ = 3 รอบ / ครุยเซอร์เท่านั้น)
P
: กระโดด / พื้นผิว คูลดาวน์ = 3 รอบระยะเวลาสูงสุด = 5 เทิร์น / เรือดำน้ำเท่านั้น)
D
: เปิดใช้งานโล่ป้องกันความเสียหายต่อไปในเทิร์นถัดไปของคุณ (กินกระสุนทั้งหมดคูลดาวน์ = 3 / เรือรบเท่านั้น)
W
: รอ (ไม่ทำอะไรเลย)
การชี้แจง : "ใช้การเคลื่อนไหว / การยิงทั้งหมด" หมายความว่าคุณสามารถใช้การกระทำนี้ได้หากคุณไม่ได้ใช้การเคลื่อนไหว / การยิงใด ๆ ของคุณมาก่อนระหว่างเทิร์นนี้
ตัวอย่างผลลัพธ์
MF+9-8CM
: ย้าย 1 เซลล์จากนั้นจึงยิงบนเซลล์ที่มีตำแหน่งสัมพันธ์กับ "หัว" ของเรือของคุณคือ (targetX = X + 9, targetY = Y - 8), หมุนตามเข็มนาฬิกาและเคลื่อนที่ 1 เซลล์อีกครั้ง
เพลย์
ตาราง
นี่คือตารางตัวอย่าง (33 x 13) ที่มีผู้เล่น 3 คน:
███████████████████████████████████
█ █
█ 00 █
█ 2 █
█ 2 █
█ 2 █
█ █
█ 11111 █
█ M █
█ █
█ █
█ █
█ █
█ █
███████████████████████████████████
อย่างที่เราเห็นมีเหมืองM
อยู่ข้างผู้เล่น 1
ให้ผู้เล่น 2 เข้าใจการวางตำแหน่งและทิศทาง:
ตำแหน่งของผู้เล่น 2 คือ X = 3, Y = 4, ทิศทาง = 3 เนื่องจากทิศทางของมันคือ "ด้านล่าง" ส่วนที่เหลือของ "เซลล์เรือ" ของเขานั้นถูกวางตำแหน่ง "เหนือ" หัว "ของมัน" (X = 3, Y = 3) & (X = 3, Y = 2)
แผนที่ของผู้เล่น
อาร์กิวเมนต์สุดท้ายที่ผู้เล่นแต่ละคนได้รับคือแผนที่ "ของตนเอง" โดยค่าเริ่มต้นเรือตรวจจับทุกอย่างในช่วง 5 เซลล์แต่ก็สามารถเปิดใช้งานสแกนที่จะเพิ่มช่วงไป9
อาร์กิวเมนต์มีความยาวอักขระ 361 (19 x 19) เสมอ มันหมายถึงสแควร์ที่อยู่กึ่งกลางรอบ "หัว" ของเรือของคุณซึ่งตัวละครแต่ละตัวสอดคล้องกับองค์ประกอบที่กำหนดด้วยวิธีนี้:
.
: เซลล์ว่างเปล่า
O
: เรือของคุณ
M
: เหมืองแร่
X
: ผนัง (เซลล์จากแผนที่)
U
: ไม่ทราบ (จะถูกเปิดเผยโดยการสแกน)
A
: ศัตรูส่งเซลล์ที่ไม่เสียหาย
B
: ศัตรูเรือที่ได้รับความเสียหาย
C
: ศัตรูส่งเซลล์ที่ไม่เสียหายใต้น้ำ
D
: ศัตรูทำลายเซลล์ใต้น้ำ (เห็นได้เฉพาะเมื่อสแกน)
W
: ซากปรักหักพัง (เรือตาย)
สตริงประกอบด้วยอักขระ 19 ตัวของบรรทัดแรกตามด้วย 19 อักขระของบรรทัดที่สอง ... จนกระทั่งถึงบรรทัดที่ 19
ให้ดูที่สิ่งที่ผู้เล่น 2 ได้รับโดยมีและไม่มีการสแกน (ตัวแบ่งบรรทัดเพื่อความเข้าใจที่ดีขึ้น แต่ไม่ส่งถึงผู้เล่น):
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXX.............
XXXXXX.......AA....
XXXXXX...O.........
XXXXXX...O.........
XXXXXX...O.........
XXXXXX.............
XXXXXX.......AAAAA.
XXXXXX........M....
XXXXXX.............
XXXXXX.............
XXXXXX.............
XXXXXX.............
XXXXXX.............
XXXXXXXXXXXXXXXXXXX
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUXXXXXXXXXXXUUUU
UUUUXX.........UUUU
UUUUXX.......AAUUUU
UUUUXX...O.....UUUU
UUUUXX...O.....UUUU
UUUUXX...O.....UUUU
UUUUXX.........UUUU
UUUUXX.......AAUUUU
UUUUXX........MUUUU
UUUUXX.........UUUU
UUUUXX.........UUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
การทำเหมืองแร่
เหมืองจะถูกกระตุ้นเมื่อเรือเคลื่อนที่ไปยังเซลล์ที่ครอบครองโดยเหมืองหรือเมื่อมีการยิงจากเหมือง เหมืองไม่สามารถถูกกระตุ้นได้ด้วยแอ็คชั่น "Ram"
ทุ่นระเบิดทำดาเมจ AOE (สาดความเสียหาย 1 ช่วง) ให้กับทุกคนแม้แต่กับผู้ที่วางทุ่นระเบิด การทำเหมืองแร่สามารถก่อให้เกิดการระเบิด "โซ่" ถ้าระเบิดอื่นอยู่ในรัศมีของการระเบิด
ผลัด
การหมุนเป็นสมมาตรกลางซึ่งมีศูนย์กลางที่ "หัว" ของเรือ การหมุนจะเรียกเฉพาะเหมืองถ้าวางบน "ตำแหน่งปลายทาง" (คุณจะไม่เปิดทุ่นระเบิดในส่วนโค้ง
พื้นที่ของผลกระทบ
1 ช่วงดาเมจดาเมจ (สำหรับเหมืองและช็อตของตัวแทนจำหน่าย) ถูกกำหนดโดยตาราง 3x3 (9 เซลล์) โดยมีศูนย์กลางที่การยิง / การระเบิดเริ่มต้น (x, y) มันนิยมพิกัดเหล่านั้น:[x - 1; y - 1],[x - 1; y],[x - 1; y + 1],[x; y - 1],[x; y],[x; y + 1],[x + 1; y - 1],[x + 1; y],[x + 1; y + 1]
เกณฑ์การให้คะแนน
การให้คะแนนถูกกำหนดโดยสูตรนี้:
Score = Hits + (Sunken x 5) - Damage taken - (Alive ? 0 : 10)
ที่::
hits
จำนวนการโจมตีบนเรือข้าศึกไม่ว่าจะเป็น Ram, Shot หรือ Mine bomb (1 ครั้งถูกโจมตีโดยเซลล์เรือข้าศึกที่เสียหายรวมถึงการระเบิดโซ่)
sunken
: จำนวน "การโจมตีครั้งสุดท้าย" บนเรือศัตรูที่ทำให้จม
damage
: จำนวน จำนวนครั้งที่ได้รับ (ไม่ลดลงจากการซ่อม แต่ถูกป้องกันโดย Shield)
alive
: ตรวจสอบว่าเรือรบของคุณยังมีชีวิตอยู่ในตอนท้าย (อย่างน้อย 1 ลำตัวถังที่ไม่เสียหาย)
ตัวควบคุม
คุณสามารถค้นหาตัวควบคุมบนGitHub นอกจากนี้ยังมีบอตสองตัวอย่างที่เขียนด้วย Java เพื่อให้มันทำงานให้ตรวจสอบโครงการและเปิดใน Java IDE ของคุณ จุดเริ่มต้นในวิธีการหลักของเกมคลาส ต้องการ Java 8
ในการเพิ่มบ็อตอันดับแรกคุณต้องใช้เวอร์ชันรวบรวมสำหรับ Java (ไฟล์. classclass) หรือแหล่งข้อมูลสำหรับภาษาที่ตีความ วางไว้ในโฟลเดอร์รูทของโครงการ จากนั้นสร้างคลาส Java ใหม่ในแพ็คเกจผู้เล่น (คุณสามารถนำตัวอย่างบนบอทที่มีอยู่แล้ว) คลาสนี้ต้องใช้ Player เพื่อแทนที่เมธอด String getCmd () String ที่ส่งคืนคือคำสั่ง shell เพื่อรันบ็อตของคุณ ตัวอย่างเช่นคุณสามารถทำให้ Ruby bot ทำงานกับคำสั่งนี้: return "C: \ Ruby \ bin \ ruby.exe MyBot.rb"; ในที่สุดเพิ่ม bot ในอาร์เรย์ผู้เล่นที่ด้านบนของชั้นเกม
กฎระเบียบ
- ไม่ควรเขียนบอทเพื่อเอาชนะหรือสนับสนุนบอทอื่น ๆ ที่เฉพาะเจาะจง
- อนุญาตให้เขียนไฟล์ได้ โปรดเขียนถึง "yoursubmissionname.txt" โฟลเดอร์จะถูกทำให้ว่างเปล่าก่อนที่เกมจะเริ่ม ทรัพยากรภายนอกอื่น ๆ ไม่ได้รับอนุญาต
- ข้อมูลที่คุณส่งมี 1 วินาทีเพื่อตอบสนอง
- ให้คำสั่งเพื่อรวบรวมและเรียกใช้การส่งของคุณ
- คุณสามารถเขียนหลายรายการ
ภาษาที่รองรับ
ฉันจะพยายามและสนับสนุนทุกภาษา แต่ต้องออนไลน์ให้ฟรี โปรดให้คำแนะนำสำหรับการติดตั้งหากคุณไม่ได้ใช้ภาษา "หลัก"
ณ ตอนนี้ฉันสามารถเรียกใช้: Java 6-7-8, PHP, Ruby, Perl, Python 2-3, Lua, R, node.js, Haskell, Kotlin, C ++ 11
[x - 1; y - 1],[x - 1; y],[x - 1; y + 1],[x; y - 1],[x; y],[x; y + 1],[x + 1; y - 1],[x + 1; y],[x + 1; y + 1]