पहचान
यह एक इंटरेक्टिव किंग-ऑफ-द-हिल प्रतियोगिता है, जहां नियंत्रक पूरी तरह से स्टैक स्निपेट में प्रश्न के निचले भाग में निहित होता है। नियंत्रक स्वचालित रूप से उत्तर पढ़ता है और गेम के माध्यम से खेलता है। कोई भी किसी भी समय अपने ब्राउज़र में इसे चला सकता है।
इस प्रतियोगिता के यांत्रिकी रेड बनाम ब्लू - पिक्सेल टीम बैटलबोट्स के समान हैं । खेल को छोड़कर, जबकि ग्रिड आधारित है, पूरी तरह से अलग है। प्रत्येक खेल 1 बनाम 1 है और कोई टीम नहीं है। प्रत्येक प्रविष्टि अपने लिए लड़ रही है और केवल एक ही अंतिम चैंपियन होगा।
नियंत्रक जावास्क्रिप्ट का उपयोग करता है, और चूंकि जावास्क्रिप्ट एकमात्र क्लाइंट-साइड स्क्रिप्टिंग भाषा है जो अधिकांश ब्राउज़र समर्थन करते हैं, सभी उत्तर जावास्क्रिप्ट में भी लिखे जाने चाहिए ।
इस संबंध में, इटैलिकाइज़्ड टेक्स्ट का उपयोग गेम मैकेनिक या संपत्ति के लिए औपचारिक शब्द को इंगित करने के लिए किया जाता है। इन शब्दों का उपयोग खेल के विभिन्न हिस्सों को संदर्भित करने के एक सुसंगत और स्पष्ट तरीके को बनाए रखने में मदद करने के लिए किया जाता है।
गेमप्ले
मूल बातें
इस सवाल का हर जवाब एक खिलाड़ी का प्रतिनिधित्व करता है । एक खेल दो खिलाड़ियों के बीच एक प्रतियोगिता है P1 और P2 । प्रत्येक खिलाड़ी 8 बॉट्स के झुंड को नियंत्रित करता है , 0 के माध्यम से 0 गिना जाता है। खेल ग्रिड में होता है , एक 128 × 64 सेल का अखाड़ा जिसकी नीचे की 8 पंक्तियाँ दीवारों ('ब्लॉक') के रूप में शुरू होती हैं और अन्य पंक्तियाँ हवा के रूप में शुरू होती हैं । ग्रिड सीमा के बाहर की कोशिकाओं को वायु माना जाता है।
ग्रिड का x समन्वय बाईं ओर 0 से दाईं ओर 127 तक है, और y 0 से लेकर शीर्ष पर 63 तक सबसे नीचे है।
नमूना शुरू ग्रिड:
बोट्स हमेशा ग्रिड कोशिकाओं से जुड़े रहते हैं और कई बॉट एक ही सेल पर कब्जा कर सकते हैं। बॉट केवल वायु कोशिकाओं पर कब्जा कर सकते हैं। P1 के बॉट हमेशा दीवारों के ऊपर की पंक्ति के बाईं ओर एक पंक्ति 0-4 में शुरू होते हैं और P2 के बॉट हमेशा एक पंक्ति में 7-0 से शुरू होते हैं।
पड़ोसियों को कोई बॉट या सेल के 8 कोशिकाओं को सीधे ओर्थोगोनल और इसे करने के लिए विकर्ण हैं।
एक बॉट का दृश्य ( FOV ) एक बॉट पर केंद्रित 13 × 13 सेल वर्ग है। एक सेल या दुश्मन बॉट को खिलाड़ी के FOV में कहा जाता है अगर यह खिलाड़ी के बॉट में से कम से कम एक FOV में हो।
चाल और कार्य
एक खेल के दौरान, प्रत्येक खिलाड़ी के पास जाए ले जाने के 1000 बार। पी 1 पहले चलता है, फिर पी 2, फिर पी 1 और इसी तरह 2000 तक कुल चालें बनी हैं, जिस बिंदु पर खेल समाप्त होता है।
एक चाल के दौरान, प्रत्येक खिलाड़ी अपने FOV में खेल की स्थिति और ग्रिड कोशिकाओं और दुश्मन बॉट के बारे में जानकारी प्राप्त करता है, और इसका उपयोग करने के लिए अपने प्रत्येक बॉट के लिए एक कार्रवाई पर निर्णय लेने के लिए इसका उपयोग करता है ।
डिफ़ॉल्ट कार्रवाई कुछ भी नहीं है , जहां बॉट ग्रिड के साथ स्थानांतरित या बातचीत नहीं करता है।
अन्य क्रियाएं मूव , ग्रैब और प्लेस हैं :
एक बॉट कर सकते हैं ले जाने के उसके पड़ोसी कोशिकाओं सी अगर से एक के लिए:
- C सीमा से बाहर नहीं है,
- सी हवा है (यानी एक दीवार नहीं),
- और सी के पड़ोसियों में से कम से कम एक दीवार है।
सफल होने पर, बोट C के पास चला जाएगा।
एक बॉट अपने पड़ोसी कोशिकाओं में से एक को पकड़ सकता है यदि:
- C सीमा से बाहर नहीं है,
- सी एक दीवार है,
- और बॉट पहले से ही एक दीवार नहीं ले जा रहा है।
सफल होने पर, C हवा हो जाएगी और बॉट अब एक दीवार ले जाएगा।
एक बॉट अपने पड़ोसी कोशिकाओं में से एक को स्थान दे सकता है यदि:
- C सीमा से बाहर नहीं है,
- सी हवा है,
- या तो खिलाड़ी का कोई बॉट C नहीं है,
- और बॉट एक दीवार ले जा रहा है।
सफल होने पर, सी एक दीवार बन जाएगी और बॉट अब दीवार लेकर नहीं जाएगा।
असफल कार्यों के परिणामस्वरूप कुछ भी नहीं होता है।
कम से कम एक दीवार ढोने वाले बॉट के कब्जे वाले एक सेल में दीवार के एक छोटे से वर्ग को खींचा जाता है। बॉट बिना दीवारों के शुरू होते हैं।
याद
एक चाल के दौरान, एक खिलाड़ी अपनी मेमोरी को एक्सेस कर सकता है और बदल सकता है , शुरू में खाली स्ट्रिंग जो पूरे खेल में रहता है और इसका उपयोग रणनीतिक डेटा को स्टोर करने के लिए किया जा सकता है।
लक्ष्य
पीले क्रॉसहेयर में सेल लक्ष्य है , जो एक यादृच्छिक स्थिति में शुरू होता है। प्रत्येक खिलाड़ी का एक अंक होता है, जो 0. से शुरू होता है। जब किसी खिलाड़ी का बॉट गोल पर जाता है, तो उस खिलाड़ी का स्कोर 1 से बढ़ जाता है और अगले मोड़ से पहले लक्ष्य को बेतरतीब ढंग से रिप्लेस किया जाता है। एक खेल के अंत में उच्चतम स्कोर वाला खिलाड़ी जीतता है। यह एक टाई है अगर स्कोर बराबर हैं।
यदि एक मूव के दौरान कई बॉट गोल में जाते हैं, तो खिलाड़ी को केवल एक पॉइंट मिलता है।
यदि लक्ष्य 500 चालों के लिए एक ही स्थान पर रहा है, तो यह बेतरतीब ढंग से फिर से जमा हो जाता है। किसी भी समय लक्ष्य को बेतरतीब ढंग से तैनात किया जाता है, यह एक बॉट द्वारा कब्जा किए गए सेल पर नहीं रखे जाने की गारंटी है।
क्या प्रोग्राम करें
इस कार्य के लिए एक निकाय लिखें :
function myMove(p1, id, eid, move, goal, grid, bots, ebots, getMem, setMem) {
//body goes here
}
यह उस समय कहा जाएगा जब आपका खिलाड़ी हर बार कदम उठाएगा और आपको उस कदम के दौरान अपने प्रत्येक बॉट को लेने की जरूरत है।
आप शुरुआती बिंदु के रूप में बेसलाइन कोड का उपयोग कर सकते हैं ।
पैरामीटर
p1
एक बूल है किtrue
अगर आप पी 1 हैं औरfalse
अगर आप पी 2 हैंid
एक पूर्णांक है जो आपके उत्तर की उत्तर आईडी है।
- आप नीचे दिए गए 'शेयर' लिंक पर क्लिक करके और
a/
URL के ठीक बाद वाले नंबर की तलाश करके किसी उत्तर की आईडी पा सकते हैं ।- टेस्ट एंट्री की आईडी -1 है।
eid
एक पूर्णांक है जो आपके दुश्मन के उत्तर की आईडी है।move
1 से 1000 तक पूर्णांक है जो कहता है कि आप किस चाल पर हैं।goal
x
औरy
गुणों के साथ एक वस्तु है । ये लक्ष्य के समन्वय हैं। भले ही लक्ष्य आपके FOV से बाहर हो, उन्हें दिया जाता है।grid
एक फ़ंक्शन है जो x और y तर्क में लेता है, उदाgrid(x,y)
। यह रिटर्न:
-1
'अज्ञात' के लिए यदि तर्क दो पूर्णांक नहीं हैं या यदिx,y
आपके FOV में नहीं है।0
'हवा' के लिए यदिx,y
सीमा से बाहर है या यदि सेलx,y
हवा में है।1
'दीवार' के लिए अगर सेलx,y
एक दीवार है।
bots
आपके 8 बॉट की एक सरणी है। उसके तत्वों गुणों के साथ वस्तुओं रहे हैंx
,y
औरhasWall
:
x
औरy
बॉट के निर्देशांक हैं।hasWall
हैtrue
अगर बॉट एक दीवार और ले जा रहा हैfalse
नहीं तो।
bots
हमेशा आदेश दिया जाता है, Nth इंडेक्स बॉट नंबर N से मेल खाता है।ebots
के साथ वस्तुओं की एक सरणी हैx
,y
औरhasWall
गुण जैसेbots
। आपके FOV में केवल दुश्मन बॉट हैंebots
। यदि आपके FOV में कोई दुश्मन बॉट नहीं है तो इसकी लंबाई 0 होगी। इसे बेतरतीब ढंग से ऑर्डर किया जाता है।getMem
बिना किसी तर्क के एक कार्य है जो आपकी स्मृति को लौटाता है।setMem
एक ऐसा फ़ंक्शन है जो एक तर्क लेता है। यदि एम 256 वर्णों या उससे कम का स्ट्रिंग है, तो आपकी मेमोरी को एम अपडेट किया जाता है, अन्यथा कुछ भी नहीं होता है।
console
अकेले ब्राउज़र ऑब्जेक्ट टेस्ट एंट्री के लिए उपलब्ध है।
प्रतिलाभ की मात्रा
आपके फ़ंक्शन को ठीक 8 पूर्णांकों की एक सरणी वापस करने की आवश्यकता है, प्रत्येक 0 से 24 तक है। इंडेक्स एन पर मूल्य वह क्रिया है जो बॉट नंबर एन ले जाएगा।
यदि आपका कार्य हो तो आपके सभी बॉट कुछ नहीं करेंगे:
- किसी भी तरह की त्रुटि को फेंक देता है। ( त्रुटि )
- निष्पादित करने के लिए 20 मिलीसेकंड से अधिक समय लगता है । ( समय समाप्त )
- 0 से 24 तक 8 पूर्णांकों की एक सरणी नहीं लौटाता है। ( विकृत )
सुविधा के लिए, किसी गेम के समाप्त होने पर त्रुटियों, समयबाह्य और विकृत क्रियाओं की संख्या प्रदर्शित की जाती है।
0 से 24 तक की प्रत्येक संख्या एक विशेष बॉट क्रिया से मेल खाती है:
- 0 कुछ नहीं करने के लिए है।
- 1-8 बढ़ने के लिए हैं।
- 9-16 हथियाने के लिए हैं।
- 17-24 रखने के लिए हैं।
यहाँ दिखाए गए अनुसार बॉट की पड़ोसी कोशिकाओं में से किसी एक को हिलाने, हथियाने और रखने के 8 मान हैं:
इसलिए, उदाहरण के लिए, 15
बॉट के नीचे सेल को हथियाने के लिए कार्रवाई है।
बॉट क्रियाओं को क्रम बॉट 0 से बॉट 7 में संभाला जाता है। उदाहरण के लिए, अगर एक मूव के दौरान बॉट 0 को उसी एयर सेल में एक दीवार रखने के लिए कहा जाता है तो बॉट 1 को स्थानांतरित करने के लिए कहा गया था, बॉट से पहले एयर सेल एक दीवार बन जाएगी। 1 की कार्रवाई को नियंत्रित किया जाता है और बॉट 1 असफल हो जाएगा।
असफल कार्य नोटिंग बन जाते हैं और कहा जाता है कि वे विफल हो गए हैं । खेल समाप्त होने पर विफल कार्रवाई काउंटर भी प्रदर्शित किए जाते हैं।
नियम
मैं इन नियमों का पालन नहीं करने वाले उपयोगकर्ताओं या उत्तरों को अस्थायी या स्थायी रूप से अयोग्य ठहरा सकता हूं । अयोग्य प्रविष्टियां जीतने के योग्य नहीं हैं।
चरों या कार्यों की घोषणा करते समय, आपको
var
खोजशब्द का उपयोग करना चाहिए ।
जैसेvar x = 10
याvar sum = function(a, b){ return a + b }
बिना घोषित कीvar
गई चीजें वैश्विक हो जाती हैं और नियंत्रक के साथ हस्तक्षेप कर सकती हैं। कदम उठाए गए हैं ताकि यह हस्तक्षेप असंभव हो, लेकिन यह सुनिश्चित करने के लिए ऐसा करें।आपका कोड धीरे-धीरे या बेकार समय नहीं चलना चाहिए।
जावास्क्रिप्ट कार्यों को मध्य-निष्पादन को रोकना असंभव है, इसलिए प्रत्येक खिलाड़ी का कोड पूरा होने के लिए चलाया जाता है। यदि आपके कोड को चलाने में लंबा समय लगता है, तो आपके खिलाड़ी को चलाने वाला हर कोई नोटिस करेगा और नाराज होगा। आदर्श रूप से, प्रविष्टियां हमेशा 20ms की सीमा के भीतर अच्छी तरह से चलेंगी।- आपको फ़ायरफ़ॉक्स के नवीनतम संस्करण में ECMAScript 5 के साथ संगत कोड का उपयोग करना चाहिए क्योंकि यह वह जगह है जहाँ मैं इसे चला रहा हूँ। ECMAScript 6 से सुविधाओं का उपयोग न करें क्योंकि यह अभी तक कई ब्राउज़रों में समर्थित नहीं है।
- आप 3 बार तक जवाब दे सकते हैं , लेकिन केवल तभी जब आपकी प्रत्येक रणनीति काफी अलग हो। आप वांछित के रूप में उत्तर संपादित कर सकते हैं।
- आप किसी भी प्रकार की मेमोरी का उपयोग करने के अलावा
getMem
और करने की कोशिश नहीं कर सकते हैंsetMem
। - आप नियंत्रक, अन्य खिलाड़ी के कोड, या बाहरी संसाधनों को एक्सेस या संशोधित करने का प्रयास नहीं कर सकते हैं।
- आप जावास्क्रिप्ट में निर्मित कुछ भी संशोधित करने का प्रयास नहीं कर सकते हैं।
- उत्तर निर्धारित करने की आवश्यकता नहीं है। आप उपयोग कर सकते हैं
Math.random
।
उत्तर प्रारूप
#EntryName
Notes, etc.
<!-- language: lang-js -->
//function body
//probably on multiple lines
More notes, etc.
पहले मल्टीलाइन कोड ब्लॉक में आपका फ़ंक्शन बॉडी होना चाहिए।
प्रवेश नाम 20 वर्णों तक सीमित है।
आपकी प्रविष्टि शीर्षक के साथ नियंत्रक में दिखाई देगी EntryName - Username [answer ID]
, साथ ही [DQ]
अगर वह अयोग्य है।
जीतना
जब प्रश्न कम से कम 3 सप्ताह के लिए हो और एक बार जवाब देने के बाद बस गया हो, तो मैं चैंपियन को ताज पहनाऊंगा।
मैं नियंत्रक के ऑटोरन सुविधा का उपयोग करूंगा । ऑटोरन राउंड में, प्रत्येक गैर-अयोग्य खिलाड़ी हर दूसरे के साथ दो गेम खेलता है, पी 1 के रूप में, एक पी 2 (एक डबल राउंड-रॉबिन) के रूप में।
मैं कुछ घंटों के दौरान जितने राउंड कर सकता हूं, उतने ही ऑटोरन करूंगा। यह इस बात पर निर्भर करेगा कि कितने सबमिशन हैं और वे कितने समय के लिए हैं। लेकिन निश्चिंत रहें, मैं एक सटीक अंतिम लीडरबोर्ड पाने के लिए प्रतिबद्ध हूं। सबसे अधिक जीत वाला खिलाड़ी चैंपियन है और उनके जवाब को स्वीकार किया जाएगा।
मैं विंडोज 8.1 64-बिट, 4 जीबी रैम और 1.6 जीएचजेड क्वाड-कोर प्रोसेसर वाले लैपटॉप पर फ़ायरफ़ॉक्स का उपयोग कर रहा हूं।
इनाम
मैं पीपीसीजी चुनौती लिखूंगा और पोस्ट करूंगा, विशेष रूप से चैंपियन को समर्पित। यह किसी तरह उनके उपयोगकर्ता नाम या अवतार या उनके बारे में कुछ शामिल करेगा। मैं निजी तौर पर यह तय करूंगा कि जब यह प्रतियोगिता समाप्त होगी तो चुनौती क्या होगी। मैं इसे अपनी क्षमता के अनुसार लिखूंगा और यह सुनिश्चित करने का प्रयास करूंगा कि यह एक हॉट नेटवर्क प्रश्न बन जाए।
नियंत्रक
इस स्निपेट को चलाएं या नियंत्रक का उपयोग करने के लिए इस JSField पर जाएं। यह यादृच्छिक खिलाड़ियों के साथ शुरू होता है। मैंने इसे फ़ायरफ़ॉक्स और क्रोम में अच्छी तरह से परखा है।
<style>html *{font-family:Consolas,Arial,sans-serif}canvas{margin:6px}button,input table,select{font-size:100%}textarea{font-family:monospace}input[type=text],textarea{padding:2px}textarea[readonly]{background-color:#eee}select{width:250pt;margin:3px 0}input[type=radio]{vertical-align:-.25em}input[type=checkbox]{vertical-align:-.15em}.c{margin:12px}.h{font-size:125%;font-weight:700}#main td{padding:12px;text-align:left}#main table{margin-left:auto;margin-right:auto}#main{text-align:center}#title{margin:12px;font-size:175%;font-weight:700;color:#333}#delay{text-align:right}#statsTable table{border-collapse:collapse}#statsTable td{border:1px solid gray;padding:3pt;font-family:monospace;text-align:center}#footnotes{margin:18px 0 0;font-size:75%}#arWrapper{border:2px solid red;background-color:#fff4f4}</style><div id=loadStatus>Loading entries...</div><div id=main><div id=title>Block Building Bot Flocks</div><div><span id=p1Title class=p1Color></span> vs. <span id=p2Title class=p2Color></span></div><canvas id=canvas>Canvas unsupported!</canvas><div><span id=p1Score class=p1Color>0</span> | <span id=moveCounter>0</span> | <span id=p2Score class=p2Color>0</span></div><div class=c><button id=runPause type=button onclick=runPause()>Run</button> <button id=moveOnce type=button onclick=moveOnce()>Move Once</button> <button type=button onclick=newGame()>New Game</button></div><div class=c><input id=delay size=4 value=20> ms delay <input id=showNumbers type=checkbox onclick=toggleNumbers()><label for=showNumbers>Show bot numbers</label> <input id=showLOS type=checkbox onclick=toggleLOS()><label for=showLOS>Show field of view</label></div><table><tr><td><div id=p1Header class="p1Color h">Player 1</div><div><select id=p1Select onchange=changeSelect(!0)></select></div><div><a id=p1Link href=javascript:;>Answer Link</a></div><td><div id=p2Header class="p2Color h">Player 2</div><div><select id=p2Select onchange=changeSelect(!1)></select></div><div><a id=p2Link href=javascript:;>Answer Link</a></div></table><div>Test Entry</div><div><textarea id=testEntry rows=8 cols=64>return [0,0,0,0,0,0,0,0]</textarea></div><div class=c><button type=button onclick=autorun()>Autorun N Rounds</button> N = <input id=N size=4 value=1> <input id=arTestEntry type=checkbox><label for=arTestEntry>Include Test Entry</label></div><div id=footnotes><input id=debug type=checkbox onclick=toggleDebug()><label for=debug>Console debug messages</label> | Scale: <input id=sc1 type=radio name=sc value=1><label for=sc1>Micro</label><input id=sc3 type=radio name=sc value=3><label for=sc3>Small</label><input id=sc6 type=radio name=sc value=6 checked><label for=sc6>Normal</label><input id=sc9 type=radio name=sc value=9><label for=sc9>Large</label> | Colors: <input id=normalCo type=radio name=co value=normal checked><label for=normalCo>Normal</label><input id=pastelCo type=radio name=co value=pastel><label for=pastelCo>Pastels</label><input id=neonCo type=radio name=co value=neon><label for=neonCo>Neon</label> <button type=button onclick=reload()>Reload</button><div id=invalidWrapper><br>No entry name/code found: <span id=invalid></span></div></div></div><div id=arWrapper><div id=arInfo class=c>Autorun in progress. Running game <span id=arProgress></span>.</div><div id=arResults><div class="c h">Autorun Results</div><div class=c>Players: <span id=arPlayers></span><br>Rounds: <span id=arRounds></span><br>Games per round: <span id=arGpR></span><br>Total games: <span id=arTotal></span><br></div><div class=c><strong>Leaderboard:</strong></div><div id=leaderboard class=c></div><div class=c>(W = wins, T = ties, L = losses, G = total goals, E = errors, I = timeouts, M = malformed actions, F = failed actions)</div><div class=c><strong>Player vs. Player Statistics:</strong></div><div id=statsTable class=c></div><div class=c>The top row has the ID's of P1.<br>The left column has the ID's of P2.<br>Every other cell not on the diagonal has the form "[P1 win count] [tie count] [P2 win count]".</div><div class=c><button type=button onclick=closeAutorun()>Close</button></div></div></div><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>function setGlobals(e){G={},G.QID=50690,G.SITE="codegolf",G.DQ_ANSWERS=[],G.DQ_USERS=[],G.DEBUG=Q("#debug").is(":checked"),G.SHOW_NUMBERS=Q("#showNumbers").is(":checked"),G.SHOW_LOS=Q("#showLOS").is(":checked"),G.BOTS=8,G.LOS=6,G.W=128,G.H=64,G.SCALE=e?6:parseInt(Q('input[name="sc"]:checked').val()),G.CW=G.SCALE*G.W,G.CH=G.SCALE*G.H,G.TOTAL_MOVES=2e3,G.GOAL_LIFESPAN=500,G.MEM_MAX_LENGTH=256,G.TIME_LIMIT=20;var t=Q('input[name="co"]:checked').val();e||"normal"===t?G.COLORS={AIR:"#ccc",WALL:"#888",GOAL:"rgba(255,255,0,0.6)",BG:"#f7f7f7",P1:"#00f",P1_TEXT:"#008",P1_LOS:"rgba(0,0,255,0.1)",P2:"#f00",P2_TEXT:"#800",P2_LOS:"rgba(255,0,0,0.1)"}:"pastel"===t?G.COLORS={AIR:"#cef0ff",WALL:"#66cc66",GOAL:"rgba(0,0,0,0.3)",BG:"#fdfde6",P1:"#f4a034",P1_TEXT:"#a35f00",P1_LOS:"rgba(255,179,71,0.2)",P2:"#f67cf6",P2_TEXT:"#b408b4",P2_LOS:"rgba(249,128,249,0.2)"}:"neon"===t&&(G.COLORS={AIR:"#000",WALL:"#444",GOAL:"rgba(255,255,0,0.9)",BG:"#999",P1:"#0f0",P1_TEXT:"#5f5",P1_LOS:"rgba(255,128,0,0.15)",P2:"#f0f",P2_TEXT:"#f5f",P2_LOS:"rgba(0,255,255,0.15)"}),G.SCOREBOARD={P1SCORE:void 0,MOVE:void 0,P2SCORE:void 0},G.CTX=void 0,G.PLAYERS=void 0,G.GAME=void 0,G.TIMER=void 0,G.RUNNING=!1}function reload(){var e="undefined"==typeof G;e||stopTimer(),setGlobals(e);var t=Q("#canvas");t.width(G.CW).height(G.CH).prop({width:G.CW,height:G.CH}),G.CTX=t[0].getContext("2d"),G.CTX.font=(2*G.SCALE).toString()+"px Courier New",G.SCOREBOARD.P1SCORE=Q("#p1Score"),G.SCOREBOARD.MOVE=Q("#moveCounter"),G.SCOREBOARD.P2SCORE=Q("#p2Score"),Q("body").css("background-color",G.COLORS.BG),Q(".p1Color").css("color",G.COLORS.P1),Q(".p2Color").css("color",G.COLORS.P2),Q("#invalidWrapper").hide(),Q("#arWrapper").hide(),loadAnswers(G.SITE,G.QID,function(e){Q.isArray(e)?(Q("#loadStatus").remove(),loadPlayers(e),newGame()):Q("#loadStatus").text("Error loading entries - "+e)})}function maskedEval(e,t){var r={};for(i in this)r[i]=void 0;for(i in t)t.hasOwnProperty(i)&&(r[i]=t[i]);return new Function("with(this) { "+e+";}").call(r)}function toKey(e,t){return G.W*t+e}function fromKey(e){return{x:e%G.W,y:Math.floor(e/G.W)}}function outOfBounds(e,t){return 0>e||e>=G.W||0>t||t>=G.H}function rnd(e){return Math.floor(Math.random()*e)}function isInt(e){return"number"==typeof e&&e%1===0}function isString(e){return"string"==typeof e||e instanceof String}function decode(e){return Q("<textarea>").html(e).text()}function shuffle(e){for(var t,r,o=e.length;o;t=rnd(o),r=e[--o],e[o]=e[t],e[t]=r);}function makeTable(e){for(var t=Q("<table>"),r=0;r<e.length;r++){for(var o=Q("<tr>"),a=0;a<e[r].length;a++)o.append(Q("<td>").text(e[r][a]));t.append(o)}return t}function toggleDebug(){G.DEBUG=Q("#debug").is(":checked")}function toggleNumbers(){G.SHOW_NUMBERS=Q("#showNumbers").is(":checked"),drawGame(G.GAME)}function toggleLOS(){G.SHOW_LOS=Q("#showLOS").is(":checked"),drawGame(G.GAME)}function closeAutorun(){Q("#arWrapper").hide(),Q("#main").show()}function changeSelect(e){var t=Q(e?"#p1Select":"#p2Select").val(),r=Q(e?"#p1Link":"#p2Link");null===t&&0>t?r.attr("href","javascript:;"):r.attr("href",G.PLAYERS[t].link)}function stopTimer(){"undefined"!=typeof G.TIMER&&clearInterval(G.TIMER)}function moveOnce(){gameOver(G.GAME)||(moveGame(G.GAME),drawGame(G.GAME),gameOver(G.GAME)&&(stopTimer(),Q("#runPause").text("Run").prop("disabled",!0),Q("#moveOnce").prop("disabled",!0),G.DEBUG&&console.log("======== GAME OVER: "+G.GAME.p1.score+" TO "+G.GAME.p2.score+" ========"),alert(gameOverMessage(G.GAME))))}function runPause(){if(G.RUNNING)stopTimer(),Q("#runPause").text("Run"),Q("#moveOnce").prop("disabled",!1);else{var e=parseInt(Q("#delay").val());if(isNaN(e)||0>e)return void alert("Delay must be a non-negative integer.");Q("#runPause").text("Pause"),Q("#moveOnce").prop("disabled",!0),G.TIMER=setInterval(moveOnce,e)}G.RUNNING=!G.RUNNING}function newGame(){stopTimer();var e=G.PLAYERS[Q("#p1Select").val()],t=G.PLAYERS[Q("#p2Select").val()];G.RUNNING=!1,Q("#runPause").text("Run").prop("disabled",!1),Q("#moveOnce").prop("disabled",!1),Q("#p1Title").text(e.title),Q("#p2Title").text(t.title),G.GAME=createGame(e,t),drawGame(G.GAME)}function tryParse(e,t){var r=parseInt(Q(e).val());return!isNaN(r)&&r>=0?r:void alert(t+" must be a non-negative integer.")}function autorun(){function e(){for(var e=new Array(a.length),t={},r=["wins","goals","errors","timeouts","malformed","invalid"],n=0;n<e.length;n++){t.wins=t.ties=t.losses=t.goals=t.errors=t.timeouts=t.malformed=t.invalid=0;for(var l=0;l<e.length;l++)n!==l&&(t.ties+=s[n][l].ties+s[l][n].ties,t.losses+=s[n][l].p2.wins+s[l][n].p1.wins,r.forEach(function(e){t[e]+=s[n][l].p1[e]+s[l][n].p2[e]}));e[n]={wins:t.wins,text:a[n].title+" : "+t.wins+"W, "+t.ties+"T, "+t.losses+"L, "+t.goals+"G, "+t.errors+"E, "+t.timeouts+"I, "+t.malformed+"M, "+t.invalid+"F"}}e=e.sort(function(e,t){return t.wins-e.wins}).map(function(t,r){return r+1+". "+t.text+(r<e.length-1?"<br>":"")});for(var i=new Array(s.length+1),G=0;G<i.length;G++){i[G]=new Array(s.length+1);for(var c=0;c<i.length;c++){var f;i[G][c]=0===c&&0===G?"P2\\P1":0===c?a[G-1].id:0===G?a[c-1].id:(f=s[c-1][G-1])?f.p1.wins+" "+f.ties+" "+f.p2.wins:"-"}}Q("#arPlayers").text(a.length),Q("#arRounds").text(o),Q("#arGpR").text(S/o),Q("#arTotal").text(S),Q("#leaderboard").empty().append(e),Q("#statsTable").empty().append(makeTable(i)),Q("#arInfo").hide(),Q("#arResults").show()}function t(e,t){for(var r=createGame(a[e],a[t]);!gameOver(r);)moveGame(r);r.p1.score>r.p2.score?s[e][t].p1.wins++:r.p1.score<r.p2.score?s[e][t].p2.wins++:s[e][t].ties++,["p1","p2"].forEach(function(o){s[e][t][o].goals+=r[o].score,s[e][t][o].errors+=r[o].stats.errors,s[e][t][o].timeouts+=r[o].stats.timeouts,s[e][t][o].malformed+=r[o].stats.malformed,s[e][t][o].invalid+=r[o].stats.invalid.reduce(function(e,t){return e+t},0)})}function r(){if(c!==f&&(t(c,f),++p<=S&&Q("#arProgress").text(p+"/"+S)),f+1<a.length)f++;else if(f=0,c+1<a.length)c++;else{if(c=0,!(o>i+1))return void e();i++}setTimeout(r,0)}var o=parseInt(Q("#N").val());if(isNaN(o)||1>o)return void alert("N must be a positive integer.");var a=[];Q("#arTestEntry").is(":checked")&&a.push(G.PLAYERS[0]);for(var n=1;n<G.PLAYERS.length;n++)G.PLAYERS[n].dq||a.push(G.PLAYERS[n]);for(var s=new Array(a.length),n=0;n<a.length;n++){s[n]=new Array(a.length);for(var l=0;l<a.length;l++)n!==l&&(s[n][l]={ties:0,p1:{wins:0,goals:0,errors:0,timeouts:0,malformed:0,invalid:0},p2:{wins:0,goals:0,errors:0,timeouts:0,malformed:0,invalid:0}})}var i=0,c=0,f=0,p=1,S=o*a.length*(a.length-1);Q("#arProgress").text("1/"+S),Q("#main").hide(),Q("#arInfo").show(),Q("#arResults").hide(),Q("#arWrapper").show(),setTimeout(r,0)}function gameOver(e){return e.move>=G.TOTAL_MOVES}function gameOverMessage(e){function t(e,t){return"P"+(t?1:2)+": "+e.entry.title+"\nScore: "+e.score+"\nErrors: "+e.stats.errors+"\nTimeouts: "+e.stats.timeouts+"\nMalformed actions: "+e.stats.malformed+"\nFailed actions: ["+e.stats.invalid.toString().replace(/,/g,", ")+"]"}var r="GAME OVER - ";return r+=e.p1.score>e.p2.score?"PLAYER 1 WINS":e.p1.score<e.p2.score?"PLAYER 2 WINS":"TIE GAME",r+="\n\n"+t(e.p1,!0)+"\n\n"+t(e.p2,!1)}function createGame(e,t){function r(e){return{entry:e,bots:new Array(G.BOTS),mem:"",score:0,stats:{errors:0,timeouts:0,malformed:0,invalid:Array.apply(null,new Array(G.BOTS)).map(Number.prototype.valueOf,0)}}}var o={},a=Math.floor(.875*G.H)-1;o.move=0,o.walls=new Array(G.H);for(var n=0;n<G.H;n++){o.walls[n]=new Array(G.W);for(var s=0;s<G.W;s++)o.walls[n][s]=n>a}o.p1=r(e),o.p2=r(t);for(var l=0;l<G.BOTS;l++)o.p1.bots[l]={x:l,y:a,hasWall:!1},o.p2.bots[l]={x:G.W-1-l,y:a,hasWall:!1};if(-1===o.p1.entry.id||-1===o.p2.entry.id){var i=decode(Q("#testEntry").val());-1===o.p1.entry.id&&(o.p1.entry.code=i),-1===o.p2.entry.id&&(o.p2.entry.code=i)}return resetGoal(o),G.DEBUG&&console.log("======== NEW GAME: "+o.p1.entry.title+" VS "+o.p2.entry.title+" ========"),o}function moveGame(e){movePlayer(e,++e.move%2===1),++e.goal.age>=G.GOAL_LIFESPAN&&resetGoal(e)}function setupParams(e,t){function r(e,t){var r=toKey(e,t);if(!n.hasOwnProperty(r)){n[r]=!1;for(var a=0;a<G.BOTS;a++)if(Math.abs(o.bots[a].x-e)<=G.LOS&&Math.abs(o.bots[a].y-t)<=G.LOS){n[r]=!0;break}}return n[r]}var o=t?e.p1:e.p2,a=t?e.p2:e.p1,n={},s={};s.p1=t,s.id=o.entry.id,s.eid=a.entry.id,s.score=o.score,s.escore=a.score,s.move=Math.floor((e.move+1)/2),s.goal={x:e.goal.x,y:e.goal.y},s.getMem=function(){return o.mem},s.setMem=function(e){isString(e)&&e.length<=G.MEM_MAX_LENGTH&&(o.mem=e)},s.grid=function(t,o){return isInt(t)&&isInt(o)&&r(t,o)?outOfBounds(t,o)?0:e.walls[o][t]?1:0:-1},s.bots=new Array(G.BOTS),s.ebots=[];for(var l=0;l<G.BOTS;l++)s.bots[l]={x:o.bots[l].x,y:o.bots[l].y,hasWall:o.bots[l].hasWall},r(a.bots[l].x,a.bots[l].y)&&s.ebots.push({x:a.bots[l].x,y:a.bots[l].y,hasWall:a.bots[l].hasWall});return shuffle(s.ebots),-1===o.entry.id&&(s.console=console),s}function movePlayer(e,t){var r,o,a=t?e.p1:e.p2,n=t?e.p2:e.p1,s=setupParams(e,t);G.DEBUG&&(console.log("######## MOVE "+e.move+" - P"+(t?1:2)+" ########"),console.log("PARAMETERS:"),console.log(s)),o=performance.now();try{r=maskedEval(a.entry.code,s)}catch(n){return a.stats.errors++,void(G.DEBUG&&(console.log("!!!! ERRORED !!!!"),console.log(n)))}if(o=performance.now()-o,G.DEBUG&&console.log("TIME TAKEN: "+o+"ms"),o>G.TIME_LIMIT)return a.stats.timeouts++,void(G.DEBUG&&console.log("!!!! TIMED OUT !!!!"));if(G.DEBUG&&(console.log("ACTIONS:"),console.log(r)),!Array.isArray(r)||r.length!==G.BOTS)return a.stats.malformed++,void(G.DEBUG&&console.log("!!!! MALFORMED ACTIONS !!!!"));for(var l=0;l<G.BOTS;l++)if(!isInt(r[l])||r[l]<0||r[l]>24)return a.stats.malformed++,void(G.DEBUG&&console.log("!!!! MALFORMED ACTIONS !!!!"));performActions(e,a,r)}function performActions(e,t,r){function o(e){t.stats.invalid[e]++,G.DEBUG&&console.log("!! BOT"+e+" ACTION FAILED !!")}function a(e){return e.x!==i||e.y!==c}for(var n=!1,s=0;s<G.BOTS;s++){var l=r[s];if(l){var i,c;switch((l-1)%8){case 0:i=-1,c=-1;break;case 1:i=0,c=-1;break;case 2:i=1,c=-1;break;case 3:i=-1,c=0;break;case 4:i=1,c=0;break;case 5:i=-1,c=1;break;case 6:i=0,c=1;break;case 7:i=1,c=1}if(i+=t.bots[s].x,c+=t.bots[s].y,outOfBounds(i,c))o(s);else switch(Math.floor((l-1)/8)){case 0:!e.walls[c][i]&&(i>0&&c>0&&e.walls[c-1][i-1]||c>0&&e.walls[c-1][i]||i<G.W-1&&c>0&&e.walls[c-1][i+1]||i>0&&e.walls[c][i-1]||i<G.W-1&&e.walls[c][i+1]||i>0&&c<G.H-1&&e.walls[c+1][i-1]||c<G.H-1&&e.walls[c+1][i]||i<G.W-1&&c<G.H-1&&e.walls[c+1][i+1])?(t.bots[s].x=i,t.bots[s].y=c,i!==e.goal.x||c!==e.goal.y||n||(n=!0,G.DEBUG&&console.log("** BOT"+s+" REACHED GOAL **"))):o(s);break;case 1:e.walls[c][i]&&!t.bots[s].hasWall?(e.walls[c][i]=!1,t.bots[s].hasWall=!0):o(s);break;case 2:!e.walls[c][i]&&t.bots[s].hasWall&&e.p1.bots.every(a)&&e.p2.bots.every(a)?(e.walls[c][i]=!0,t.bots[s].hasWall=!1):o(s)}}}n&&(t.score++,resetGoal(e)),G.DEBUG&&(console.log("FINAL PLAYER STATE:"),console.log(t))}function resetGoal(e){for(var t={},r=[],o=0;o<G.BOTS;o++)t[toKey(e.p1.bots[o].x,e.p1.bots[o].y)]=!0,t[toKey(e.p2.bots[o].x,e.p2.bots[o].y)]=!0;for(var a=0;a<G.H;a++)for(var n=0;n<G.W;n++){var s=toKey(n,a);t.hasOwnProperty(s)||r.push(s)}var l=fromKey(r[rnd(r.length)]);e.goal={age:0,x:l.x,y:l.y}}function drawGame(e){function t(e,t){G.CTX.fillRect(e*G.SCALE,t*G.SCALE,G.SCALE,G.SCALE)}function r(e,t){G.CTX.fillRect(e*G.SCALE+1,t*G.SCALE+1,G.SCALE-2,G.SCALE-2)}G.CTX.fillStyle=G.COLORS.AIR,G.CTX.fillRect(0,0,G.CW,G.CH),G.CTX.fillStyle=G.COLORS.WALL;for(var o=0;o<G.H;o++)for(var a=0;a<G.W;a++)e.walls[o][a]&&t(a,o);if(G.SHOW_LOS){var n=(2*G.LOS+1)*G.SCALE;G.CTX.fillStyle=G.COLORS.P1_LOS;for(var s=0;s<G.BOTS;s++)G.CTX.fillRect((e.p1.bots[s].x-G.LOS)*G.SCALE,(e.p1.bots[s].y-G.LOS)*G.SCALE,n,n);G.CTX.fillStyle=G.COLORS.P2_LOS;for(var s=0;s<G.BOTS;s++)G.CTX.fillRect((e.p2.bots[s].x-G.LOS)*G.SCALE,(e.p2.bots[s].y-G.LOS)*G.SCALE,n,n)}G.CTX.fillStyle=G.COLORS.P1;for(var s=0;s<G.BOTS;s++)t(e.p1.bots[s].x,e.p1.bots[s].y);G.CTX.fillStyle=G.COLORS.P2;for(var s=0;s<G.BOTS;s++)t(e.p2.bots[s].x,e.p2.bots[s].y);G.CTX.fillStyle=G.COLORS.WALL;for(var s=0;s<G.BOTS;s++)e.p1.bots[s].hasWall&&r(e.p1.bots[s].x,e.p1.bots[s].y),e.p2.bots[s].hasWall&&r(e.p2.bots[s].x,e.p2.bots[s].y);if(G.SHOW_NUMBERS){var l=-.1,i=2.75;G.CTX.fillStyle=G.COLORS.P1_TEXT;for(var s=0;s<G.BOTS;s++)G.CTX.fillText(s.toString(),(e.p1.bots[s].x+l)*G.SCALE,(e.p1.bots[s].y+i)*G.SCALE);G.CTX.fillStyle=G.COLORS.P2_TEXT;for(var s=0;s<G.BOTS;s++)G.CTX.fillText(s.toString(),(e.p2.bots[s].x+l)*G.SCALE,(e.p2.bots[s].y+i)*G.SCALE)}G.CTX.fillStyle=G.COLORS.GOAL,t(e.goal.x+1,e.goal.y),t(e.goal.x-1,e.goal.y),t(e.goal.x,e.goal.y+1),t(e.goal.x,e.goal.y-1),G.SCOREBOARD.P1SCORE.text(e.p1.score),G.SCOREBOARD.MOVE.text(e.move),G.SCOREBOARD.P2SCORE.text(e.p2.score)}function loadPlayers(e){var t=/<pre\b[^>]*><code\b[^>]*>([\s\S]*?)<\/code><\/pre>/,r=/<h1\b[^>]*>(.*?)<\/h1>/;G.PLAYERS=[];var o={id:-1,dq:!1,code:void 0,link:"javascript:;",title:"TEST ENTRY [-1]"};G.PLAYERS.push(o);var a=[];e.forEach(function(e){var o=decode(e.owner.display_name),n=t.exec(e.body),s=r.exec(e.body);if(null===n||n.length<=1||null===s||s.length<=1)return a.push(" "),void a.push(Q("<a>").text(o).attr("href",e.link));var l={};l.id=e.answer_id,l.dq=G.DQ_ANSWERS.indexOf(e.answer_id)>-1||G.DQ_USERS.indexOf(e.owner.user_id)>-1,l.code=decode(n[1]),l.link=e.link,l.title=s[1].substring(0,20)+" - "+o+" ["+l.id.toString()+"]",l.dq&&(l.title+="[DQ]"),G.PLAYERS.push(l)}),a.length>0&&(Q("#invalid").empty().append(a),Q("#invalidWrapper").show());for(var n=new Array(G.PLAYERS.length),s=new Array(G.PLAYERS.length),l=0;l<G.PLAYERS.length;l++)n[l]=Q("<option>").text(G.PLAYERS[l].title).val(l),s[l]=Q("<option>").text(G.PLAYERS[l].title).val(l);Q("#p1Select").empty().append(n).val(rnd(G.PLAYERS.length)),changeSelect(!0),Q("#p2Select").empty().append(s).val(rnd(G.PLAYERS.length)),changeSelect(!1)}function loadAnswers(e,t,r){function o(){Q.get("https://api.stackexchange.com/2.2/questions/"+t.toString()+"/answers?page="+(s++).toString()+"&pagesize=100&order=asc&sort=creation&site="+e+"&filter=!YOKGPOBC5Yad4mOOn8Z4WcAE6q",a)}function a(e){e.hasOwnProperty("error_id")?r(e.error_id.toString()):(n=n.concat(e.items),e.hasMore?o():r(n))}var n=[],s=1;o(s,a)}Q=jQuery,Q(reload);</script>
इस सवाल का अपना एक चैटरूम है। मैं हर कुछ दिनों में लीडरबोर्ड पोस्ट करता हूँ।