Giới thiệu
Đối với KOTH thứ 5 của tôi, tôi đưa ra cho bạn một thử thách dựa trên trò chơi Battleship nổi tiếng với một vài vòng xoắn. Bạn sẽ chỉ huy một tàu, loại mà bạn sẽ có thể chọn giữa 5 lớp "truyền thống", nhưng bạn sẽ có thể thực hiện nhiều hành động mỗi lượt, bao gồm cả di chuyển! Điều này được chơi dưới dạng FFA (Miễn phí cho tất cả) và mục tiêu của bạn sẽ là con tàu cuối cùng đứng.
Nguyên tắc
Trò chơi được chơi theo lượt. Khi bắt đầu trò chơi, bạn sẽ phải chọn lớp tàu của mình. Sau đó mỗi lượt, người chơi sẽ có thể thực hiện một số hành động tùy thuộc vào con tàu của họ.
Trò chơi diễn ra trên lưới 2D (X, Y) có bên được xác định theo cách này:
X = 30 + numberOfPlayer
Y = 30 + numberOfPlayer
Vị trí bắt đầu của mỗi con tàu là ngẫu nhiên.
Thứ tự chơi được chọn ngẫu nhiên mỗi lượt và bạn sẽ không biết vị trí của mình trong "hàng đợi" cũng như số lượng người chơi. Trò chơi kéo dài trong 100 lượt hoặc cho đến khi chỉ còn một con tàu còn sống.
Mỗi khi bạn đâm vào tàu địch hoặc bị bắn trúng, bạn sẽ kiếm được hoặc mất điểm. Người chơi với chiến thắng điểm số cao nhất. Tiền thưởng sẽ được trao cho người chiến thắng (giá trị tùy thuộc vào số lượng người tham gia).
Bộ điều khiển cung cấp cho bạn đầu vào thông qua các đối số lệnh và chương trình của bạn phải xuất qua thiết bị xuất chuẩn.
Cú pháp
Lần lượt đầu tiên
Chương trình của bạn sẽ được gọi một lần mà không có bất kỳ đối số. Bạn sẽ phải đưa ra một số nguyên từ 1 đến 5 (bao gồm) để chọn tàu của bạn:
1
: Kẻ hủy diệt [chiều dài: 2, di chuyển / lượt: 3, bắn / lượt: 1, phạm vi: 9, mìn: 4]
Kỹ năng : Xoay tàu miễn phí (không có thời gian hồi chiêu)
2
: Tàu ngầm [chiều dài: 3, di chuyển / lượt: 2, bắn / lượt: 1, phạm vi: 5, mìn: 4]
Kỹ năng : Có thể lao / Bề mặt (xem đầu ra). Trong khi ở dưới nước, bạn chỉ có thể sử dụng các hành động "Chuyển động" và chỉ có thể được nhìn thấy khi quét. Bạn không thể bị bắn trúng, nhưng có thể nhận sát thương từ mìn.
3
: Tàu tuần dương [chiều dài: 3, di chuyển / lượt: 1, cú đánh / lượt: 2, phạm vi: 9, mìn: 2]
Kỹ năng : Có thể sửa chữa (xem đầu ra)
4
: Chiến hạm [chiều dài: 4, di chuyển / lượt: 1, phát / lượt: 3, phạm vi: 7, mìn: 1]
Kỹ năng : Có thể che chắn (xem đầu ra)
5
: Carrier [length: 5, di chuyển / lượt: 1, shot / lượt: 1, phạm vi: 7, mìn: 3]
Skill : Shots gây sát thương AOE (Area Of Effect) cho mục tiêu (sát thương văng 1 phạm vi). Nếu mục tiêu là hit với shot, lên đến 2 tế bào của này tàu cũng sẽ bị hư hỏng.
Biến
Đầu vào
Mỗi khi chương trình của bạn được gọi, nó sẽ nhận được các đối số ở định dạng này:
Round;YourPlayerId;X,Y,Direction;Hull;Moves,Shots,Mines,Cooldown;Hits,Sunken,Damage;Underwater,Shield,Scan;Map
Các vòng có 1 chỉ số.
Ví dụ đầu vào
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
Ở đây, đây là vòng thứ nhất, bạn là người chơi 8.
Tàu của bạn được định vị (X = 1, Y = 12) và hướng của bạn là hướng lên trên (0 = Trên, 1 = Phải, 2 = Dưới, 3 = Trái ).
Vỏ tàu của bạn không bị hư hại (tàu của bạn có chiều dài 3 và mỗi bit là đúng [1 = OK, 0 = Hư hỏng]). Bạn có thể di chuyển 1 lần, bắn 2 lần, còn lại 2 quả mìn và "kỹ năng" của bạn đã có sẵn (cooldown = 0).
Bạn đã không trúng bất cứ thứ gì, cũng không bị chìm tàu nào và bạn cũng không bị trúng đạn.
Bạn không ở dưới nước, khiên của bạn (nếu có) không được kích hoạt và quá trình quét của bạn cũng không.
Thêm trên bản đồ sau ...
Đầu ra
Bạn phải xuất ra một chuỗi mô tả những hành động bạn sẽ thực hiện lần lượt này. Thứ tự của các ký tự trong Chuỗi đầu ra của bạn sẽ xác định thứ tự của các hành động. Bạn có thể xuất các hành động tương tự nhiều lần nếu nó không vượt quá giới hạn tàu của bạn. Nếu một hoặc nhiều hành động không hợp lệ, mỗi hành động sẽ được coi là riêng biệt W
. Đây là danh sách các hành động có sẵn:
M
: Di chuyển 1 ô theo hướng bạn đang đối mặt (tiêu thụ 1 di chuyển)
B
: Quay lại 1 ô từ hướng bạn đang đối mặt (tiêu thụ 1 di chuyển)
C
: Xoay tàu của bạn theo chiều kim đồng hồ (tiêu thụ 1 di chuyển / miễn phí cho Kẻ hủy diệt)
K
: Xoay tàu của bạn ngược chiều kim đồng hồ (tiêu thụ 1 lần di chuyển / miễn phí cho Kẻ hủy diệt)
A
: Ram tàu của bạn theo hướng bạn đang đối mặt (chỉ hoạt động nếu một tàu khác đang chiếm giữ tế bào theo hướng bạn đang đối mặt / không di chuyển tàu của bạn / tiêu thụ tất cả các di chuyển)
F
: Bắn 1 phát vào một ô trong phạm vi (tiêu tốn 1 phát). Phải được theo sau bởi ô được nhắm mục tiêu theo định dạng này ([+ -] X [+ -]) Y / ví dụ F+2-3
:)
N
: Đặt 1 mỏ vào một ô liền kề với tàu của bạn (tiêu thụ tất cả các mũi tên và 1 mỏ). Phải được theo sau bởi ô được nhắm mục tiêu theo định dạng này ([+ -] X [+ -]) Y / ví dụ N+0+1
:)
S
: Kích hoạt quét của bạn cho lượt tiếp theo (tiêu thụ tất cả các phát bắn)
R
: Sửa chữa thân tàu bị hư hỏng gần nhất với "đầu" tàu của bạn (tiêu thụ tất cả các phát bắn, thời gian hồi chiêu = 3 lượt / Chỉ tàu tuần dương)
P
: Plunge / Surface (tiêu thụ tất cả các phát bắn, cooldown = 3 lượt, thời gian tối đa = 5 lượt / Chỉ tàu ngầm)
D
: Kích hoạt khiên của bạn ngăn chặn thiệt hại tiếp theo trong lượt tiếp theo của bạn (tiêu thụ tất cả các phát bắn, cooldown = 3 / Chỉ chiến hạm)
W
: Chờ (không làm gì)
Làm rõ : "Tiêu thụ tất cả các động tác / cú đánh" có nghĩa là bạn chỉ có thể sử dụng hành động này nếu bạn chưa sử dụng bất kỳ động tác / cú đánh nào trước khi đến lượt này.
Ví dụ đầu ra
MF+9-8CM
: Di chuyển 1 ô, sau đó bắn vào ô có vị trí tương đối với "đầu" tàu của bạn là (targetX = X + 9, targetY = Y - 8), quay theo chiều kim đồng hồ và cuối cùng di chuyển lại 1 ô.
Trò chơi
Cái lưới sắt
Đây là một lưới ví dụ (33 x 13) trong đó 3 người chơi được đặt:
███████████████████████████████████
█ █
█ 00 █
█ 2 █
█ 2 █
█ 2 █
█ █
█ 11111 █
█ M █
█ █
█ █
█ █
█ █
█ █
███████████████████████████████████
Như chúng ta có thể thấy, cũng có một Mỏ M
ngay bên cạnh người chơi 1.
Hãy đưa người chơi 2 để hiểu vị trí và hướng:
Vị trí của người chơi 2 là X = 3, Y = 4, Direction = 3. Vì hướng của nó là "Dưới cùng", phần còn lại của "tế bào tàu" của anh ta được định vị "trên" đầu "của nó (X = 3, Y = 3) & (X = 3, Y = 2)
Bản đồ
Đối số cuối cùng mà mỗi người chơi nhận được là bản đồ "của riêng họ". Theo mặc định, một con tàu phát hiện mọi thứ trong phạm vi 5 ô , nhưng nó có thể kích hoạt Quét để tăng phạm vi này lên 9 .
Đối số luôn dài 361 (19 x 19) ký tự. Nó đại diện cho hình vuông xoay quanh "đầu" con tàu của bạn, trong đó mỗi ký tự tương ứng với một yếu tố được xác định theo cách này:
.
: Tế bào rỗng
O
: tàu của bạn
M
: Mines
X
: Wall (tế bào ra khỏi bản đồ)
U
: Unknown (sẽ được tiết lộ bởi một quét)
A
: Enemy tàu tế bào bị hư hại
B
: Enemy tàu bị hư hỏng tế bào
C
: Enemy tàu dưới nước tế bào bị hư hại (chỉ nhìn thấy với một máy quét)
D
: Kẻ thù bị hủy hoại tế bào dưới nước (chỉ nhìn thấy khi quét)
W
: Đống đổ nát (tàu chết)
Chuỗi này bao gồm 19 ký tự của dòng đầu tiên, tiếp theo là 19 ký tự của dòng thứ hai ... cho đến dòng thứ 19.
Hãy xem người chơi 2 nhận được gì và không quét (ngắt dòng để hiểu rõ hơn, nhưng không gửi cho người chơi):
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
Mỏ
Các mỏ được kích hoạt khi một con tàu di chuyển đến một tế bào bị chiếm giữ bởi một mỏ hoặc khi một phát súng được bắn vào mỏ. Mỏ không thể được kích hoạt với hành động "Ram".
Mỏ gây sát thương AOE (sát thương văng 1 phạm vi) cho mọi người, ngay cả với người đặt mìn. Mỏ có thể kích hoạt vụ nổ "chuỗi" nếu một mỏ khác nằm trong bán kính của vụ nổ.
Xoay
Các vòng quay là các đối xứng trung tâm tập trung vào "đầu" của con tàu. Xoay sẽ chỉ kích hoạt một quả mìn nếu nó được đặt ở "vị trí đích" (bạn sẽ không kích hoạt mìn theo hình vòng cung.
Khu vực có hiệu lực
Sát thương văng 1 phạm vi (đối với mìn và đạn của Người bắn) được xác định bởi hình vuông 3x3 (9 ô) tập trung vào phát bắn / nổ ban đầu (x, y). Nó đạt các tọa độ đó:[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]
Chấm điểm
Điểm được xác định theo công thức này:
Score = Hits + (Sunken x 5) - Damage taken - (Alive ? 0 : 10)
trong đó ::
hits
số lần tấn công vào tàu địch, bằng vụ nổ Ram, Shot hoặc Mine (1 lần tấn công bởi tế bào tàu địch bị hư hại, bao gồm cả vụ nổ chuỗi)
sunken
: số lần "tấn công cuối cùng" vào tàu địch khiến nó bị chìm
damage
: số lượng lượt truy cập nhận được (không bị giảm bởi Sửa chữa, nhưng bị ngăn chặn bởi Khiên)
alive
: kiểm tra xem con tàu của bạn còn sống ở cuối (ít nhất 1 ô thân tàu không bị hư hại)
Bộ điều khiển
Bạn có thể tìm thấy bộ điều khiển trên GitHub . Nó cũng chứa hai mẫu, được viết bằng Java. Để làm cho nó chạy, hãy xem dự án và mở nó trong Java IDE của bạn. Điểm vào trong phương thức chính của Trò chơi lớp. Yêu cầu Java 8.
Để thêm bot, trước tiên, bạn cần phiên bản được biên dịch cho Java (tệp. Class) hoặc nguồn cho các ngôn ngữ được diễn giải. Đặt chúng trong thư mục gốc của dự án. Sau đó, tạo một lớp Java mới trong gói trình phát (bạn có thể lấy ví dụ về các bot đã có). Lớp này phải triển khai Trình phát để ghi đè phương thức String getCmd (). Chuỗi trả về là lệnh shell để chạy bot của bạn. Ví dụ, bạn có thể làm cho bot Ruby hoạt động với lệnh này: return "C: \ Ruby \ bin \ ruby.exe MyBot.rb";. Cuối cùng, thêm bot trong mảng người chơi ở đầu lớp Trò chơi.
Quy tắc
- Bots không nên được viết để đánh bại hoặc hỗ trợ các bot cụ thể khác.
- Viết vào các tập tin được cho phép. Vui lòng viết thư cho "mineubmissionname.txt", thư mục sẽ được xóa trước khi trò chơi bắt đầu. Các nguồn lực bên ngoài khác không được phép.
- Trình của bạn có 1 giây để trả lời.
- Cung cấp các lệnh để biên dịch và chạy đệ trình của bạn.
- Bạn có thể viết nhiều bài nộp
Ngôn ngữ được hỗ trợ
Tôi sẽ thử và hỗ trợ mọi ngôn ngữ, nhưng nó cần có sẵn trực tuyến miễn phí. Vui lòng cung cấp hướng dẫn để cài đặt nếu bạn không sử dụng ngôn ngữ "chính thống".
Ngay bây giờ, tôi có thể chạy: 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]