এই চ্যালেঞ্জটি @ হেলকাহোম্বার দুর্দান্ত চ্যালেঞ্জ রেড বনাম ব্লু - পিক্সেল টিম ব্যাটবটগুলি দ্বারা অনুপ্রাণিত হয়েছিল । এই চ্যালেঞ্জটি সম্ভবত এই সাইটে আমি সবচেয়ে ভাল দেখেছি। কখনো।
আমার চ্যালেঞ্জটি এখনও অনেক আলাদা, তবে @ হেলকাহোম্বা অনুপ্রেরণার জন্য কৃতিত্বের দাবিদার।
সংক্ষিপ্ত বিবরণ
এটি একটি টিম -এর-পাহাড়ের রাজা যেখানে আপনার দলে সমস্ত দলকে আপনার দলে বেঁচে রেখে জিততে পারে। অন্য কথায়, শেষ দল স্থায়ী জয়। অঙ্কনগুলি আবার করা হবে।
আপনি একটি বোর্ডে আছেন। আপনি প্রথম রাউন্ডে নিজের অবস্থানটি জানেন (0 টি টিক)। আপনার আশেপাশের অঞ্চলে কে আছেন তা আপনিও জানেন:
এক্ষেত্রে আপনার আশেপাশে কেউ না থাকলে আপনি সবাই একা (বা তাই ভাবেন)। আপনার ontick
হ্যান্ডলারের প্রথম যুক্তিতে আপনি আশেপাশের আইটেমগুলি দেখতে পাচ্ছেন । পরে এপিআই সম্পর্কে আরও।
তোমার দল
আপনার দলটি আপনার ব্যবহারকারী আইডি দ্বারা নির্ধারিত হয়। এটি খুঁজে পেতে আপনার প্রোফাইল ছবিতে ক্লিক করুন:
তারপরে ঠিকানা বারে আপনার ব্যবহারকারীর আইডি সন্ধান করুন:
যদি এটি অদ্ভুত হয় তবে আপনি নীল দলে আছেন।
যদি এটি সমান হয় তবে আপনি লাল দলে রয়েছেন।
আপনার হাতে আঁকানো চেনাশোনাগুলির জন্য স্বাগতম।
আপনার (বট) নাম
আপনার বটের নামটি আপনার দলের প্রথম অক্ষর ("আর" বা "বি") দিয়ে শুরু হবে। এটি অবশ্যই রিজেক্সের সাথে মেলে /^(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)
। ডেটা আপনার যা কিছু হতে পারে এবং আপনি এটি যে কোনওটিকে, এমনকি অন্যান্য দলের খেলোয়াড়কে পাঠাতে পারেন । দুর্বল-প্রোগ্রামযুক্ত বটগুলি চালিত করতে এটি ব্যবহার করা যেতে পারে তবে সমস্ত খেলোয়াড় দেখতে পাচ্ছেন কে একটি বার্তা প্রেরণ করেছে এবং কারা তাদের দল চলছে।
উদাহরণ:
"Redisbest" নামে একটি বটকে কিছু পাঠান:
this.sendMessage("redisbest", undefined, "Hi!");
"Redisbest" এবং "নীলকুল" নামে একটি বটকে কিছু পাঠান:
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
(অনটিক থাকাকালীন)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
হয় একটি মাত্র বট (STRING), বট, বা একটি অ্যারের হতে পারে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
(যখন অনকিল থাকে)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
রান চালানোর আগে ক্লিক করুন। আপনি যতগুলি বট পছন্দ করতে চান তে পেস্ট করতে পারেন। "টেস্ট বটস" আপনার বিরুদ্ধে পরীক্ষা করার জন্য উদাহরণ test আপনি যদি এই সমস্তকে মারতে বা বেঁধতে পারেন তবে আপনার কমপক্ষে একটি শালীন বট রয়েছে।
জমা
বিধি
বিধি (নিয়ামক দ্বারা প্রয়োগ)
- আপনার মূল
ontick
কোডটি অবশ্যই 1 সেকেন্ডের বেশি লাগবে না। আমরা চিরকালের জন্য রাউন্ড নিতে চাই না। যদি আপনার কোড> 1 সেকেন্ড নেয় তবে এটি বন্ধ হয়ে যাবে। - যদি আপনি পালা প্রতি 1 টিরও বেশি ক্রিয়া করার চেষ্টা করেন বা কোনও অবৈধ ক্রিয়া করেন (যেমন
this.move(-1)
or - আরও শীঘ্রই আসতে পারে ...
বিধিগুলি (আমার দ্বারা প্রয়োগ করা হয়, এর ফলে ডিকিউ হতে পারে)
- গ্লোবাল ভেরিয়েবল লিখবেন না ( পড়া ঠিক আছে )।
- আপনার কোড অবশ্যই নোডেজে কাজ করবে (যদি নিয়ামক নোডেজগুলিতে পোর্ট করা থাকে), তবে
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...
বৈশিষ্ট্য অনুরোধ, বাগ, প্রশ্ন, ইত্যাদি?
নিচে মন্তব্য করুন! এর সাথে ইতিমধ্যে কোনও মন্তব্য আছে কিনা তা পরীক্ষা করে দেখুন। যদি ইতিমধ্যে একটি থাকে, তবে এটি আপভোট করুন।
আপনার দলের সাথে কথা বলতে চান?
লাল এবং নীল রঙের জন্য চ্যাট রুমগুলি ব্যবহার করুন ।
ভাষা
বর্তমানে, কেবল জেএস এবং জেএসকে সংকলিত কিছু সমর্থনযোগ্য তবে আপনি যদি নোডেজের সাথে অন্য ভাষাগুলি নিয়ে কাজ করার কোনও উপায় সম্পর্কে জানেন তবে আমি নিয়ামককে নোদেজে পোর্ট করে খুশি হব।
চূড়ান্ত নোট
কৌশল ধারণা
আপনার দলকে সহায়তা করুন! একটি বট তৈরি করা যা অন্য বটকে সাহায্য করার জন্য এবং একসাথে কাজ করার জন্য ডিজাইন করা হয়েছে। এই কৌশলটি রেড বনাম ব্লু - পিক্সেল টিম ব্যাটবটগুলির পক্ষে ভাল কাজ করেছে
প্রতিনিধি সন্ধানকারী
আমি বিজয়ী দলের সর্বোচ্চ ভোট প্রাপ্ত উত্তর গ্রহণ করব। মনে রাখবেন যে পূর্ববর্তী উত্তরগুলিতে বেশি ভোট পাওয়ার ঝোঁক রয়েছে তবে তাদের দুর্বলতাগুলি খুঁজে পাওয়ার এবং তাদের শোষণ করার সম্ভাবনা বেশি।
এছাড়াও, আপনি শীঘ্রই উত্তর দিলে আপনি +100 অনুগ্রহ পেতে পারেন।