The Latar Belakang Masa Depan
Di tahun 2017, Anda dan lawan Anda akan berhadapan dalam pertempuran senjata futuristik di mana hanya satu yang bisa bertahan. Apakah Anda cukup berpengalaman untuk mengalahkan lawan Anda? Sekarang adalah waktunya untuk memoles keterampilan meriam Anda dalam bahasa pemrograman favorit Anda dan berjuang melawan segala rintangan!
Hasil Turnamen
Turnamen ini berakhir pada UTC pagi Feburary 2 nd , 2017. Berkat kontestan kami, kami telah memiliki turnamen futuristik menarik!
MontePlayer adalah pemenang akhir setelah pertarungan dekat dengan CBetaPlayer dan StudiousPlayer. Tiga duel guen top telah mengambil foto peringatan:
MontePlayer - by TheNumberOne
+------------+
CBetaPlayer | | - by George V. Williams
+------------+ # 1 | StudiousPlayer - by H Walters
| +----------------+
| # 2 # 3 |
+------------------------------------------+
The Futurustic Gun Duel @ PPCG.SE 2017
Selamat untuk para pemenang! Papan peringkat terperinci terlihat di dekat akhir tulisan ini.
Panduan Umum
- Kunjungi repositori resmi untuk kode sumber yang digunakan dalam turnamen ini.
- Entri C ++: silakan mewarisi
Player
kelas. - Entri Non C ++: pilih satu antarmuka di bagian Antarmuka untuk pengiriman Non-C ++ .
- Saat ini diizinkan bahasa yang bukan C ++: Python 3, Java.
Pertarungan
- Setiap pemain mulai dengan pistol tanpa muatan yang dapat memuat amunisi dalam jumlah tak terbatas.
- Setiap belokan, pemain akan secara bersamaan memilih dari salah satu tindakan berikut:
0
- Muat 1 amunisi ke dalam pistol.1
- Menembakkan peluru ke arah lawan; biaya 1 amunisi dimuat.2
- Tembakan sinar plasma pada lawan; biaya 2 amunisi dimuat.-
- Pertahankan peluru yang masuk menggunakan pelindung logam.=
- Pertahankan sinar plasma yang masuk menggunakan deflektor termal.
- Jika kedua pemain bertahan hidup setelah giliran ke- 100 , mereka berdua kelelahan sampai mati, yang menghasilkan hasil seri .
Seorang pemain kehilangan duel senjata jika mereka
- Apakah tidak menggunakan perisai logam untuk mempertahankan sebuah peluru yang masuk.
- Apakah tidak menggunakan deflektor termal mempertahankan sebuah plasma yang masuk.
- Tembakan senjata tanpa memuat amunisi yang cukup, di mana senjata mereka akan meledak sendiri dan membunuh pemiliknya.
Peringatan
Menurut Manual untuk Pemilik Gun Futuristik :
- Perisai logam TIDAK BISA bertahan dari sinar plasma yang masuk. Demikian juga, deflektor termal TIDAK BISA bertahan dari peluru yang masuk.
- Sinar plasma mengalahkan peluru (karena peluru membutuhkan lebih banyak amunisi). Oleh karena itu, jika seorang pemain menembakkan sinar plasma pada lawan yang menembakkan peluru pada belokan yang sama, lawan terbunuh.
- Jika kedua pemain menembakkan peluru satu sama lain dalam belokan yang sama, peluru membatalkan dan kedua pemain bertahan. Demikian juga, jika kedua pemain menembakkan sinar plasma satu sama lain dalam belokan yang sama, kedua pemain bertahan.
Perlu dicatat bahwa:
- Anda TIDAK akan mengetahui tindakan lawan Anda secara bergantian sampai berakhir.
- Membengkokkan sinar plasma dan melindungi peluru TIDAK akan membahayakan lawan Anda.
Oleh karena itu, ada total 25 kombinasi tindakan yang valid setiap belokan:
+-------------+---------------------------------------------+
| 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.
Contoh Duel
Ini duel yang pernah kumiliki dengan seorang teman. Saat itu, kami tidak tahu banyak tentang pemrograman, jadi kami menggunakan gerakan tangan dan memberi sinyal dengan kecepatan dua putaran per detik. Dari kiri ke kanan, tindakan kami pada gilirannya:
Me: 001-000-1201101001----2
Friend: 00-10-=1-==--0100-1---1
Sesuai aturan di atas, saya kalah. Apakah kamu melihat mengapa? Itu karena aku menembakkan sinar plasma terakhir ketika aku hanya punya 1 amunisi, menyebabkan senjataku meledak.
C ++ Player
Anda , sebagai programmer futuristik yang beradab, tidak akan langsung menangani senjata. Alih-alih, Anda membuat kode Player
yang bertempur melawan yang lain. Dengan mewarisi kelas c ++ secara publik di proyek GitHub, Anda dapat mulai menulis legenda urban Anda.
Player.hpp can be found in Tournament\Player.hpp
An example of a derived class can be found in Tournament\CustomPlayer.hpp
Apa yang harus atau dapat Anda lakukan
- Anda harus mewarisi
Player
kelas melalui warisan publik dan menyatakan final kelas Anda. - Anda harus mengganti
Player::fight
, yang mengembalikan yang validPlayer::Action
setiap kali dipanggil. - Secara opsional, menimpa
Player::perceive
danPlayer::declared
untuk mengawasi tindakan lawan Anda dan melacak kemenangan Anda. - Secara opsional, gunakan anggota statis pribadi dan metode di kelas turunan Anda untuk melakukan perhitungan yang lebih kompleks.
- Secara opsional, gunakan pustaka standar C ++ lainnya.
Apa yang tidak boleh Anda lakukan
- Anda TIDAK boleh menggunakan metode langsung apa pun untuk mengenali lawan Anda selain pengenal lawan yang diberikan, yang dikocok di awal setiap turnamen. Anda hanya bisa menebak siapa pemain melalui permainan-permainan mereka dalam suatu turnamen.
- Anda TIDAK boleh mengganti metode apa pun di
Player
kelas yang tidak dinyatakan virtual. - Anda TIDAK boleh mendeklarasikan atau menginisialisasi apa pun dalam lingkup global.
- Sejak debut (sekarang didiskualifikasi)
BlackHatPlayer
, pemain TIDAK diizinkan untuk mengintip atau memodifikasi kondisi lawan Anda.
Contoh duel
Proses duel senjata dilakukan menggunakan GunDuel
kelas. Untuk contoh pertarungan, lihat Source.cpp
di bagian Memulai duel .
Kami memamerkan GunClubPlayer
, HumanPlayer
dan GunDuel
kelas, yang dapat ditemukan di Tournament\
direktori repositori.
Dalam setiap duel, GunClubPlayer
akan memuat peluru; tembak itu; bilas dan ulangi. Selama setiap belokan, HumanPlayer
akan meminta Anda untuk bermain melawan lawan. Kontrol keyboard Anda adalah karakter 0
, 1
, 2
, -
dan =
. Di Windows, Anda dapat menggunakan HumanPlayer
untuk men-debug kiriman Anda.
Memulai duel
Ini adalah bagaimana Anda dapat men-debug pemain Anda melalui konsol.
// 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();
}
Contoh Game
Jumlah putaran paling tidak yang Anda butuhkan untuk mengalahkan GunClubPlayer
adalah 3. Inilah ulangan dari bermain 0-1
melawan GunClubPlayer
. Angka dalam paranthesis adalah jumlah amunisi yang dimuat untuk setiap pemain saat belokan berakhir.
:: 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 . . .
Cara tercepat untuk dikalahkan dengan GunClubPlayer
tanpa membuat gerakan yang tidak valid adalah urutannya 0=
, karena peluru menembak menembus deflektor termal. Replaynya adalah
:: 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 . . .
Turnamen
Turnamen ini mengikuti format "Last Player Standing". Dalam sebuah turnamen, semua pengiriman yang valid (termasuk GunClubPlayer
) ditempatkan di kumpulan. Setiap pengiriman diberikan pengidentifikasi acak namun unik yang akan tetap sama selama seluruh turnamen. Selama setiap putaran:
- Setiap pengiriman dimulai dengan 0 poin dan akan bermain 100 duel melawan setiap pengiriman lainnya.
- Setiap duel yang menang akan memberikan 1 poin; menggambar dan kalah memberi 0 poin.
- Di akhir babak, pengajuan dengan poin minimum meninggalkan turnamen. Dalam hal seri, pemain dengan jumlah poin paling sedikit yang diperoleh sejak awal turnamen akan pergi.
- Jika lebih dari satu pemain tersisa, babak selanjutnya akan dimulai.
- Poin TIDAK terbawa ke babak selanjutnya.
pengajuan
Anda akan mengirimkan satu pemain per jawaban. Anda dapat mengirim beberapa file untuk pemain, selama mereka TIDAK mengganggu pengiriman lainnya. Agar hal-hal terus mengalir, silakan:
- Beri nama file header utama Anda sebagai
<Custom>Player.hpp
, - Beri nama file Anda yang lain
<Custom>Player*.*
, misalnyaMyLittlePlayer.txt
jika nama kelas AndaMyLittlePlayer
, atauEmoPlayerHates.cpp
jika nama kelas AndaEmoPlayer
. - Jika nama Anda mengandung
Shooter
atau kata-kata serupa yang sesuai dengan konteks turnamen ini, Anda tidak perlu menambahkanPlayer
di akhir. Jika Anda merasa yakin bahwa nama kiriman Anda berfungsi lebih baik tanpa akhiranPlayer
, Anda juga tidak perlu menambahkanPlayer
. - Pastikan kode Anda dapat dikompilasi dan ditautkan di bawah Windows.
Anda dapat berkomentar untuk meminta klarifikasi atau untuk menemukan celah. Semoga Anda menikmati Duel Senjata Futuristik ini dan mengucapkan Selamat Tahun Baru!
Klarifikasi
- Anda diizinkan memiliki perilaku acak.
- Tindakan tidak valid (menembak ketika amunisi yang dimuat tidak cukup) diizinkan.
- Jika seorang pemain membuat input yang tidak valid, pistol mereka akan segera meledak.
- Anda diizinkan mempelajari jawabannya.
- Anda secara eksplisit diizinkan untuk merekam perilaku lawan dalam setiap turnamen.
- Setiap putaran, Anda akan memainkan 100 duel melawan setiap lawan; urutan 100 duel, bagaimanapun, adalah acak - Anda tidak dijamin untuk melawan 100 duel lawan yang sama berturut-turut.
Sumber daya tambahan
@ flawr telah menerjemahkan sumber C ++ yang disediakan ke Jawa sebagai referensi jika Anda ingin mengirimkan entri C ++.
Antarmuka untuk Pengajuan Non-C ++
Saat ini diterima: Python 3, Java.
Silakan ikuti salah satu spesifikasi di bawah ini:
Spesifikasi antarmuka 1: kode keluar
Kiriman Anda akan berjalan sekali per giliran.
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.
Anda dapat menguji kiriman PythonPlayer\
dan JavaPlayer\
direktori Anda.
Spesifikasi antarmuka 2: stdin / stdout
(Kredit ke H Walters)
Kiriman Anda akan berjalan sekali per turnamen.
Ada persyaratan tetap untuk semua entri tentang cara melakukan I / O, karena stdin dan stdout terhubung ke driver turnamen. Melanggar ini bisa menyebabkan kebuntuan. Semua entri HARUS mengikuti algoritma EXACT ini (dalam pseudo-code):
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
Di sini, F adalah salah satu dari 0
, 1
, 2
, -
, atau =
untuk load / bullet / plasma / metal / thermal
. PROSES berarti secara opsional menanggapi apa yang dilakukan lawan Anda (termasuk melacak amunisi lawan Anda jika Anda melakukan ini). Perhatikan bahwa tindakan lawan juga merupakan salah satu dari '0', '1', '2', '-', atau '=', dan berada dalam karakter kedua.
Papan Skor Akhir
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 |
Turnamen ini akan berlangsung hingga 1 Februari 2017 kecuali dinyatakan lain.
Player
implementasi yang memanggil proses lain untuk menghitung giliran saat ini. Itu akan memungkinkan orang untuk berpartisipasi dalam bahasa apa pun yang Anda senang jalankan di mesin Anda.
Player::fight
" / "Anda bisa mewarisi Player::perceive
" ... dalam kedua kasus, istilah tersebut menimpa , bukan mewarisi .
GunDuel.hpp
, baik validA
dan validB
gunakanactionA