चलो एक टैंक युद्ध है!
आंशिक रूप से नष्ट कर उन्हें लेज़रों के साथ प्रेरित किया
उद्देश्य
आपका काम एक टैंक को नियंत्रित करना है। 2 डी युद्ध के मैदान में अन्य टैंकों और बाधाओं को चारों ओर घुमाएं और शूटिंग करें। आखिरी टैंक खड़े होंगे विजेता!
नक्शा प्रारूप
आपका टैंक एक के आधार पर एक 2D मैदान पर किया जाएगा nद्वारा nइकाई वर्गों के ग्रिड। मैं यह तय करूंगा कि nसबमिशन की संख्या के आधार पर क्या होगा । प्रत्येक वर्ग में केवल एक ही हो सकता है:
- एक टैंक
- एक पेड़
- एक चट्टान
- एक दीवार
- कुछ भी तो नहीं
सभी बाधाएं और टैंक पूरी तरह से अपने रिक्त स्थान को भर देते हैं, और वे उन सभी शॉट्स को रोकते हैं जो उन्हें नुकसान पहुंचाने वाली चीजों से और नीचे गिराते हैं।
यहाँ #= टैंक के साथ एक क्षेत्र का एक उदाहरण है ; T= पेड़; R= रॉक; W= दीवार; .= n10 के साथ कुछ भी नहीं
.....#....
..T....R..
WWW...WWWW
W......T..
T...R...Ww
W...W.....
W....W...T
WWWWWW...R
W.........
WWWWWWRT..
निर्देशांक उस प्रारूप में हैं x, yजहां xबाएं से दाएं yबढ़ता है और नीचे से ऊपर की तरफ बढ़ता है। निचले बाएँ स्थान में समन्वय है 0, 0। प्रत्येक टैंक किसी भी खाली जगह पर जा सकता है और किसी भी दिशा में शूट कर सकता है।
नक्शा गतिशीलता
आपके टैंक को अन्य टैंक शूट करने की जरूरत नहीं है! यदि यह नक्शे पर कुछ शूट करता है, तो चीजें हो सकती हैं।
- यदि एक दीवार पर गोली चलाई जाती है, तो यह कुछ संख्या में शॉट्स के बाद नष्ट हो जाएगी, 1 से 4 तक
- यदि किसी पेड़ पर गोली चलाई जाती है, तो उसे तुरंत नष्ट कर दिया जाएगा
- यदि एक चट्टान पर गोली चलाई जाती है, तो शॉट उसके ऊपर से गुजरेगा और हिट होने वाली अगली चीज को नुकसान पहुंचाएगा
एक बार जब कुछ नष्ट हो जाता है, तो यह अब नक्शे पर नहीं है (इसे कुछ नहीं के साथ बदल दिया जाएगा)। यदि एक शॉट एक बाधा को नष्ट कर देता है, तो यह अवरुद्ध हो जाएगा और इसके रास्ते में आगे कुछ भी नुकसान नहीं होगा।
टैंक की गतिशीलता
प्रत्येक टैंक life= 100 से शुरू होता है । एक टैंक पर प्रत्येक शॉट lifeदूरी के आधार पर 20-30 को कम करेगा । यह delta_life=-30+(shot_distance*10/diagonal_map_length)(जहां diagonal_map_lengthहै (n-1)*sqrt(2)) के साथ गणना की जा सकती है । इसके अतिरिक्त, प्रत्येक टैंक 1 lifeप्रति बारी पुनर्जीवित होता है ।
बदल जाता है
कुछ संख्या में राउंड चलाए जाएंगे (मैं एक बार सबमिशन होने के बाद तय करूंगा)। हर दौर की शुरुआत में, एक नक्शा यादृच्छिक रूप से उत्पन्न किया जाएगा, और यादृच्छिक खाली स्थानों में टैंक उस पर रखे जाएंगे। हर दौर के दौरान, प्रत्येक टैंक को किसी भी मनमाने क्रम में एक मोड़ दिया जाएगा। प्रत्येक टैंक को एक मोड़ दिए जाने के बाद, उन्हें उसी क्रम में फिर से मोड़ दिए जाएंगे। दौर तब तक जारी रहता है जब तक कि केवल एक टैंक शेष न हो। वह टैंक विजेता होगा, और उन्हें 1 अंक प्राप्त होगा। खेल फिर अगले दौर में जाएगा।
एक बार सभी राउंड चलने के बाद, मैं इस प्रश्न पर स्कोर पोस्ट करूँगा।
एक टैंक के मोड़ के दौरान, यह निम्न में से एक कर सकता है
- एक दिशा में 3 स्थानों तक, क्षैतिज या लंबवत रूप से ले जाएँ। यदि टैंक को एक बाधा या किसी अन्य टैंक द्वारा अवरुद्ध किया जाता है, तो इसे बाधा या टैंक से गुजरे बिना जहाँ तक संभव होगा, ले जाया जाएगा।
- किसी दिशा में गोली मारो, डिग्री में एक अस्थायी बिंदु कोण द्वारा दर्शाया गया। आपके टैंक के स्थानीय स्थान का एक्स-अक्ष (क्षैतिज रूप से बाएं से दाएं, उर्फ पूर्व या
TurnAction.Direction.EAST) 0deg है, और कोण वामावर्त बढ़ाते हैं। शॉट्स गलत हैं, और शॉट का वास्तविक कोण आपके द्वारा चुने गए कोण से 5 डिग्री अधिक या कम हो सकता है। - कुछ मत करो।
मोड़ समय में सीमित नहीं हैं, लेकिन इसका मतलब यह नहीं है कि आप जानबूझकर सब कुछ लटका देने के लिए समय बर्बाद कर सकते हैं।
प्रविष्टियों / प्रोटोकॉल
प्रस्तुत प्रत्येक कार्यक्रम मैदान पर एक टैंक को नियंत्रित करेगा। नियंत्रण कार्यक्रम जावा में है, इसलिए आपके कार्यक्रमों को अभी जावा में होने की आवश्यकता है (मैं शायद किसी बिंदु पर अन्य भाषाओं के लिए एक आवरण लिखूंगा, या आप अपना खुद का लिख सकते हैं)।
आपके कार्यक्रम Tankइंटरफ़ेस को कार्यान्वित करेंगे , जिसमें निम्नलिखित विधियाँ हैं:
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();
}
Battlefieldवर्ग (वस्तुओं की एक 2 डी सरणी शामिल Battlefield.FIELD_SIZEद्वारा Battlefield.FIELD_SIZEजो युद्ध के मैदान पर चीजों का प्रतिनिधित्व करता है)। Battlefield.getObjectTypeAt(...)एक दे देंगे FieldObjectTypeनिर्दिष्ट निर्देशांक पर वस्तु के लिए (में से एक FieldObjectType.ROCK, FieldObjectType.TREE, FieldObjectType.TANK, FieldObjectType.WALL, या FieldObjectType.NOTHING)। यदि आप किसी ऑब्जेक्ट को मैप की सीमा से बाहर निकालने की कोशिश करते हैं (निर्देशांक <0 या> = Battlefield.FIELD_SIZE) तो एक IllegalArgumentExceptionफेंक दिया जाएगा।
MapPointमानचित्र पर बिंदुओं को निर्दिष्ट करने के लिए एक वर्ग है। का उपयोग करें MapPoint.getX()औरMapPoint.getY() निर्देशांक का उपयोग करने की।
संपादित करें: कुछ उपयोगिता तरीकों जोड़ा गया है: MapPoint.distanceTo(MapPoint), MapPoint.angleBetween(MapPoint), Battlefield.find(FieldObjectType), और TurnAction.createShootActionRadians(double)के रूप में द्वारा सुझाए गए Wasmoo ।
अधिक जानकारी javadocs में मिल सकती है, नीचे अनुभाग देखें।
सभी (सार्वजनिक एपीआई) कक्षाएं पैकेज के अंतर्गत हैं zove.ppcg.tankwar।
नियंत्रण कार्यक्रम
नियंत्रण कार्यक्रम और टैंक एपीआई के पूर्ण स्रोत और javadocs मेरे GitHub रेपो पर पाया जा सकता है: https://github.com/Hungary-Dude/TankWarControl
यदि आप बग देखते हैं या सुधार चाहते हैं तो पुल अनुरोध भेजने और / या टिप्पणी करने के लिए स्वतंत्र महसूस करें।
मैंने दो सैंपल टैंक प्रोग्राम लिखे हैं, RandomMoveTankऔर RandomShootTank(नाम यह सब कहता है)।
अपने टैंक को चलाने के लिए, अपने पूरी तरह से योग्य (पैकेज का नाम + वर्ग का नाम) टैंक वर्ग को tanks.list(एक कक्षा प्रति लाइन) जोड़ें, आवश्यक के रूप में सेटिंग्स को संपादित करें zove.ppcg.tankwar.Control(देरी करें, क्षेत्र के जीयूआई प्रतिनिधित्व को दिखाने के लिए या नहीं, आदि), और भागो zove.ppcg.tankwar.Control। सुनिश्चित करें कि सूची में कम से कम 2 टैंक हैं, या परिणाम अपरिभाषित हैं। (यदि आवश्यक हो तो नमूना टैंक का उपयोग करें)।
इस नियंत्रण कार्यक्रम के तहत आपके कार्यक्रम मेरी मशीन पर चलाए जाएंगे। इसे लिखते ही मुझे स्रोत का लिंक मिल जाएगा। स्रोत के लिए सुझाव देने के लिए स्वतंत्र महसूस करें।
नियम
- आपकी प्रस्तुतियाँ ऊपर दिए गए दिशानिर्देशों का पालन करना चाहिए
- आपके प्रोग्राम किसी भी तरह से मेरी मशीन पर हमला करने के लिए फाइल सिस्टम, नेटवर्क या एक्सेस का प्रयास नहीं कर सकते हैं
- आपके कार्यक्रम धोखा देने के लिए मेरे नियंत्रण कार्यक्रम का फायदा उठाने का प्रयास नहीं कर सकते
- कोई ट्रोलिंग (जैसे जानबूझकर अपने कार्यक्रम को सब कुछ लटका देने के लिए समय बर्बाद करना)
- आपके पास एक से अधिक सबमिशन हो सकते हैं
- प्रस्तुतियाँ के साथ रचनात्मक होने की कोशिश करो!
- मैं कार्यक्रमों को मनमाने ढंग से अनुमति देने या न करने का अधिकार सुरक्षित रखता हूं
सौभाग्य!
अद्यतन: दीवार टेलीपोर्टेशन बग को ठीक करने और पुनर्जनन को लागू करने के बाद, मैंने 100 राउंड के लिए वर्तमान प्रस्तुतियाँ चलाईंBattlefield.FIELD_SIZE = 30
अद्यतन 2: मैंने कुछ समय के लिए ग्रूवी के साथ बेवकूफ बनाने के बाद नया सबमिशन, रनटैंक जोड़ा ...
अपडेट किए गए परिणाम:
+-----------------+----+
| RandomMoveTank | 0 |
| RandomShootTank | 0 |
| Bouncing Tank | 4 |
| Richard-A Tank | 9 |
| Shoot Closest | 19 |
| HunterKiller 2 | 22 |
| RunTank | 23 |
| Dodge Tank | 24 |
+-----------------+----+
वर्तमान में टैंक प्रति चक्कर 1 जीवन को पुन: उत्पन्न करते हैं। क्या इसे बढ़ाया जाना चाहिए?
MapPoint'एसxऔरyfloats? क्या उन्हें नहीं होना चाहिएints?