Các nền tương lai
Trong năm 2017, bạn và đối thủ của bạn sẽ đối đầu trong một cuộc đấu súng tương lai, nơi chỉ có một người có thể sống sót. Là bạn đủ kinh nghiệm để đánh bại đối thủ của bạn? Bây giờ là lúc để đánh bóng kỹ năng súng của bạn bằng ngôn ngữ lập trình yêu thích của bạn và chiến đấu chống lại tất cả các tỷ lệ cược!
Kết quả giải đấu
Trận đấu này đã kết thúc vào sáng UTC của Feburary 2 nd , 2017. Nhờ các thí sinh của chúng tôi, chúng tôi đã có một giải đấu tương lai thú vị!
MontePlayer là người chiến thắng cuối cùng sau một trận chiến gần với CBetaPlayer và StudiousPlayer. Ba đấu sĩ guen hàng đầu đã chụp một bức ảnh kỷ niệm:
MontePlayer - by TheNumberOne
+------------+
CBetaPlayer | | - by George V. Williams
+------------+ # 1 | StudiousPlayer - by H Walters
| +----------------+
| # 2 # 3 |
+------------------------------------------+
The Futurustic Gun Duel @ PPCG.SE 2017
Xin chúc mừng những người chiến thắng! Bảng xếp hạng chi tiết được nhìn thấy gần cuối bài này.
Hướng dẫn chung
- Truy cập kho lưu trữ chính thức cho mã nguồn được sử dụng trong giải đấu này.
- Các mục C ++: vui lòng kế thừa
Player
lớp. - Các mục không phải C ++: chọn một giao diện trong phần Giao diện cho các lần gửi Không C ++ .
- Hiện tại cho phép các ngôn ngữ không C ++: Python 3, Java.
Các cuộc đấu tay đôi
- Mỗi người chơi bắt đầu với một khẩu súng không nạp có thể nạp một lượng đạn vô hạn.
- Mỗi lượt, người chơi sẽ đồng thời chọn một trong các hành động sau:
0
- Nạp 1 đạn vào súng.1
- Bắn một viên đạn vào đối thủ; Chi phí 1 đạn nạp.2
- Bắn một tia plasma vào đối thủ; Chi phí 2 đạn nạp.-
- Bảo vệ viên đạn đến bằng lá chắn kim loại.=
- Bảo vệ chùm plasma tới bằng cách sử dụng bộ làm lệch nhiệt.
- Nếu cả hai người chơi sống sót sau lượt thứ 100 , cả hai đều kiệt sức đến chết, kết quả là hòa .
Một người chơi thua cuộc đấu súng nếu họ
- Đã không sử dụng lá chắn kim loại để bảo vệ một viên đạn đến.
- Đã KHÔNG sử dụng làm lệch nhiệt để bảo vệ một plasma đến.
- Bắn một khẩu súng mà không nạp đủ đạn, trong đó súng của họ sẽ tự nổ và giết chết chủ nhân.
Hãy cẩn thận
Theo Hướng dẫn dành cho chủ sở hữu súng tương lai :
- Một lá chắn kim loại CANNOT bảo vệ khỏi chùm plasma đến. Tương tự như vậy, một bộ làm lệch nhiệt CANNOT bảo vệ khỏi viên đạn đến.
- Tia plasma áp đảo viên đạn (vì trước đây đòi hỏi nhiều đạn hơn). Do đó, nếu người chơi bắn một tia plasma vào đối thủ bắn một viên đạn trong cùng một lượt, thì đối thủ sẽ bị giết.
- Nếu cả hai người chơi bắn một viên đạn vào nhau trong cùng một lượt, viên đạn sẽ hủy và cả hai người chơi đều sống sót. Tương tự như vậy, nếu cả hai người chơi bắn một tia plasma vào nhau trong cùng một lượt, cả hai người chơi đều sống sót.
Điều đáng chú ý là:
- Bạn sẽ KHÔNG biết hành động của đối thủ trong lượt của mình cho đến khi kết thúc.
- Làm chệch hướng tia plasma và đạn che chắn sẽ KHÔNG gây hại cho đối thủ của bạn.
Do đó, có tổng cộng 25 kết hợp hành động hợp lệ mỗi lượt:
+-------------+---------------------------------------------+
| Outcome | P L A Y E R B |
| Table +--------+-----------------+------------------+
| for Players | Load | Bullet Plasma | Metal Thermal |
+---+---------+--------+--------+--------+--------+---------+
| P | Load | | B wins | B wins | | |
| L +---------+--------+--------+--------+--------+---------+
| A | Bullet | A wins | | B wins | | A wins |
| Y | +--------+--------+--------+--------+---------+
| E | Plasma | A wins | A wins | | A wins | |
| R +---------+--------+--------+--------+--------+---------+
| | Metal | | | B wins | | |
| | +--------+--------+--------+--------+---------+
| A | Thermal | | B wins | | | |
+---+---------+--------+--------+---------------------------+
Note: Blank cells indicate that both players survive to the next turn.
Ví dụ đấu tay đôi
Đây là một cuộc đấu tay đôi tôi từng có với một người bạn. Trước đó, chúng tôi không biết nhiều về lập trình, vì vậy chúng tôi đã sử dụng cử chỉ tay và báo hiệu ở tốc độ hai lượt mỗi giây. Từ trái sang phải, hành động của chúng tôi lần lượt:
Me: 001-000-1201101001----2
Friend: 00-10-=1-==--0100-1---1
Theo các quy tắc trên, tôi đã mất. Bạn có thấy tại sao không? Đó là bởi vì tôi đã bắn chùm tia plasma cuối cùng khi tôi chỉ có 1 viên đạn được nạp, khiến khẩu súng của tôi phát nổ.
Trình phát C ++
Bạn , với tư cách là một lập trình viên tương lai văn minh, sẽ không trực tiếp cầm súng. Thay vào đó, bạn viết mã Player
chiến đấu chống lại người khác. Bằng cách kế thừa công khai lớp c ++ trong dự án GitHub, bạn có thể bắt đầu viết huyền thoại đô thị của mình.
Player.hpp can be found in Tournament\Player.hpp
An example of a derived class can be found in Tournament\CustomPlayer.hpp
Những gì bạn phải hoặc có thể làm
- Bạn phải kế thừa
Player
lớp thông qua kế thừa công khai và tuyên bố lớp cuối cùng của bạn. - Bạn phải ghi đè
Player::fight
, trả về giá trịPlayer::Action
mỗi lần nó được gọi. - Tùy chọn, ghi đè
Player::perceive
vàPlayer::declared
để theo dõi hành động của đối thủ và theo dõi các chiến thắng của bạn. - Tùy chọn, sử dụng các thành viên và phương thức tĩnh riêng trong lớp dẫn xuất của bạn để thực hiện các phép tính phức tạp hơn.
- Tùy chọn, sử dụng các thư viện chuẩn C ++ khác.
Những gì bạn không được làm
- Bạn KHÔNG được sử dụng bất kỳ phương pháp trực tiếp nào để nhận ra đối thủ của mình ngoài số nhận dạng đối thủ đã cho, được xáo trộn vào đầu mỗi giải đấu. Bạn chỉ được phép đoán ai là người chơi thông qua trò chơi của họ trong một giải đấu.
- Bạn KHÔNG được ghi đè bất kỳ phương thức nào trong
Player
lớp không được khai báo ảo. - Bạn KHÔNG được khai báo hoặc khởi tạo bất cứ điều gì trong phạm vi toàn cầu.
- Kể từ khi ra mắt (hiện đã bị loại)
BlackHatPlayer
, người chơi KHÔNG được phép nhìn trộm hoặc sửa đổi trạng thái của đối thủ của bạn.
Một ví dụ đấu tay đôi
Quá trình đấu súng được thực hiện bằng cách sử dụng GunDuel
lớp. Để biết ví dụ về cuộc chiến, hãy xem Source.cpp
phần Bắt đầu một cuộc đấu tay đôi .
Chúng tôi giới thiệu GunClubPlayer
, HumanPlayer
và các GunDuel
lớp học, có thể được tìm thấy trong Tournament\
thư mục của các kho lưu trữ.
Trong mỗi trận đấu, GunClubPlayer
sẽ nạp một viên đạn; bắn nó; rửa sạch và lặp lại. Trong mỗi lượt, HumanPlayer
sẽ nhắc bạn hành động để chống lại đối thủ của bạn. Điều khiển bàn phím của bạn là những nhân vật 0
, 1
, 2
, -
và =
. Trên Windows, bạn có thể sử dụng HumanPlayer
để gỡ lỗi trình của mình.
Bắt đầu một cuộc đấu tay đôi
Đây là cách bạn có thể gỡ lỗi trình phát của mình thông qua bảng điều khiển.
// Source.cpp
// An example duel between a HumanPlayer and GunClubPlayer.
#include "HumanPlayer.hpp"
#include "GunClubPlayer.hpp"
#include "GunDuel.hpp"
int main()
{
// Total number of turns per duel.
size_t duelLength = 100;
// Player identifier 1: HumanPlayer.
HumanPlayer human(2);
// Player identifier 2: GunClubPlayer.
GunClubPlayer gunClub(1);
// Prepares a duel.
GunDuel duel(human, gunClub, duelLength);
// Start a duel.
duel.fight();
}
Trò chơi ví dụ
Số tiền tối thiểu của lượt bạn cần phải đánh bại GunClubPlayer
là 3. Đây là replay từ chơi 0-1
chống lại GunClubPlayer
. Số trong phép so sánh là số lượng đạn được nạp cho mỗi người chơi khi lượt chơi kết thúc.
:: Turn 0
You [0/12/-=] >> [0] load ammo (1 ammo)
Opponent selects [0] load ammo (1 ammo)
:: Turn 1
You [0/12/-=] >> [-] defend using metal shield (1 ammo)
Opponent selects [1] fire a bullet (0 ammo)
:: Turn 2
You [0/12/-=] >> [1] fire a bullet (0 ammo)
Opponent selects [0] load ammo (1 ammo)
:: You won after 3 turns!
:: Replay
YOU 0-1
FOE 010
Press any key to continue . . .
Cách nhanh nhất để bị đánh bại GunClubPlayer
mà không thực hiện các động tác không hợp lệ là trình tự 0=
, bởi vì viên đạn bắn xuyên qua bộ làm lệch nhiệt. Phát lại là
:: Turn 0
You [0/12/-=] >> [0] load ammo (1 ammo)
Opponent selects [0] load ammo (1 ammo)
:: Turn 1
You [0/12/-=] >> [=] defend using thermal deflector (1 ammo)
Opponent selects [1] fire a bullet (0 ammo)
:: You lost after 2 turns!
:: Replay
YOU 0=
FOE 01
Press any key to continue . . .
Giải đấu
Giải đấu tuân theo định dạng "Người chơi cuối cùng". Trong một giải đấu, tất cả các bài nộp hợp lệ (bao gồm cả GunClubPlayer
) được đặt trong một nhóm. Mỗi bài dự thi được chỉ định một số nhận dạng ngẫu nhiên nhưng duy nhất sẽ giữ nguyên trong toàn bộ giải đấu. Trong mỗi vòng:
- Mỗi bài nộp bắt đầu với 0 điểm và sẽ chơi 100 trận đấu với mọi bài khác.
- Mỗi trận đấu tay đôi sẽ giành được 1 điểm; vẽ và thua cho 0 điểm.
- Kết thúc vòng thi, các bài dự thi có số điểm tối thiểu sẽ rời khỏi giải đấu. Trong trường hợp hòa, người chơi có số điểm kiếm được ít nhất kể từ đầu giải đấu sẽ rời đi.
- Nếu có nhiều hơn một người chơi, vòng tiếp theo sẽ bắt đầu.
- Điểm KHÔNG mang qua vòng tiếp theo.
Nộp hồ sơ
Bạn sẽ gửi một người chơi cho mỗi câu trả lời. Bạn có thể gửi nhiều tệp cho một người chơi, miễn là chúng KHÔNG can thiệp vào các lần gửi khác. Để giữ cho mọi thứ trôi chảy, xin vui lòng:
- Đặt tên tệp tiêu đề chính của bạn là
<Custom>Player.hpp
, - Đặt tên cho các tệp khác của bạn là
<Custom>Player*.*
, ví dụMyLittlePlayer.txt
nếu tên lớp của bạn làMyLittlePlayer
hoặcEmoPlayerHates.cpp
nếu tên lớp của bạn làEmoPlayer
. - Nếu tên của bạn có chứa
Shooter
hoặc các từ tương tự phù hợp với bối cảnh của giải đấu này, bạn không cần thêmPlayer
vào cuối. Nếu bạn cảm thấy mạnh mẽ rằng tên trình của bạn hoạt động tốt hơn mà không có hậu tốPlayer
, bạn cũng không cần phải thêmPlayer
. - Đảm bảo rằng mã của bạn có thể được biên dịch và liên kết trong Windows.
Bạn có thể bình luận để yêu cầu làm rõ hoặc để phát hiện sơ hở. Hy vọng bạn thích cuộc đấu súng tương lai này và chúc bạn một năm mới hạnh phúc!
Làm rõ
- Bạn được phép có hành vi ngẫu nhiên.
- Các hành động không hợp lệ (bắn khi nạp đạn không đủ) được cho phép.
- Nếu người chơi tạo đầu vào không hợp lệ, súng của họ sẽ phát nổ ngay lập tức.
- Bạn được phép nghiên cứu các câu trả lời.
- Bạn rõ ràng được phép ghi lại hành vi của đối thủ trong mỗi giải đấu.
- Mỗi vòng, bạn sẽ chơi 100 trận đấu với mỗi đối thủ; tuy nhiên, thứ tự của 100 trận đấu là ngẫu nhiên - bạn không được đảm bảo chiến đấu với cùng một đối thủ 100 trận đấu liên tiếp.
Tài nguyên bổ sung
@flawr đã dịch nguồn C ++ được cung cấp sang Java làm tài liệu tham khảo nếu bạn muốn gửi các mục C ++.
Giao diện cho các bài nộp không phải C ++
Hiện được chấp nhận: Python 3, Java.
Vui lòng làm theo một trong các thông số kỹ thuật dưới đây:
Đặc tả giao diện 1: mã thoát
Trình của bạn sẽ chạy một lần mỗi lượt.
Expected Command Line Argument Format:
<opponent-id> <turn> <status> <ammo> <ammo-opponent> <history> <history-opponent>
Expected Return Code: The ASCII value of a valid action character.
'0' = 48, '1' = 49, '2' = 50, '-' = 45, '=' = 61
<opponent-id> is an integer in [0, N), where N is size of tournament.
<turn> is 0-based.
If duel is in progress, <status> is 3.
If duel is draw / won / lost, <status> is 0 / 1 / 2.
<history> and <history-opponent> are strings of actions, e.g. 002 0-=
If turn is 0, <history> and <history-opponent> are not provided.
You can ignore arguments you don't particularly need.
Bạn có thể kiểm tra trình của bạn trong PythonPlayer\
và JavaPlayer\
thư mục.
Đặc tả giao diện 2: stdin / stdout
(Tín dụng cho H Walters)
Trình của bạn sẽ chạy một lần mỗi giải đấu.
Có một yêu cầu cố định cho tất cả các mục về cách thực hiện I / O, vì cả stdin và stdout đều được kết nối với trình điều khiển giải đấu. Vi phạm điều này có thể dẫn đến bế tắc. Tất cả các mục PHẢI tuân theo thuật toán CHÍNH XÁC này (bằng mã giả):
LOOP FOREVER
READ LINE INTO L
IF (LEFT(L,1) == 'I')
INITIALIZE ROUND
// i.e., set your/opponent ammo to 0, if tracking them
// Note: The entire line at this point is a unique id per opponent;
// optionally track this as well.
CONTINUE LOOP
ELSE IF (LEFT(L,1) == 'F')
WRITELN F // where F is your move
ELSE IF (LEFT(L,1) == 'P')
PROCESS MID(L,2,1) // optionally perceive your opponent's action.
END IF
CONTINUE LOOP
QUIT
Ở đây, F là một trong những 0
, 1
, 2
, -
, hoặc =
cho load / bullet / plasma / metal / thermal
. QUY TRÌNH có nghĩa là tùy ý trả lời những gì đối thủ của bạn đã làm (bao gồm cả theo dõi đạn của đối thủ nếu bạn đang làm điều này). Lưu ý rằng hành động của đối thủ cũng là một trong '0', '1', '2', '-' hoặc '=' và nằm trong ký tự thứ hai.
Bảng điểm cuối cùng
08:02 AM Tuesday, February 2, 2017 Coordinated Universal Time (UTC)
| Player | Language | Points | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
|:------------------ |:---------- | ------:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:|
| MontePlayer | C++ | 11413 | 1415 | 1326 | 1247 | 1106 | 1049 | 942 | 845 | 754 | 685 | 555 | 482 | 381 | 287 | 163 | 115 | 61 |
| CBetaPlayer | C++ | 7014 | 855 | 755 | 706 | 683 | 611 | 593 | 513 | 470 | 414 | 371 | 309 | 251 | 192 | 143 | 109 | 39 |
| StudiousPlayer | C++ | 10014 | 1324 | 1233 | 1125 | 1015 | 907 | 843 | 763 | 635 | 555 | 478 | 403 | 300 | 201 | 156 | 76 |
| FatedPlayer | C++ | 6222 | 745 | 683 | 621 | 655 | 605 | 508 | 494 | 456 | 395 | 317 | 241 | 197 | 167 | 138 |
| HanSoloPlayer | C++ | 5524 | 748 | 668 | 584 | 523 | 490 | 477 | 455 | 403 | 335 | 293 | 209 | 186 | 153 |
| SurvivorPlayer | C++ | 5384 | 769 | 790 | 667 | 574 | 465 | 402 | 354 | 338 | 294 | 290 | 256 | 185 |
| SpecificPlayer | C++ | 5316 | 845 | 752 | 669 | 559 | 488 | 427 | 387 | 386 | 340 | 263 | 200 |
| DeceptivePlayer | C++ | 4187 | 559 | 445 | 464 | 474 | 462 | 442 | 438 | 369 | 301 | 233 |
| NotSoPatientPlayer | C++ | 5105 | 931 | 832 | 742 | 626 | 515 | 469 | 352 | 357 | 281 |
| BarricadePlayer | C++ | 4171 | 661 | 677 | 614 | 567 | 527 | 415 | 378 | 332 |
| BotRobotPlayer | C++ | 3381 | 607 | 510 | 523 | 499 | 496 | 425 | 321 |
| SadisticShooter | C++ | 3826 | 905 | 780 | 686 | 590 | 475 | 390 |
| TurtlePlayer | C++ | 3047 | 754 | 722 | 608 | 539 | 424 |
| CamtoPlayer | C++ | 2308 | 725 | 641 | 537 | 405 |
| OpportunistPlayer | C++ | 1173 | 426 | 420 | 327 |
| GunClubPlayer | C++ | 888 | 500 | 388 |
| PlasmaPlayer | C++ | 399 | 399 |
Giải đấu sẽ kéo dài đến ngày 1 tháng 2 năm 2017 trừ khi có ghi chú khác.
Player
triển khai thực hiện quy trình khác để tính lần lượt hiện tại. Điều đó sẽ cho phép mọi người tham gia vào bất kỳ ngôn ngữ nào mà bạn vui lòng chạy trên máy của mình.
Player::fight
" / "bạn có thể thừa kế Player::perceive
" ... trong cả hai trường hợp, thuật ngữ này được ghi đè , không phải kế thừa .
GunDuel.hpp
cả hai validA
và validB
sử dụngactionA