यह चुनौती @HelkaHomba की उत्कृष्ट चुनौती रेड बनाम ब्लू - पिक्सेल टीम बैटलबोट्स से प्रेरित थी । यह चुनौती शायद सबसे अच्छी थी जिसे मैंने इस साइट पर देखा था। कभी।
मेरी चुनौती अभी भी बहुत अलग है, लेकिन @HelkaHomba प्रेरणा के लिए श्रेय की हकदार है।
अवलोकन
यह एक टीम का राजा है, जहां आपकी टीम आपकी टीम के सभी खिलाड़ियों को जीवित करके जीतती है। दूसरे शब्दों में, अंतिम टीम खड़ी जीत है। ड्रॉ फिर से कराया जाएगा।
आप एक बोर्ड पर हैं। आप पहले राउंड पर अपनी स्थिति जानते हैं (टिक 0)। आप यह भी जानते हैं कि आपके आसपास के क्षेत्र में कौन है:
इस मामले में, आप अकेले हैं (या तो आप सोचते हैं) आपके आसपास कोई नहीं है। आप अपने ontick
हैंडलर को पहले तर्क में आसपास की वस्तुएँ देख सकते हैं । एपीआई के बारे में बाद में।
तुम्हारी टीम
आपकी टीम आपकी उपयोगकर्ता आईडी द्वारा निर्धारित होती है। यह पता लगाने के लिए, अपने प्रोफ़ाइल चित्र पर क्लिक करें:
फिर एड्रेस बार में अपनी यूजर आईडी खोजें:
यदि यह विषम है, तो आप ब्लू टीम पर हैं।
यदि यह सम है, तो आप रेड टीम पर हैं।
आप हाथ से तैयार हलकों के लिए स्वागत करते हैं।
आपका (बॉट का) नाम
आपके बॉट का नाम आपकी टीम के पहले अक्षर ("r" या "b") से शुरू होता है। यह रेगेक्स से मेल खाना चाहिए /^(r|b)[A-Za-z_-]$/
। इसके अलावा, आप अपने बॉट का नाम चुन सकते हैं। कृपया पहले से मौजूद एक का उपयोग न करें।
शुरुआत में
लाल खिलाड़ी नक्शे के शीर्ष के पास शुरू करेंगे, और नीले तल के पास शुरू होंगे। आपको फ़ंक्शन के environment
लिए पैरामीटर में पहले टिक (टर्न) पर विशेष जानकारी दी जाती है ontick
। मैं भंडारण की सलाह देता हूं। जानकारी के लिए एपीआई देखें।
अपनी बारी पर
टर्न ऑर्डर शुरू में यादृच्छिक होता है, लेकिन फिर वही रहता है।
क्रियाओं को चालू करें
आप प्रति बार केवल एक क्रिया कर सकते हैं।
चाल
जब आप स्थानांतरित करना चाहेंगे, तो आप
this.move(num)
एपीआई में कॉल करेंगे ।num
वह सेल है जिसे आप यहां ले जाना चाहते हैं:उन संख्याओं के सापेक्ष स्थान जिन्हें आप स्थानांतरित कर सकते हैं वे वैश्विक स्थिरांक में संग्रहीत हैं
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
यदि आप एक दीवार, या किसी अन्य खिलाड़ी में चले जाते हैं, तो कुछ भी नहीं होता है।
घुमाएँ
घुमाने के लिए, तुम बुलाओ
this.rotate(num)
। संख्या वह दिशा है जिसे आप घुमाना चाहते हैं:रोटेशन निरपेक्ष है।
को मार डालो
यदि कोई अन्य खिलाड़ी (किसी अन्य टीम से) आपके द्वारा सामना की जा रही सेल में है, तो आप
this.kill()
उन्हें कॉल और मार सकते हैं। अगर वहां कोई नहीं है, या वे आपकी टीम में हैं, तो यह कुछ नहीं करता है। उदाहरण:यदि आप कर रहे हैं
0
, तो आप हरे रंग को मार सकते हैं। यदि आप 1 वर्ष के हो गए हैं, तो आप नीले रंग को मार सकते हैं। यदि आप 2 वर्ष के हो गए हैं, तो आप संतरे को मार सकते हैं। यदि आप 3 वर्ष के हो गए हैं, तो आप पीले रंग को मार सकते हैं।बम
बमबारी आपके चारों ओर के 9 वर्गों में आप और टीम के साथियों सहित सभी खिलाड़ियों को मार देती है । उदाहरण:
आप कभी ऐसा क्यों करना चाहेंगे? कामिकज़े । यदि आपके आस-पास के 9 कक्षों में आपकी टीम में अधिक खिलाड़ी नहीं हैं, तो आपकी टीम में हैं, आप बमबारी पर विचार कर सकते हैं। (मेरा सुझाव है कि आप पहले अपने साथियों को सूचित करें!)
एक बारूदी सुरंग लगाएं
यह आपकी टीम पर नहीं दूसरों के लिए एक मृत्यु वर्ग बनाता है। जब आप एक लैंड माइन लगाते हैं, तो आप भी आगे बढ़ते हैं ताकि आप उस पर कदम न रखें। आप कहते हैं
this.landMine(num)
कि संख्या वह वर्ग है जहां आप जाना चाहते हैं। उदाहरण:फिर आप कॉल करें
this.landMine(4)
:देखें कि "एम"? यह एक बारूदी सुरंग है। अन्य लोग इसे देख सकते हैं ... अभी के लिए। कोई भी, यहां तक कि जो आपकी टीम में नहीं हैं, वह उस टिक पर एक बारूदी सुरंग देख सकता है। लेकिन उसके बाद टिक खत्म हो गया है, नो-वन, यहां तक कि आप इसे देख भी नहीं सकते। लेकिन जैसे ही कोई दुश्मन उसके ऊपर से गुजरेगा वह फट जाएगा। उदाहरण:
ब्लू अपने लैंडमाइन पर चला गया, और बूम! आपको बस एक और मार मिली।
आपको मिलने वाली प्रत्येक 2 हत्याओं के लिए (प्रत्यक्ष हत्या या भूमि खानों से), आपको जगह पाने के लिए 1 अतिरिक्त बारूदी सुरंग मिल जाती है। तुम भी शुरू में एक हो जाओ।
गड्ढा करना
जब आप खुदाई करते हैं, तो आप अपने आसपास केंद्रित 5x5 क्षेत्र में बारूदी सुरंगों की तलाश करते हैं। इसमें बॉट की टीम को नहीं दिखाया गया है जिसने बारूदी सुरंग लगा रखी है। (याद रखें कि आप अपनी टीम में किसी व्यक्ति द्वारा रखी गई बारूदी सुरंग से नहीं मारे जा सकते।) उदाहरण के लिए, यदि यह आपके आसपास ग्रिड था:
फिर वापसी का मान
this.dig()
होगा:
[undefined,undefined,undefined,true,undefined,
undefined,undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,true,undefined,undefined,
true,undefined,undefined,undefined,undefined]
एरे इंडेक्स शीर्ष बाएं से शुरू होने से हैं, दाएं से नीचे जा रहे हैं, अपने आप से शामिल नहीं हैं:
कुल 23 हैं, और उनके सापेक्ष स्थान वैश्विक स्थिरांक में संग्रहीत हैं fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
ध्यान दें कि खुदाई पिछली टिकों पर रखी गई खानों को प्रकट करती है, इसके विपरीत aroundMe
।
संचार
जब आप किसी से बात करना चाहते हैं, तो आप फोन करते हैं this.sendMessage(recipients, team, data)
। डेटा कुछ भी हो सकता है जिसे आप चाहते हैं, और आप इसे किसी को भी भेज सकते हैं, यहां तक कि अन्य टीमों के खिलाड़ी भी। इसका उपयोग खराब-प्रोग्राम किए गए बॉट्स को ट्रिक करने के लिए किया जा सकता है, लेकिन सभी खिलाड़ी देख सकते हैं कि किसने संदेश भेजा है और वे किस टीम में हैं।
उदाहरण:
"रेडिसबेस्ट" नामक एक बॉट में कुछ भेजें:
this.sendMessage("redisbest", undefined, "Hi!");
"रेडिसबेस्ट" और "ब्लूस्कूल" नामक बॉट में कुछ भेजें:
this.sendMessage(["redisbest", "blueiscool"], undefined, {hello: "there"});
पूरी रेड टीम को कुछ भेजें
this.sendMessage(undefined, "red", {hello: "red"});
सभी को कुछ न कुछ भेजें
this.sendMessage(undefined, "*", {hello: "everyone"});
पूरी रेड टीम और "ब्लूस्कूल" नामक बॉट को कुछ भेजें:
this.sendMessage("blueiscool", "red", {hello: "bots"});
एपीआई
आपके कोड में फ़ंक्शन के लिए एक कॉल शामिल होना चाहिए createBot
। और कुछ नहीं। नमूना कोड:
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, from, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
(आप इसे कॉपी-पेस्ट करने के लिए स्वतंत्र हैं। बस इसे अपनी टीम के लिए संशोधित करें, आदि)
तरीके
ontick(environment)
जब आपकी बारी है तो फोन किया।
Promise
1 सेकंड या उससे कम समय में हल करने वाले को वापस करना चाहिए या इसे अनदेखा कर दिया जाएगा। यह प्रदर्शन कारणों के लिए है और टैब हैंग न होने का अच्छा दुष्प्रभाव है।this
(जब ontick में)landMines
आपने कितनी लैंड माइंस छोड़ी हैं। आपके पास जितनी अधिक हत्याएं होंगी, उतनी अधिक भूमि की खदानें होंगी। आपके द्वारा मारे गए प्रत्येक 2 बॉट के लिए, आपको 1 और बारूदी सुरंग मिलती है। आपको भी शुरू करने के लिए 1 मिलता है।direction
आप जिस दिशा का सामना कर रहे हैं।storage
भंडारण जो कॉलonTick
और के बीच में बना रहता हैonMessage
। शुरू में एक खाली वस्तु। किसी भी उद्देश्य के लिए संशोधित करें, लेकिन यह सुनिश्चित करें कि यह एक सरणी या वस्तु है हमेशा यह सुनिश्चित करने के लिए कि वह सही ढंग से बनी रहती है।move(num)
निर्दिष्ट स्थान पर जाएं। अमान्य होने पर कुछ नहीं करता। विवरण के लिए ऊपर देखें।rotate(num)
निर्दिष्ट स्थिति में घुमाएँ। अमान्य होने पर कुछ नहीं करता। विवरण के लिए ऊपर देखें।kill()
उस खिलाड़ी को मारता है जिसे आप सामना कर रहे हैं, अगर मौजूद है और आपकी टीम में नहीं है। विवरण के लिए ऊपर देखें।bomb()
अपने आसपास के 9 चौकों में से किसी को भी मारता है, जिसमें खुद भी शामिल है।landMine(num)
एक भूमि खदान जहां आप हैं, और उसके बाद निर्दिष्ट स्थान पर ले जाता है। अमान्यnum
या आपके पास कोई नहीं बचा है, तो कुछ भी नहीं करता है । विवरण के लिए ऊपर देखें।dig()
नया! आपके आसपास केंद्रित 5x5 क्षेत्र में बारूदी सुरंगों के बारे में जानकारी की एक सरणी देता है। विवरण के लिए ऊपर देखें।sendMessage(recipients, team, data)
recipients
या तो एक बॉट (स्ट्रिंग), बॉट की एक सरणी हो सकती है, याundefined
/null
। यह वह है जिसे आप संदेश भेजना चाहते हैं।team
उस टीम का एक तार है जिसे आप संदेश भेजना चाहते हैं।"*"
सभी को संदेश भेजने के लिए उपयोग करें ।data
कुछ भी है कि एक जेएस समारोह के लिए पारित किया जा सकता है। यह प्राप्तकर्ताओं को भेजा जाता है। यदि यह एक ऑब्जेक्ट या सरणी है, तो इसे संदर्भ द्वारा पारित किया जाता है , इसलिए आप और प्राप्तकर्ता (ओं) को बचा सकते हैंstorage
और ऑब्जेक्ट के किसी भी संशोधन दोनों बॉट की प्रतियों को प्रभावित करते हैं। नोट प्राप्तकर्ताओं कि में हैं कि या तो बॉट की सूची, सटीक बॉट स्ट्रिंग, में निर्दिष्ट या टीम आपके द्वारा निर्दिष्ट पर एक बॉट है, यह संदेश मिल जाएगा।
environment
पहले टिक पर
x
: आपके खिलाड़ी की एक्स-स्थितिy
: आपके खिलाड़ी की वाई-स्थितिgridWidth
: ग्रिड की चौड़ाई (कोशिकाओं में)gridHeight
: ग्रिड की ऊंचाई (कोशिकाओं में)सभी टिक पर
aroundMe
: खिलाड़ियों और बारूदी सुरंगों की एक सरणी। खिलाड़ी वे वस्तुएं होती हैं जो देखने में लगती हैं{name: "bot name", team: "bot team"}
, और बारूदी सुरंगें हैं{team: "team of bot who placed mine"}
। सरणी के अनुक्रमित:ध्यान दें कि एक चालू के अलावा एक टिक पर रखे गए बारूदी सुरंगों को नहीं दिखाया जाएगा।
aroundMe
उदाहरण:मान लीजिए कि यह ग्रिड है (आप लाल हैं):
आपका रंग
aroundMe
इस तरह दिखेगा:
[
{name: "bexamplebluebot", team: "blue"},
undefined,//sparse array, nothing in index 1
undefined,//there is technically a landmine here, but it wasn't placed this tick, so it is not shown
undefined,//nothing in 3
{name: "yexampleyellowbot", team: "yellow"},
{team: "red"},//this is a landmine, you can tell is not a bot because it has no name. mines have the team name of the player they were placed by. This mine was placed this tick, otherwise you couldn't see it
//nothing else after index 5, so the array's length is 5.
]
सरणी के अनुक्रमितों को यहाँ समझाया गया है:
आपका बॉट प्रभावी रूप से इसे देखता है:
onmessage(data, fromBot, fromTeam)
this
(जब onmessage में)sendMessage(recipients, team, data)
मानक संदेश भेजने का कार्य।storage
मानक भंडारण।
data
प्रेषक से भेजा गया डेटा।fromPlayer
जिस खिलाड़ी को संदेश भेजा गया था।fromTeam
संदेश जिस टीम से भेजा गया था।onkill()
this
(जब onkill में)sendMessage(recipients, team, data)
मानक संदेश भेजने का कार्य।
सुविधाजनक (निरंतर) वैश्विक सरणियाँ:
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
डेटा को पास फ़ंक्शन के साथ-साथ व्याख्या करने के लिए पास करने के लिए उपयोगी है aroundMe
। ऊपर देखो।
fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
हैंडलर this.dig()
में फ़ंक्शन के लिए उपयोगी है ontick
।
कोशिश करके देखो!
प्रदर्शन कारणों के लिए स्थानीय मशीन पर नियंत्रक को मेरी मशीन से चलाया जाएगा, लेकिन आप अपने बॉट का परीक्षण करने के लिए कोडपेन का उपयोग कर सकते हैं ।
ध्यान दें कि आपको अपना कोड कंसोल में पेस्ट करना होगा और Enter
क्लिक करने से पहले दबाएं । आप जितने चाहें उतने बॉट्स में पेस्ट कर सकते हैं। "टेस्ट बॉट्स" आपके खिलाफ परीक्षण करने के लिए उदाहरण हैं। यदि आप उन सभी को हरा या बाँध सकते हैं, तो आपके पास कम से कम एक सभ्य बॉट है।
प्रस्तुतियाँ
नियम
नियम (नियंत्रक द्वारा लागू)
- आपका मुख्य
ontick
कोड 1 सेकंड से अधिक नहीं होना चाहिए। हम हमेशा के लिए गोल नहीं लेना चाहते हैं। यदि आपका कोड> 1 सेकंड लेता है, तो इसे रोक दिया जाएगा। - यदि आप प्रति बार 1 से अधिक कार्रवाई करने का प्रयास करते हैं, या एक अमान्य कार्रवाई करते हैं (जैसे।
this.move(-1)
या एक दीवार में चलती है), तो इसे अनदेखा किया जाएगा। - जल्द ही और आ सकते हैं ...
नियम (मेरे द्वारा लागू, DQ में परिणाम कर सकते हैं)
- वैश्विक चर मत लिखें ( पढ़ना ठीक है )।
- आपका कोड Nodejs में काम करना चाहिए (यदि नियंत्रक Nodejs में पोर्ट किया गया है), तो
JSON.parse(...)
ठीक है, लेकिनalert()
ऐसा नहीं है। - आपको
createBot
नियंत्रक के साथ किसी भी तरह से कॉल या हस्तक्षेप करने की अनुमति नहीं है । - अनुमति और महत्वपूर्ण परिवर्तनों के बिना किसी और के कोड का उपयोग न करें। कोई कॉपीबॉट नहीं।
- कृपया, कोई खामियों!
- जल्द ही और आ सकते हैं ...
मेरे बॉट्स
यहाँ कुछ बॉट्स दिए गए हैं:
यह बॉट बेतरतीब ढंग से एक कार्रवाई चुनता है। खैर, यह एक भारित यादृच्छिक है, लेकिन अभी भी बहुत यादृच्छिक है। यदि आप इस बॉट को मार सकते हैं (यह अंततः खुद को मार देगा, जो गिनती नहीं करता है), तो आपके पास कम से कम एक सभ्य बॉट है। इसे पोस्ट करें और देखें कि क्या होता है!
मेरे बॉट्स का नाम "x" और "कोई नहीं" की टीम से शुरू होता है। इस कोड का उपयोग करने के लिए आपका स्वागत है, लेकिन कृपया कम से कम कुछ संशोधन करें। यदि आप कम से कम एक नंबर को परेशान नहीं कर सकते हैं, तो आप जीत नहीं पाएंगे।
अपने सबमिशन को फॉर्मेट करना
कृपया इस प्रारूप का उपयोग करें:
# rmyamazingbot
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, fromTeam, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
Long, but cool explanation...
फ़ीचर अनुरोध, बग, प्रश्न, आदि?
नीचे टिप्पणी करें! कृपया यह देखने के लिए जांचें कि क्या इसके साथ पहले से कोई टिप्पणी है। यदि पहले से कोई है, तो इसे बढ़ाएं।
अपनी टीम से बात करना चाहते हैं?
लाल और नीले रंग के लिए चैट रूम का उपयोग करें ।
भाषा
वर्तमान में, केवल JS और JS को संकलित करने वाली कुछ चीज़ों का समर्थन किया जाता है, लेकिन यदि आप Nodejs के साथ काम करने के लिए अन्य भाषाओं को प्राप्त करने के तरीके के बारे में जानते हैं, तो मुझे नियंत्रक को Nodejs में पोर्ट करने में खुशी होगी।
अंतिम नोट्स
रणनीति के विचार
अपनी टीम की मदद करें! एक बॉट बनाना जो दूसरे बॉट की मदद करने और एक साथ काम करने के लिए बनाया गया है। इस रणनीति ने रेड बनाम ब्लू - पिक्सेल टीम बैटलबोट्स के लिए अच्छा काम किया
बार-बार चाहने वाले
मैं विजेता टीम पर सबसे ज्यादा वोट देने वाले उत्तर को स्वीकार करूंगा। ध्यान रखें कि पहले के जवाबों में अधिक वोट मिलते हैं, लेकिन उनकी कमजोरियों को ढूंढने और उनका शोषण करने की संभावना अधिक होती है।
इसके अलावा, यदि आप जल्द ही जवाब देते हैं, तो आपको +100 इनाम मिल सकता है।