Hãy có một cuộc chiến xe tăng!
Lấy cảm hứng một phần từ Tiêu diệt chúng với Lazers
Mục tiêu
Nhiệm vụ của bạn là điều khiển một chiếc xe tăng. Di chuyển xung quanh và bắn các xe tăng và chướng ngại vật khác trong chiến trường 2D. Người đứng cuối xe tăng sẽ là người chiến thắng!
Định dạng bản đồ
Xe tăng của bạn sẽ được trên một lĩnh vực 2D dựa trên một n
bằng n
mạng lưới các ô vuông đơn vị. Tôi sẽ quyết định những gì n
dựa trên số lượng bài nộp. Mỗi ô vuông chỉ có thể chứa một trong số:
- Một chiếc xe tăng
- Một cái cây
- Một hòn đá
- Bức tường
- Không có gì
Tất cả các chướng ngại vật và xe tăng hoàn toàn lấp đầy không gian của chúng, và chúng chặn tất cả các phát bắn trúng chúng làm hỏng mọi thứ hơn nữa.
Dưới đây là một ví dụ về trường có #
= tank; T
= cây; R
= đá; W
= tường; .
= không có gì với n
= 10
.....#....
..T....R..
WWW...WWWW
W......T..
T...R...Ww
W...W.....
W....W...T
WWWWWW...R
W.........
WWWWWWRT..
Các tọa độ có định dạng x, y
trong đó x
tăng từ trái sang phải và y
tăng từ dưới lên trên. Không gian phía dưới bên trái có tọa độ 0, 0
. Mỗi xe tăng có thể di chuyển đến bất kỳ không gian trống nào và bắn theo bất kỳ hướng nào.
Bản đồ động
Xe tăng của bạn không cần phải bắn các xe tăng khác! Nếu nó bắn một cái gì đó trên bản đồ, mọi thứ có thể xảy ra.
- Nếu một bức tường bị bắn vào, nó sẽ bị phá hủy sau một số lần bắn, từ 1 đến 4
- Nếu một cây bị bắn vào, nó sẽ bị phá hủy ngay lập tức
- Nếu một hòn đá bị bắn vào, cú bắn sẽ vượt qua nó và làm hỏng thứ tiếp theo nó bắn trúng
Một khi một cái gì đó bị phá hủy, nó không còn trên bản đồ nữa (nó sẽ được thay thế bằng không có gì). Nếu một phát bắn phá hủy một chướng ngại vật, nó sẽ bị chặn và sẽ không gây sát thương gì thêm trên đường đi của nó.
Động lực học xe tăng
Mỗi bể bắt đầu bằng life
= 100. Mỗi phát bắn vào một chiếc xe tăng sẽ giảm 20-30 life
dựa trên khoảng cách. Điều này có thể được tính bằng delta_life=-30+(shot_distance*10/diagonal_map_length)
(nơi diagonal_map_length
là (n-1)*sqrt(2)
). Ngoài ra, mỗi bể tái sinh 1 life
mỗi lượt.
Biến
Một số vòng sẽ được chạy (tôi sẽ quyết định khi tôi có bài dự thi). Vào đầu mỗi vòng, một bản đồ sẽ được tạo ngẫu nhiên và xe tăng sẽ được đặt trên đó ở các vị trí trống ngẫu nhiên. Trong mỗi vòng, mỗi xe tăng sẽ được trao một lượt, theo bất kỳ thứ tự tùy ý nào. Sau khi mỗi chiếc xe tăng được đưa ra một lượt, chúng sẽ được quay lại theo thứ tự tương tự. Vòng đấu tiếp tục cho đến khi chỉ còn một chiếc xe tăng. Chiếc xe tăng đó sẽ là người chiến thắng, và họ sẽ nhận được 1 điểm. Trò chơi sau đó sẽ đi vào vòng tiếp theo.
Khi tất cả các vòng đã được chạy, tôi sẽ đăng điểm cho câu hỏi này.
Trong lượt của một chiếc xe tăng, nó có thể làm một trong những điều sau đây
- Di chuyển tối đa 3 không gian theo một hướng, theo chiều ngang hoặc chiều dọc. Nếu xe tăng bị chặn bởi một chướng ngại vật hoặc xe tăng khác, nó sẽ được di chuyển càng xa càng tốt mà không đi qua chướng ngại vật hoặc xe tăng.
- Chụp theo một số hướng, được biểu thị bằng một góc điểm nổi theo độ. Trục x của không gian cục bộ của bể của bạn (theo chiều ngang từ trái sang phải, còn gọi là hướng đông hoặc
TurnAction.Direction.EAST
) là 0deg và các góc tăng ngược chiều kim đồng hồ. Ảnh chụp không chính xác và góc chụp thực tế có thể lớn hơn hoặc 5 độ so với góc bạn chọn. - Không làm gì cả.
Lần lượt không bị giới hạn về thời gian, nhưng điều này không có nghĩa là bạn có thể cố tình lãng phí thời gian để treo mọi thứ lên.
Đệ trình / Giao thức
Mỗi chương trình được gửi sẽ kiểm soát một xe tăng trên sân. Chương trình điều khiển là bằng Java, vì vậy bây giờ các chương trình của bạn cần phải ở trong Java (tôi có thể sẽ viết một trình bao bọc cho các ngôn ngữ khác tại một số điểm hoặc bạn có thể tự viết).
Các chương trình của bạn sẽ thực hiện Tank
giao diện, có các phương pháp sau:
public interface Tank {
// Called when the tank is placed on the battlefield.
public void onSpawn(Battlefield field, MapPoint position);
// Called to get an action for the tank on each turn.
public TurnAction onTurn(Battlefield field, MapPoint position, float health);
// Called with feedback after a turn is executed.
// newPosition and hit will be populated if applicable.
public void turnFeedback(MapPoint newPosition, FieldObjectType hit);
// Called when the tank is destroyed, either by another tank,
// or because the tank won. The won parameter indicates this.
public void onDestroyed(Battlefield field, boolean won);
// Return a unique name for your tank here.
public String getName();
}
Các Battlefield
lớp có chứa một mảng 2D của các đối tượng ( Battlefield.FIELD_SIZE
bằng Battlefield.FIELD_SIZE
) đại diện cho những thứ trên chiến trường. Battlefield.getObjectTypeAt(...)
sẽ cung cấp một FieldObjectType
cho đối tượng tại các tọa độ quy định (một trong những FieldObjectType.ROCK
, FieldObjectType.TREE
, FieldObjectType.TANK
, FieldObjectType.WALL
, hoặc FieldObjectType.NOTHING
). Nếu bạn cố gắng đưa một đối tượng ra khỏi phạm vi của bản đồ (tọa độ <0 hoặc> = Battlefield.FIELD_SIZE
) thì IllegalArgumentException
sẽ bị ném.
MapPoint
là một lớp để chỉ định các điểm trên bản đồ. Sử dụng MapPoint.getX()
và MapPoint.getY()
truy cập tọa độ.
EDIT: Một số phương pháp hữu ích đã được thêm vào: MapPoint.distanceTo(MapPoint)
, MapPoint.angleBetween(MapPoint)
, Battlefield.find(FieldObjectType)
, và TurnAction.createShootActionRadians(double)
theo đề nghị của Wasmoo .
Thông tin thêm có thể được tìm thấy trong javadocs, xem phần bên dưới.
Tất cả các lớp (API công khai) đều nằm dưới gói zove.ppcg.tankwar
.
Chương trình điều khiển
Có thể tìm thấy toàn bộ nguồn và javadocs của chương trình điều khiển và API xe tăng trên repo GitHub của tôi: https://github.com/Hungary-Dude/TankWarControl
Vui lòng gửi yêu cầu kéo và / hoặc nhận xét nếu bạn thấy lỗi hoặc muốn cải thiện.
Tôi đã viết hai chương trình xe tăng mẫu, RandomMoveTank
và RandomShootTank
(cái tên nói lên tất cả).
Để chạy xe tăng của bạn, hãy thêm lớp xe tăng (tên gói + tên lớp) đủ điều kiện của bạn vào tanks.list
(một lớp trên mỗi dòng), chỉnh sửa cài đặt nếu cần trong zove.ppcg.tankwar.Control
(bật trễ, có hay không hiển thị đại diện GUI của trường, v.v.), và chạy zove.ppcg.tankwar.Control
. Đảm bảo có ít nhất 2 xe tăng trong danh sách, hoặc kết quả không được xác định. (Sử dụng các bể mẫu nếu cần thiết).
Các chương trình của bạn sẽ được chạy trên máy của tôi theo chương trình điều khiển này. Tôi sẽ bao gồm một liên kết đến nguồn khi tôi viết nó. Hãy đề nghị chỉnh sửa nguồn.
Quy tắc
- Bài dự thi của bạn phải tuân theo các nguyên tắc trên
- Các chương trình của bạn không được truy cập hệ thống tập tin, mạng hoặc cố gắng tấn công máy của tôi dưới bất kỳ hình thức nào
- Các chương trình của bạn không được phép khai thác chương trình kiểm soát của tôi để gian lận
- Không trolling (chẳng hạn như cố ý làm cho chương trình của bạn lãng phí thời gian để treo mọi thứ lên)
- Bạn có thể có nhiều hơn một lần gửi
- Hãy cố gắng sáng tạo với các bài nộp!
- Tôi bảo lưu quyền cho phép hoặc không cho phép các chương trình tùy ý
Chúc may mắn!
CẬP NHẬT: Sau khi sửa lỗi dịch chuyển tức thời trên tường và thực hiện tái tạo, tôi đã chạy các bài nộp hiện tại trong 100 vòng vớiBattlefield.FIELD_SIZE = 30
CẬP NHẬT 2: Tôi đã thêm bài đăng mới, RunTank, sau khi đánh lừa Groovy một chút ...
Kết quả cập nhật:
+-----------------+----+
| RandomMoveTank | 0 |
| RandomShootTank | 0 |
| Bouncing Tank | 4 |
| Richard-A Tank | 9 |
| Shoot Closest | 19 |
| HunterKiller 2 | 22 |
| RunTank | 23 |
| Dodge Tank | 24 |
+-----------------+----+
Hiện tại xe tăng tái sinh 1 cuộc sống mỗi lượt. Có nên tăng không?
MapPoint
'sx
vày
floats
? Họ không nênints
?