Arka plan Gelecek
2017 yılında, siz ve rakibiniz yalnızca birinin hayatta kalabileceği fütüristik bir silahlı savaşta karşı karşıya kalacaksınız. Are sen rakibin yenmek için yeterli deneyimli? Şimdi silah becerilerinizi en sevdiğiniz programlama dilinde cilalama ve her şeye rağmen mücadele etme zamanı !
Turnuva Sonuçları
Feburary 2'nin UTC sabahı sona Bu turnuva nd bizim yarışmacılar için 2017 sayesinde, heyecan verici futuristik turnuva oldu!
MontePlayer, CBetaPlayer ve StudiousPlayer ile yakın dövüşlerin ardından son galibi. Üç en iyi guen düelloları hatıra fotoğrafı çekti:
MontePlayer - by TheNumberOne
+------------+
CBetaPlayer | | - by George V. Williams
+------------+ # 1 | StudiousPlayer - by H Walters
| +----------------+
| # 2 # 3 |
+------------------------------------------+
The Futurustic Gun Duel @ PPCG.SE 2017
Kazananları tebrik ediyoruz! Detaylı ilan tahtası bu yazının sonuna doğru görülüyor.
Genel rehberlik
- Bu turnuvada kullanılan kaynak kodu için resmi depoyu ziyaret edin .
- C ++ girdileri: lütfen
Player
sınıfı miras alın . - C ++ olmayan girişler: C ++ olmayan başvuruları için Arayüz bölümünde bir arayüz seçin .
- Şu anda izin verilen C ++ olmayan diller: Python 3, Java.
Düello
- Her oyuncu, sınırsız miktarda cephane yükleyebilen boş bir silahla başlar.
- Her turda, oyuncular aynı anda aşağıdaki işlemlerden birini seçer:
0
- Tabancaya 1 mermi yerleştirin.1
- Rakibe bir mermi at; 1 yüklü cephane maliyeti.2
- Rakibe bir plazma ışını ateşleyin; 2 yüklü cephane maliyeti.-
- Metal bir kalkan kullanarak gelen mermiyi savun.=
- Bir termal deflektör kullanarak gelen plazma ışınını savun.
- Her iki oyuncu da 100'üncü dönüşten sonra hayatta kalırsa, ikisi de ölüme tükenir ve bu da berabere sonuçlanır .
Bir oyuncu silah düellolarını kaybeder
- Did DEĞİL gelen mermiyi savunmak için metal koruyucuyu kullanın.
- Did DEĞİL gelen plazma savunmak için termal saptırıcısını kullanın.
- Yeterli cephane yüklemeden bir silahı ateşleyin, silahları kendiliğinden patlar ve sahibini öldürür.
Uyarılar
Fütüristik Silah Sahipleri El Kitabı'na göre :
- Bir metal kalkan CAN gelen plazma ışını savunmak. Aynı şekilde, bir termal saptırıcı CAN NOT gelen kurşunuyla savunmak.
- Plazma ışını mermi atar (çünkü daha fazla cephane gerektirir). Bu nedenle, bir oyuncu aynı sırayla bir mermi atan rakibe bir plazma ışını atarsa, rakip öldürülür.
- Her iki oyuncu da aynı sırayla bir mermi ateşlerse, mermiler iptal edilir ve her iki oyuncu da hayatta kalır. Benzer şekilde, her iki oyuncu da aynı sırayla birbirlerine plazma ışını attığında, her iki oyuncu da hayatta kalır.
Ayrıca dikkat çekicidir:
- Sen olacak DEĞİL biter kadar sırayla rakibin eylemi biliyorum.
- Plazma huzmelerini saptırmak ve koruyucu mermiler olacak DEĞİL rakibin zarar verirler.
Bu nedenle, her turda toplam 25 geçerli işlem kombinasyonu vardır:
+-------------+---------------------------------------------+
| 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.
Örnek Düello
İşte bir zamanlar bir arkadaşımla yaşadığım bir düello. O zamanlar programlama hakkında pek bir şey bilmiyorduk, bu yüzden el hareketlerini kullandık ve saniyede iki tur hızında sinyal verdik. Soldan sağa, sırayla eylemlerimiz:
Me: 001-000-1201101001----2
Friend: 00-10-=1-==--0100-1---1
Yukarıdaki kurallara göre kaybettim. Neden görüyor musun Bunun sebebi, sadece 1 adet yüklü cephane varken silahımı patlatarak son plazma ışınını ateşlememdi.
C ++ Oynatıcı
Siz , medeni bir fütüristik programcı olarak, silahlarla doğrudan ilgilenmeyeceksiniz. Bunun yerine, Player
başkalarına karşı savaşan bir kod yazıyorsunuz '. GitHub projesinde c ++ sınıfını herkese açık bir şekilde devralarak, şehir efsanenizi yazmaya başlayabilirsiniz.
Player.hpp can be found in Tournament\Player.hpp
An example of a derived class can be found in Tournament\CustomPlayer.hpp
Ne gerekir veya olabilir yapmak
Player
Genel miras yoluyla ders miras almalı ve sınıf finalini beyan etmelisiniz.- Her çağrıldığında
Player::fight
geçerli bir sonuç veren geçersiz kılmalısınızPlayer::Action
. - İsteğe bağlı olarak, geçersiz kılmak
Player::perceive
vePlayer::declared
rakibin eylemleri göz kulak ve Zaferlerinin takip etmek. - İsteğe bağlı olarak, daha karmaşık hesaplamalar yapmak için türetilmiş sınıfınızdaki özel statik üyeleri ve yöntemleri kullanın.
- İsteğe bağlı olarak, diğer C ++ standart kütüphanelerini kullanın.
Yapmamanız gerekenler
- Sen gerekir DEĞİL her turnuvanın başında karıştırılır edilir verilen rakip tanımlayıcı dışında rakibin tanımak için herhangi bir doğrudan yöntemini kullanın. Bir turnuvada sadece bir oyuncunun oyunda kim olduğunu tahmin etmenize izin verilir.
- Sen gerekir DEĞİL içinde herhangi bir yöntemi geçersiz
Player
sanal ilan edilmez sınıfın. - Sen gerekir DEĞİL beyan veya global kapsamda şey başlatmak.
- (Şimdi diskalifiye) başlangıcından beri
BlackHatPlayer
, oyuncular vardır DEĞİL gözetleme veya rakibin durumunu değiştirmek için izin verdi.
Örnek bir düello
Bir silah düello işlemi, GunDuel
sınıf kullanılarak yapılır . Örnek bir dövüş için bir düello başlatılmasıSource.cpp
bölümüne bakın .
Biz vitrin GunClubPlayer
, HumanPlayer
ve GunDuel
sınıf bulunabilir hangi Tournament\
deponun dizininde.
Her düelloda GunClubPlayer
bir mermi yüklenecek; kov onu; durulayın ve tekrarlayın. Her turda HumanPlayer
sizden rakibinize karşı oynayabileceğiniz bir aksiyon isteyecektir. Klavyeniz kontrolleri karakterlerdir 0
, 1
, 2
, -
ve =
. Windows'ta HumanPlayer
gönderiminizi hata ayıklamak için kullanabilirsiniz .
Bir düello başlatmak
Müzikçalarınızı bu şekilde konsoldan hata ayıklayabilirsiniz.
// 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();
}
Örnek Oyunlar
Yenmek için gereken en az tur GunClubPlayer
sayısı 3'tür. İşte 0-1
karşı oynadığın tekrar GunClubPlayer
. Parantez içindeki sayı, sıra sona erdiğinde her oyuncu için yüklü cephane sayısıdır.
:: 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 . . .
GunClubPlayer
Geçersiz hareketler yapmadan mağlup olmanın en hızlı yolu sekanstır 0=
, çünkü mermi ısıl saptırıcıdan doğrudan vurur. Tekrar
:: 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 . . .
Turnuva
Turnuva "Son Oyuncu Daimi" formatını izler. Bir turnuvada, geçerli tüm başvurular (dahil olanlar dahil GunClubPlayer
) bir havuza yerleştirilir. Her gönderime, tüm turnuva boyunca aynı kalacak olan randomize ancak benzersiz bir tanımlayıcı atanır. Her turda:
- Her gönderim 0 puanla başlar ve diğer gönderilere karşı 100 düello oynar.
- Her muzaffer düello 1 puan verecek; çizim ve kaybetme 0 puan verir.
- Turun sonunda, minimum puan alan başvurular turnuvadan ayrılır. Beraberlik durumunda, turnuva başlangıcından bu yana kazanılan en az puana sahip oyuncu ayrılır.
- Eğer birden fazla oyuncu kalırsa, bir sonraki tur başlayacaktır.
- Nokta do DEĞİL üst tura aktarılır.
boyun eğme
Cevap başına bir oyuncu göndereceksin. Sen yeter ki yok gibi, bir oyuncu için birden fazla dosya gönderebilirsiniz DEĞİL diğer gönderimleri müdahale. İşlerin akmasını sağlamak için lütfen:
- Ana başlık dosyanızı
<Custom>Player.hpp
, - Diğer dosyalarınızı
<Custom>Player*.*
, örneğinMyLittlePlayer.txt
sınıf adınızMyLittlePlayer
veyaEmoPlayerHates.cpp
sınıf adınız gibi adlandırınEmoPlayer
. - Adınız
Shooter
veya bu turnuva bağlamına uygun kelimeler içeriyorsaPlayer
, sonunda eklemeniz gerekmez . Gönderim adınızın sonek olmadan daha iyi çalıştığını düşünüyorsanızPlayer
, ayrıca eklemeniz gerekmezPlayer
. - Kodunuzun Windows altında derlendiğinden ve bağlandığından emin olun.
Açıklama istemek veya boşluk boşlukları görmek için yorum yapabilirsiniz. Bu Fütüristik Silah Düellolarının tadını çıkarmanızı ve Mutlu Yıllar dileriz!
açıklama
- Rasgele davranış sergilemenize izin verilir.
- Geçersiz işlemlere (yüklü cephane ateş etmesine yetmez) izin verilir.
- Bir oyuncu geçersiz bir giriş yaparsa, tabancası derhal patlayacak.
- Cevapları incelemenize izin var.
- Sen edilir açıkça izin her turnuvanın içindeki rakip davranışlarını kaydetmek için.
- Her rauntta, her rakibe karşı 100 düello oynayacaksın; Bununla birlikte, 100 düello sırasının sırası rastgeledir - aynı rakibin arka arkaya 100 düelloyla savaşması garanti edilmez.
Ek kaynaklar
@flawr, C ++ girişlerini göndermek istiyorsanız , sağlanan C ++ kaynağını referans olarak Java'ya çevirdi .
C ++ Dışı Gönderme Arayüzü
Şu anda kabul edilen: Python 3, Java.
Lütfen aşağıdaki özelliklerden birini takip edin:
Arayüz özellikleri 1: çıkış kodu
Gönderiniz her turda bir kez yayınlanacaktır.
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.
Gönderinizi PythonPlayer\
ve JavaPlayer\
dizinlerinizi test edebilirsiniz .
Arayüz özellikleri 2: stdin / stdout
(H Walters'a teşekkür ederiz)
Gönderiniz, turnuva başına bir kez yayınlanacak.
Turnuva sürücüsüne hem stdin hem de stdout bağlandığı için G / Ç'nin nasıl yapılacağı ile ilgili tüm girişler için sabit bir gereksinim vardır. Bunu ihlal etmek kilitlenmeye yol açabilir. Tüm girişler GEREKİR bu takip EXACT (sözde kod) algoritması:
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
Burada, F biridir 0
, 1
, 2
, -
, veya =
için load / bullet / plasma / metal / thermal
. PROSES isteğe bağlı olarak rakibinizin ne yaptığını yanıtlamak anlamına gelir (eğer bunu yapıyorsanız rakibinizin cephanesini izlemek dahil). Rakibin hareketinin aynı zamanda '0', '1', '2', '-' veya '=' arasında olduğunu ve ikinci karakterde olduğunu unutmayın.
Final Scoreboard
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 |
Aksi belirtilmedikçe , turnuva 1 Şubat 2017 tarihine kadar sürecek .
Player
, mevcut sırayı hesaplamak için başka bir işlemi çağıran bir uygulamaya izin verebilirsiniz . Bu, insanların makinenizde çalıştırmaktan mutluluk duyduğunuz herhangi bir dile katılmalarını sağlar.
Player::fight
" / "miras alabilirsiniz Player::perceive
" ... her iki durumda da, terim geçersiz kılınır , devralınmaz .
GunDuel.hpp
, validA
validB
actionA