यदि आप कभी Spacewar खेला है ! , तुम्हें पता है कि यह एक मजेदार खेल था। यदि आप नहीं जानते हैं, तो यह पता है: यह (और है) बहुत पहले और सबसे महत्वपूर्ण कंप्यूटर गेम में से एक है। और यह अभी भी मजेदार है! मैं जिस क्लोन पर बड़ा हुआ हूं वह यह एक है , जो कि जाहिरा तौर पर और दुर्भाग्य से, केवल विंडोज है। तो मैंने इसे फिर से बनाया!
कोट को यहां होस्ट किया गया है: पीपीसीजी - स्पेसवार! पहाड़ी का राजा । मैं आपको एक इंसान के रूप में खेलने के लिए प्रोत्साहित करता हूं कि कम से कम एक अन्य बॉट के खिलाफ खेल कैसे काम करता है।
खेल
- एक फ्रेम 30 मिलीसेकंड है (इस प्रकार, लगभग 33 फ्रेम प्रति सेकंड)।
- यह क्षेत्र 800 पिक्सेल चौड़ा और 600 पिक्सेल लंबा है।
- क्षेत्र टॉरॉयडल है, जिसका अर्थ है कि स्पेसशिप और मिसाइल जो मैदान के बाहर जाती हैं, विपरीत दिशा में फिर से दिखाई देती हैं।
- लाल और नीले दो स्पेसशिप हैं।
- Red को x = 50 पर और यादृच्छिक y को 50, (फ़ील्ड ऊँचाई - 50) पिक्सेल के बीच स्थित किया गया है।
- ब्लू को x = (फ़ील्ड की चौड़ाई - 50) और यादृच्छिक y के बीच 50, (फ़ील्ड की ऊँचाई - 50) पिक्सेल पर स्थित किया जाता है।
- दोनों का सामना x = (क्षेत्र की चौड़ाई) / 2 है।
- उपलब्ध नियंत्रण हैं:
- बाएं मुड़ें - फ्रेम प्रति वामावर्त 5 डिग्री।
- दाएँ मुड़ें - फ्रेम प्रति 5 डिग्री दक्षिणावर्त।
- अग्नि मिसाइल - जहाज के वेग के अलावा प्रति फ्रेम अतिरिक्त 10 पिक्सल पर यात्रा करती है, जिस दिशा में जहाज इशारा कर रहा था।
- फायर इंजन - जिस स्पेसशिप की ओर इशारा किया जा रहा है उस दिशा में प्रति फ्रेम 0.30 पिक्सल पर स्पेसशिप को तेज करता है।
- हाइपरस्पेस कूद - क्षेत्र में कुछ यादृच्छिक निर्देशांक को टेलीपोर्ट करता है, जिसमें विस्फोट का 25% मौका होता है। ये यादृच्छिक निर्देशांक सूरज के ऊपर हो सकते हैं।
- गुरुत्वाकर्षण शक्ति को बढ़ाने पर जहाजों की अधिकतम गति इंजन शक्ति के तहत प्रति फ्रेम 15 पिक्सेल और फ्रेम प्रति 40 पिक्सेल है।
- प्रति फ्रेम 15 पिक्सेल से अधिक तेज़ गति से यात्रा करने पर इंजन जोर केवल दिशा बदल सकता है या धीमा हो सकता है।
- मिसाइलों के बारे में:
- मिसाइल एक सीधी रेखा में यात्रा करते हैं।
- मिसाइलों को अधिकतम प्रति 1 सेकंड 0.1 सेकंड में दागा जा सकता है।
- मिसाइलों का जीवनकाल 2.25 सेकंड है।
- जहाजों में प्रत्येक में अधिकतम 20 मिसाइलें होती हैं।
- मिसाइल आंतरिक रूप से बिंदु कण हैं।
- बहुत केंद्र में एक सूरज है जो आपके जहाज के लिए बेहद खतरनाक है। थोड़ी सी भी संपर्क घातक है। यह सूरज मिसाइलों को भी नष्ट कर देता है।
- सूर्य में गुरुत्वाकर्षण है। परिणामी त्वरण 5000 / (दूरी ^ 2) पिक्सेल / फ्रेम ^ 2 है, जहां दूरी पिक्सल में है। स्पेसशिप और मिसाइल प्रभावित होते हैं।
- दोनों जहाजों में तीन स्ट्राइक जोन होते हैं: नाक, बाईं विंग और राइट विंग।
- नाक पर एक चोट तत्काल मृत्यु है।
- दोनों तरफ से एक हिट स्पेसशिप की टर्न रेट और इंजन त्वरण को आधे से कम कर देता है।
- यदि दोनों पंखों को नष्ट कर दिया जाता है, तो अंतरिक्ष यान को पैंतरेबाज़ी नहीं की जा सकती है और केवल अग्नि मिसाइलें ही दागी जा सकती हैं।
- जहाज आपस में टकरा सकते हैं।
- नाक-नाक का प्रभाव दोनों जहाजों के लिए घातक है।
- एक नाक-विंग प्रभाव विंग को नष्ट कर देता है।
- विंग-विंग प्रभाव दोनों पंखों को नष्ट कर देता है।
- मृत जहाज ठोस और जमे हुए हैं जब तक कि वे 1 सेकंड बाद में विस्फोट न करें।
- कम से कम एक जहाज के मरने के बाद, फ़ील्ड को 3 सेकंड बाद रीसेट किया जाता है। तब तक, सूरज और किसी भी शेष मिसाइल अभी भी खतरनाक हैं।
मूल गेम में घातक और अविनाशी क्षुद्रग्रह भी हैं, लेकिन मैं उन्हें शामिल नहीं करूंगा।
नियम
- आपका बॉट जावास्क्रिप्ट में लिखा होना चाहिए।
- आपके बॉट को अपने निर्णय को लगभग 10 मिली सेकेंड तक सीमित करना चाहिए। अगर मुझे आपके बॉट के कारण लगातार अंतराल की सूचना है , तो मैं इसे अयोग्य घोषित कर दूंगा और आपको बता दूंगा ताकि आप इसे ठीक कर सकें।
- बॉट्स की पहुंच निम्न तक होगी:
- क्षेत्र की चौड़ाई और क्षेत्र की ऊँचाई
- सूर्य की स्थिति और त्रिज्या
- दोनों जहाजों की स्थिति, रोटेशन, वेग, आकार, मिसाइल स्टॉक और हाइपरस्पेस स्थिति
- सभी मिसाइलों की स्थिति और वेग
- संकेत मिलने पर, आपके बॉट को स्ट्रिंग्स की एक सूची वापस देनी चाहिए।
- : ये तार निम्न में से एक होना चाहिए
turn left
,turn right
,fire engine
,fire missile
,hyperspace
। किसी भी अन्य स्ट्रिंग पर ध्यान नहीं दिया जाएगा। - यदि कोई डुप्लिकेट हैं, तो केवल पहले नोट किया जाएगा।
hyperspace
अन्य सभी पर पूर्वता लेता है।turn left
औरturn right
एक ही समय में कोई प्रभाव नहीं पड़ेगा।fire engine
यदि जहाज में केवल नाक है या मृत है तो कोई प्रभाव नहीं पड़ेगा।fire missile
हाल ही में एक मिसाइल दागी गई तो कोई प्रभाव नहीं पड़ेगा।
- : ये तार निम्न में से एक होना चाहिए
- सामान्य से बदलाव में, आपके बॉट को अन्य बॉट्स के व्यवहार का फायदा उठाने की अनुमति है। मैं एक मेटागैम को प्रोत्साहित करना चाहता हूं।
- बॉट अन्य बॉट्स का अनुकरण नहीं कर सकते हैं । (यानी, कोई मन पढ़ने वाला नहीं।)
- बोट्स खेल और भौतिकी कोड द्वारा उपयोग किए जाने वाले किसी भी चर को सेट नहीं कर सकते हैं । (यानी, कोई धोखा नहीं।)
बॉट कार्यान्वयन विवरण
मैं अपने बॉट को अपनी जावास्क्रिप्ट फ़ाइल में संग्रहीत कर रहा हूं जो स्वचालित रूप से फ़ाइल नाम के साथ शामिल है bot_<name>.js
। इसलिए ऐसा कोई स्पेस या कैरेक्टर न रखें, जो इस के साथ या जावास्क्रिप्ट में किसी फ़ंक्शन को नामांकित करने के साथ हस्तक्षेप करेगा। ऐसा इसलिए है क्योंकि आपको निम्नलिखित कार्यों को परिभाषित करना चाहिए: <name>_setup(team)
और <name>_getActions(gameInfo, botVars)
। इसके अलावा पेज नीचे, वहाँ के लिए textareas मौजूद userbot है, जो आप अपने कोड का परीक्षण करने के लिए संपादित कर सकते हैं।
<name>_setup(team)
यह फ़ंक्शन आपके लिए किसी भी वैरिएबल को परिभाषित करने के लिए है जिसे आप जारी रखना चाहते हैं। team
या तो हो जाएगा "red"
या "blue"
। इस फ़ंक्शन को एक ऑब्जेक्ट वापस करना होगा। जैसे चर को परिभाषित करें:
var vars = {};
vars['example'] = "example";
return vars;
इस vars
ऑब्जेक्ट को अन्य फ़ंक्शन में पास किया जाएगा:
<name>_getActions(gameInfo, botVars)
botVars
वस्तु द्वारा दिया है <name>_setup(team)
। gameInfo
निम्नलिखित चर वाली एक वस्तु है:
redScore
blueScore
timeLeft
fieldWidth
fieldHeight
sun_x
sun_y
sun_r //sun's radius
gravityStrength //acceleration in pixels/frame^2 at 1 pixel away from the sun's center
engineThrust //acceleration in pixels/frame^2
speedLimit //maximum speed under engine power
maxSpeed //maximum speed from gravity boosts
red_x
red_y
red_rot //rotation in degrees
red_xv //x velocity
red_yv //y velocity
red_shape //one of "full ship", "left wing", "right wing", "nose only"
red_missileStock //the number of missiles red has left
red_inHyperspace //true if red is in hyperspace
red_exploded //until red explodes, it is still solid and hazardous
red_alive
// likewise for blue //
numMissiles
missiles //this is a list of objects, each with the following variables
x
y
xv
yv
आपके बॉट की इन तक पूरी पहुंच है। मुझे पूरा यकीन है कि आप उन्हें लिख सकते हैं और मूल चर को प्रभावित नहीं कर सकते, लेकिन फिर भी ऐसा न करें। घुमाव पर एक नोट: जहाज + y दिशा में, नीचे की ओर इशारा करते हैं, इसलिए जहाज के साथ संरेखित करने के लिए जो कुछ भी आप 90 डिग्री से ऑफसेट करना चाहते हैं। इसके अलावा, सकारात्मक रोटेशन दक्षिणावर्त है।
इस फ़ंक्शन को आपके बॉट के कार्यों का प्रतिनिधित्व करते हुए, स्ट्रिंग की एक सूची वापस करनी चाहिए। उदाहरण के लिए, ["turn right","thrust"]
। इस पर अधिक विवरण नियम अनुभाग में हैं।
अतिरिक्त जानकारिया
आप निम्नलिखित का उपयोग भी कर सकते हैं:
LineIntersection(L1, L2)
L1 और L2 दो-तत्व सरणियों के दो-तत्व सरणियाँ हैं। वह है, L1 := [[x1,y1],[x2,y2]]
और L2 := [[u1,v1],[u2,v2]]
। यह फ़ंक्शन दो रेखाओं के प्रतिच्छेदन की गणना करता है और इसे लौटाता है [[x,y], [a,b]]
:। [x,y]
चौराहे बिंदु के निर्देशांक हैं और [a,b]
अनुपातों की एक जोड़ी है जो व्यक्त करते हैं कि प्रत्येक रेखा चौराहे बिंदु के साथ कितनी दूर है। जैसा कि, a = 0.25
इसका मतलब यह होगा कि प्रतिच्छेदन बिंदु से एक चौथाई रास्ता [x1,y1]
है [x2,y2]
, और इसी तरह के लिए b
। यदि कोई चौराहा नहीं है, तो एक खाली सरणी वापस आ जाती है।
window["shipShapes"]
var shipShapes = {
'full ship': [[-8,16],[0,-8],[8,16]],
'left wing': [[-8,16],[0,-8],[4,4],[0,8],[0,16]],
'right wing':[[-4,4],[0,-8],[8,16],[0,16],[0,8]],
'nose only': [[-4,4],[0,-8],[4,4],[0,8]]
};
ये जहाजों के बहुभुजों के निर्देशांक हैं। वर्तमान निर्देशांक को आसान बनाने के लिए, आप भी उपयोग कर सकते हैं ...
getShipCoords(<color>)
getShipCoords("red")
रेड के जहाज के कोने के वर्तमान निर्देशांक को वापस करेगा, और इसी तरह getShipCoords("blue")
ब्लू के लिए। ये निर्देशांक तो प्रकार की सूची में हैं: [[x1,y1],[x2,y2],[x3,y3],...]
। बहुभुज स्पष्ट रूप से बंद हैं, इसलिए पहले और अंतिम समन्वय जोड़े के बीच एक रेखा है।
आप गेम / वेबसाइट द्वारा उपयोग किए जाने वाले किसी भी अन्य चर या फ़ंक्शन को एक्सेस या बदल नहीं सकते हैं। और निश्चित रूप से अपने कार्यों को एक ही नाम न दें। मैं नहीं सोचता कि यह एक समस्या होगी, लेकिन यदि आपका बॉट गेम कोड को तोड़ता है, तो यह एक संभावना है। अपवादों की कोई लॉगिंग या पकड़ नहीं है।
जीतना
- बॉट की प्रत्येक जोड़ी को कम से कम 10 बार, दोनों तरीकों से खेला जाएगा। (इसलिए, कम से कम 20 गेम कुल।)
- समग्र रूप से उच्चतम जीत / हानि अनुपात प्राप्त करना । यदि आपका बॉट एक दूसरे बॉट के खिलाफ सुपर अच्छा करता है, लेकिन अन्य तीन के खिलाफ हारता है, तो यह दो के खिलाफ जीतने और दो के खिलाफ हारने के रूप में अच्छा नहीं है (अंगूठे के सामान्य नियम के रूप में)।
- प्रत्येक बॉट के लिए, अनुपात (जीत + 1) / (नुकसान + 1) की गणना की जाएगी, फिर इन अनुपातों के औसत और मानक विचलन की गणना की जाएगी। उच्चतर माध्य की प्राथमिकता होगी, और यदि माध्य एक दूसरे की 1 इकाई के भीतर है, तो निम्न विचरण की प्राथमिकता होगी।
- स्कोरिंग या तो आज से एक सप्ताह में शुरू होगी या तीन दिनों के बाद नई प्रस्तुतियाँ नहीं होगी। ऐसा इसलिए है कि मुझे बॉट्स की किसी भी जोड़ी को दोहराना नहीं है।
सबसे ऊपर, मज़े करो!
लीडरबोर्ड (2016-01-08 05:15):
# Name Mean StdDev
1. Helios 13.625 6.852
2. EdgeCase 8.335 8.155
3. OpponentDodger 8.415 8.186
4. OrbitBot 5.110 6.294
5. SunAvoider 5.276 6.772
6. DangitBobby 3.320 4.423
7. SprayAndPray 3.118 4.642
8. Engineer 3.903 6.315
9. RighthandedSpasms 1.805 2.477
10. AttackAndComeBack 2.521 2.921
11. PanicAttack 2.622 3.102
12. FullSpeedAhead 2.058 3.295
13. UhhIDKWhatToCallThisBot 2.555 3.406
14. MissilesPlusScore 0.159 0.228
15. Hyper 0.236 0.332
16. RandUmmm 0.988 1.329
17. Kamikaze 0.781 1.793
नोट: यह परिवर्तन के अधीन है क्योंकि मैं अधिक गेम चलाता हूं। इसके अलावा, रैंकों का क्रम 9-13 मुझे परेशान करता है, इसलिए मैं स्कोरिंग पद्धति को बेहतर तरीके से जोड़ सकता हूं कि वे कैसे रैंक की जानी चाहिए।
(माध्य और मानक विचलन को तीन दशमलव अंकों के लिए गोल किया गया था। इसके अलावा, Hyper
होना चाहिए HYPER
लेकिन यह हाइलाइटिंग को गड़बड़ करता है।:)
LineIntersection
गैर-अंतर-खंड खंडों पर कॉल करना एक खाली सरणी देता है।