पृष्ठभूमि भविष्य
वर्ष 2017 में, आप और आपका प्रतिद्वंद्वी फ्यूचरिस्टिक गन लड़ाई का सामना करेंगे, जहां केवल एक ही जीवित रह सकता है। क्या आप अपने प्रतिद्वंद्वी को हराने के लिए पर्याप्त अनुभवी हैं? अब अपनी पसंदीदा प्रोग्रामिंग भाषा में अपने बंदूक कौशल को चमकाने और सभी बाधाओं के खिलाफ लड़ने का समय है!
टूर्नामेंट के परिणाम
इस टूर्नामेंट फरवरी 2 यूटीसी सुबह को समाप्त हो गया nd , 2017 हमारे प्रतियोगियों के लिए धन्यवाद, हम एक रोमांचक भविष्य टूर्नामेंट पड़ा है!
MontePlayer CBetaPlayer और StudiousPlayer के साथ एक करीबी लड़ाई के बाद अंतिम विजेता है। तीन शीर्ष गुएन द्वंद्वयुद्धों ने एक यादगार तस्वीर ली है:
MontePlayer - by TheNumberOne
+------------+
CBetaPlayer | | - by George V. Williams
+------------+ # 1 | StudiousPlayer - by H Walters
| +----------------+
| # 2 # 3 |
+------------------------------------------+
The Futurustic Gun Duel @ PPCG.SE 2017
विजेताओं को बधाई! इस पोस्ट के अंत में विस्तृत लीडरबोर्ड देखा गया है।
सामान्य मार्गदर्शन
- इस टूर्नामेंट में उपयोग किए गए स्रोत कोड के लिए आधिकारिक रिपॉजिटरी पर जाएं ।
- C ++ प्रविष्टियाँ: कृपया
Player
वर्ग वारिस करें । - नॉन सी ++ एंट्री: नॉन-सी ++ सबमिशन के लिए सेक्शन इंटरफेस में एक इंटरफेस चुनें ।
- वर्तमान में गैर सी ++ भाषाओं की अनुमति है: पायथन 3, जावा।
द्वंद्व
- प्रत्येक खिलाड़ी एक अनलोड बंदूक के साथ शुरू होता है जो बारूद की एक अनंत राशि को लोड कर सकता है।
- प्रत्येक मोड़, खिलाड़ी एक साथ निम्नलिखित कार्यों में से एक का चयन करेंगे:
0
- बंदूक में 1 बारूद लोड करें।1
- प्रतिद्वंद्वी पर एक गोली फायर करें; लागत 1 भरी हुई बारूद।2
- प्रतिद्वंद्वी पर एक प्लाज्मा बीम फायर करें; लागत 2 भरी हुई बारूद।-
- एक धातु ढाल का उपयोग करके आने वाली बुलेट की रक्षा करें।=
- थर्मल डिफ्लेक्टर का उपयोग करके आने वाले प्लाज्मा बीम की रक्षा करें।
- यदि दोनों खिलाड़ी 100 वें मोड़ के बाद बच जाते हैं, तो वे दोनों मौत के लिए थक जाते हैं, जिसके परिणामस्वरूप ड्रा होता है ।
एक खिलाड़ी बंदूक द्वंद्वयुद्ध खो देता है अगर वे
- आने वाली बुलेट का बचाव करने के लिए मेटल शील्ड का इस्तेमाल नहीं किया ।
- एक आने वाले प्लाज्मा की रक्षा के लिए थर्मल डिफ्लेक्टर का उपयोग नहीं किया ।
- पर्याप्त बारूद लोड किए बिना एक बंदूक फायर करें, जिसमें उनकी बंदूक आत्म-विस्फोट करेगी और मालिक को मार देगी।
चेतावनियां
फ्यूचरिस्टिक गन मालिकों के लिए मैनुअल के अनुसार :
- एक धातु ढाल आने वाले प्लाज्मा बीम से बचाव नहीं कर सकता है । इसी तरह, थर्मल डिफ्लेक्टर CANNOT आने वाली बुलेट से बचाव नहीं करता है ।
- प्लाज्मा बीम बुलेट को ओवरपॉवर करता है (क्योंकि पूर्व में अधिक लोड बारूद की आवश्यकता होती है)। इसलिए, यदि कोई खिलाड़ी प्रतिद्वंद्वी पर एक प्लाज्मा बीम फायर करता है जो एक ही मोड़ में एक गोली चलाता है, तो प्रतिद्वंद्वी को मार दिया जाता है।
- यदि दोनों खिलाड़ी एक ही मोड़ पर एक दूसरे पर गोली चलाते हैं, तो गोलियां रद्द हो जाती हैं और दोनों खिलाड़ी बच जाते हैं। इसी तरह, यदि दोनों खिलाड़ी एक ही मोड़ पर एक दूसरे पर प्लाज्मा बीम से आग लगाते हैं, तो दोनों खिलाड़ी बच जाते हैं।
यह भी उल्लेखनीय है कि:
- आप अपने प्रतिद्वंद्वी की कार्रवाई को तब तक नहीं जान पाएंगे जब तक वह समाप्त नहीं हो जाती।
- प्लाज्मा बीम और परिरक्षण गोलियों की रक्षा करना आपके प्रतिद्वंद्वी को नुकसान नहीं पहुंचाएगा।
इसलिए, प्रत्येक मोड़ पर कुल 25 वैध कार्रवाई संयोजन हैं:
+-------------+---------------------------------------------+
| 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.
उदाहरण द्वंद्व
यहाँ एक द्वंद्व है जो मैंने एक बार एक दोस्त के साथ किया था। इसके बाद, हमें प्रोग्रामिंग के बारे में ज्यादा जानकारी नहीं थी, इसलिए हमने हाथ के इशारों का इस्तेमाल किया और दो सेकंड प्रति सेकंड की गति से संकेत दिया। बाएं से दाएं, हमारे कार्य बदले में थे:
Me: 001-000-1201101001----2
Friend: 00-10-=1-==--0100-1---1
उपरोक्त नियमों के अनुसार, मैं हार गया। देखते हो क्यों? यह इसलिए है क्योंकि मैंने अंतिम प्लाज्मा बीम को निकाल दिया था जब मेरे पास केवल 1 भरी हुई बारूद थी, जिससे मेरी बंदूक में विस्फोट हो गया था।
सी ++ प्लेयर
आप , एक सभ्य भविष्यवादी प्रोग्रामर के रूप में, सीधे बंदूकों को नहीं संभालेंगे। इसके बजाय, आप एक कोड है Player
कि दूसरों के खिलाफ लड़ता है '। गिटहब परियोजना में सार्वजनिक रूप से सी ++ वर्ग को विरासत में देकर, आप अपनी शहरी कथा लिखना शुरू कर सकते हैं।
Player.hpp can be found in Tournament\Player.hpp
An example of a derived class can be found in Tournament\CustomPlayer.hpp
आप क्या करना चाहिए या कर सकते हैं कर
- आपको
Player
पब्लिक इनहेरिटेंस के माध्यम से क्लास इनहेरिट करना होगा और अपनी क्लास फाइनल घोषित करनी चाहिए । - आपको ओवरराइड करना चाहिए
Player::fight
, जोPlayer::Action
हर बार इसे कहा जाने वाला वैध रिटर्न देता है । - वैकल्पिक रूप से, ओवरराइड करें
Player::perceive
औरPlayer::declared
अपने प्रतिद्वंद्वी के कार्यों पर नज़र रखें और अपनी जीत का ट्रैक रखें। - वैकल्पिक रूप से, अपने जटिल वर्ग में अधिक जटिल गणना करने के लिए निजी स्थिर सदस्यों और विधियों का उपयोग करें।
- वैकल्पिक रूप से, अन्य C ++ मानक पुस्तकालयों का उपयोग करें।
आपको क्या नहीं करना चाहिए
- आपको दिए गए प्रतिद्वंद्वी पहचानकर्ता के अलावा अपने प्रतिद्वंद्वी को पहचानने के लिए किसी भी प्रत्यक्ष विधि का उपयोग नहीं करना चाहिए , जिसे प्रत्येक टूर्नामेंट की शुरुआत में बदल दिया जाता है। आपको केवल यह अनुमान लगाने की अनुमति है कि एक खिलाड़ी एक टूर्नामेंट के भीतर अपने खेल-खेल के माध्यम से कौन है।
- आपको क्लास में किसी भी तरीके को ओवरराइड नहीं करना चाहिए
Player
जिसे वर्चुअल घोषित नहीं किया गया है। - आपको वैश्विक दायरे में कुछ भी घोषित या आरंभ नहीं करना चाहिए ।
- (अब अयोग्य) की शुरुआत के बाद से
BlackHatPlayer
, खिलाड़ियों को आपके प्रतिद्वंद्वी की स्थिति को देखने या संशोधित करने की अनुमति नहीं है ।
एक उदाहरण द्वंद्व
एक बंदूक द्वंद्वयुद्ध की प्रक्रिया GunDuel
कक्षा का उपयोग करके की जाती है । एक उदाहरण की लड़ाई के लिए, एक द्वंद्व शुरू करने वालेSource.cpp
अनुभाग में देखें ।
हम प्रदर्शन करते हैं GunClubPlayer
, HumanPlayer
और GunDuel
वर्ग, जिसे Tournament\
रिपॉजिटरी की निर्देशिका में पाया जा सकता है।
प्रत्येक द्वंद्वयुद्ध में, GunClubPlayer
एक गोली लोड करेगा; इसे आग लगाओ; धोये और दोहराएं। हर मोड़ के दौरान, HumanPlayer
आपको अपने प्रतिद्वंद्वी के खिलाफ खेलने के लिए कार्रवाई के लिए संकेत देगा। अपने कुंजीपटल नियंत्रण चरित्र 0
, 1
, 2
, -
और =
। विंडोज पर, आप HumanPlayer
अपने सबमिशन को डीबग करने के लिए उपयोग कर सकते हैं ।
द्वंद्व शुरू करना
यह आप कंसोल के माध्यम से अपने खिलाड़ी को कैसे डिबग कर सकते हैं।
// 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();
}
उदाहरण के खेल
हारने के लिए आपको कम से कम बदलाव की आवश्यकता होती GunClubPlayer
है। 3. यहां के 0-1
खिलाफ खेलने से पुनरावृत्ति होती है GunClubPlayer
। जब बारी खत्म होती है, तो प्रत्येक खिलाड़ी के लिए लोड किए गए बारूद की संख्या पैरेन्थेसिस में होती है।
:: 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
अवैध चाल के बिना पराजित होने का सबसे तेज़ तरीका अनुक्रम है 0=
, क्योंकि थर्मल डिफ्लेक्टर के माध्यम से गोली सही गोली मारती है। रिप्ले है
:: 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 . . .
प्रतियोगिता
टूर्नामेंट "अंतिम खिलाड़ी स्थायी" प्रारूप का अनुसरण करता है। एक टूर्नामेंट में, सभी वैध प्रस्तुतियाँ (सहित GunClubPlayer
) एक पूल में रखी जाती हैं। प्रत्येक प्रस्तुत को एक यादृच्छिक अभी तक अद्वितीय पहचानकर्ता सौंपा गया है जो पूरे टूर्नामेंट के दौरान समान रहेगा। प्रत्येक दौर के दौरान:
- प्रत्येक सबमिशन 0 अंकों के साथ शुरू होता है और हर दूसरे सबमिशन के खिलाफ 100 युगल खेलेंगे।
- प्रत्येक विजयी द्वंद्व 1 अंक प्रदान करेगा; ड्राइंग और हार 0 अंक देते हैं।
- दौर के अंत में, न्यूनतम अंक के साथ प्रस्तुतियाँ टूर्नामेंट को छोड़ देती हैं। एक टाई के मामले में, टूर्नामेंट की शुरुआत के बाद से अर्जित किए गए कम से कम अंक वाले खिलाड़ी निकल जाएंगे।
- यदि एक से अधिक खिलाड़ी बचे हैं, तो अगला दौर शुरू होगा।
- पॉइंट्स अगले राउंड तक नहीं जाते हैं।
प्रस्तुत करने
आप प्रति उत्तर एक खिलाड़ी जमा करेंगे। आप एक खिलाड़ी के लिए कई फाइलें जमा कर सकते हैं, जब तक कि वे अन्य सबमिशन में हस्तक्षेप न करें। चीजों को बहते रहने के लिए, कृपया:
- अपनी मुख्य हेडर फ़ाइल को नाम दें
<Custom>Player.hpp
, - अपनी अन्य फ़ाइलों को नाम दें
<Custom>Player*.*
, जैसेMyLittlePlayer.txt
कि यदि आपकी कक्षा का नाम हैMyLittlePlayer
, याEmoPlayerHates.cpp
यदि आपकी कक्षा का नाम हैEmoPlayer
। - यदि आपके नाम में
Shooter
या इसी तरह के शब्द हैं जो इस टूर्नामेंट के संदर्भ में फिट हैं, तो आपकोPlayer
अंत में जोड़ने की आवश्यकता नहीं है । यदि आप दृढ़ता से महसूस करते हैं कि आपके सबमिशन का नाम प्रत्यय के बिना बेहतर काम करता हैPlayer
, तो आपको भी जोड़ने की आवश्यकता नहीं हैPlayer
। - सुनिश्चित करें कि आपका कोड विंडोज के तहत संकलित और लिंक किया जा सकता है।
आप स्पष्टीकरण मांगने या खामियों को दूर करने के लिए टिप्पणी कर सकते हैं। आशा है कि आप इस फ्यूचरिस्टिक गन द्वंद का आनंद लेंगे और आपको नए साल की शुभकामनाएं देंगे!
स्पष्टीकरण
- आपको यादृच्छिक व्यवहार करने की अनुमति है।
- अमान्य कार्रवाइयाँ (लोडिंग बारूद पर्याप्त नहीं होने पर फायरिंग) की अनुमति है।
- यदि कोई खिलाड़ी अमान्य इनपुट करता है, तो उनकी बंदूक तुरंत फट जाएगी।
- आपको उत्तरों का अध्ययन करने की अनुमति है।
- आपको स्पष्ट रूप से प्रत्येक टूर्नामेंट के भीतर प्रतिद्वंद्वी व्यवहार को रिकॉर्ड करने की अनुमति है।
- प्रत्येक दौर में, आप प्रत्येक प्रतिद्वंद्वी के खिलाफ 100 युगल खेलेंगे; हालांकि, 100 युगल के क्रम को यादृच्छिक किया जाता है - आप एक ही प्रतिद्वंद्वी 100 युगल को एक पंक्ति में लड़ने की गारंटी नहीं देते हैं।
अतिरिक्त संसाधन
@flawr ने C ++ स्रोत को जावा में एक संदर्भ के रूप में अनुवादित किया है यदि आप C ++ प्रविष्टियाँ सबमिट करना चाहते हैं।
नॉन-सी ++ सबमिशन के लिए इंटरफेस
वर्तमान में स्वीकृत: पायथन 3, जावा।
कृपया नीचे दिए गए विनिर्देशों में से एक का पालन करें:
इंटरफ़ेस विनिर्देश 1: निकास कोड
आपका सबमिशन प्रति बार एक बार चलेगा।
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.
आप अपने सबमिशन PythonPlayer\
और JavaPlayer\
डायरेक्टरीज़ को टेस्ट कर सकते हैं ।
इंटरफ़ेस विनिर्देश 2: stdin / stdout
(एच वाल्टर्स को क्रेडिट)
आपका सबमिशन प्रति टूर्नामेंट एक बार चलेगा।
I / O कैसे करें, इस पर सभी प्रविष्टियों के लिए एक निश्चित आवश्यकता है, क्योंकि स्टड और स्टडआउट दोनों टूर्नामेंट ड्राइवर से जुड़े होते हैं। इसका उल्लंघन करने पर गतिरोध पैदा हो सकता है। सभी प्रविष्टियों को इस सटीक एल्गोरिथ्म का पालन करना चाहिए (छद्म कोड में):
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
इधर, एफ में से एक है 0
, 1
, 2
, -
, या =
के लिए load / bullet / plasma / metal / thermal
। प्रक्रिया का अर्थ है कि आपके प्रतिद्वंद्वी ने वैकल्पिक रूप से जवाब दिया (यदि आप ऐसा कर रहे हैं तो अपने प्रतिद्वंद्वी के बारूद को ट्रैक करना भी शामिल है)। ध्यान दें कि प्रतिद्वंद्वी की कार्रवाई भी '0', '1', '2', '-', या '=' में से एक है, और दूसरे वर्ण में है।
फाइनल स्कोरबोर्ड
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 |
टूर्नामेंट 1 फरवरी, 2017 तक चलेगा जब तक कि अन्यथा नोट न किया गया हो।
Player
कार्यान्वयन की अनुमति दे सकते हैं जो वर्तमान मोड़ की गणना करने के लिए किसी अन्य प्रक्रिया को आमंत्रित करता है। इससे लोग आपकी मशीन पर चलने वाली किसी भी भाषा में भाग ले सकेंगे।
Player::fight
" / "आप वारिस कर सकते हैं Player::perceive
" ... दोनों ही मामलों में, शब्द ओवरराइड है , इनहेरिट नहीं ।
GunDuel.hpp
, दोनों validA
का validB
उपयोग करें औरactionA