টিম দ্য হিল!


27

এই চ্যালেঞ্জটি @ হেলকাহোম্বার দুর্দান্ত চ্যালেঞ্জ রেড বনাম ব্লু - পিক্সেল টিম ব্যাটবটগুলি দ্বারা অনুপ্রাণিত হয়েছিল । এই চ্যালেঞ্জটি সম্ভবত এই সাইটে আমি সবচেয়ে ভাল দেখেছি। কখনো।

আমার চ্যালেঞ্জটি এখনও অনেক আলাদা, তবে @ হেলকাহোম্বা অনুপ্রেরণার জন্য কৃতিত্বের দাবিদার।

সংক্ষিপ্ত বিবরণ

এটি একটি টিম যেখানে আপনার দলে সমস্ত দলকে আপনার দলে বেঁচে রেখে জিততে পারে। অন্য কথায়, শেষ দল স্থায়ী জয়। অঙ্কনগুলি আবার করা হবে।

আপনি একটি বোর্ডে আছেন। আপনি প্রথম রাউন্ডে নিজের অবস্থানটি জানেন (0 টি টিক)। আপনার আশেপাশের অঞ্চলে কে আছেন তা আপনিও জানেন:

9x9 গ্রিডে একটি একক লাল বর্গক্ষেত্র, সাদা কক্ষ দ্বারা বেষ্টিত।

এক্ষেত্রে আপনার আশেপাশে কেউ না থাকলে আপনি সবাই একা (বা তাই ভাবেন)। আপনার ontickহ্যান্ডলারের প্রথম যুক্তিতে আপনি আশেপাশের আইটেমগুলি দেখতে পাচ্ছেন । পরে এপিআই সম্পর্কে আরও।

তোমার দল

আপনার দলটি আপনার ব্যবহারকারী আইডি দ্বারা নির্ধারিত হয়। এটি খুঁজে পেতে আপনার প্রোফাইল ছবিতে ক্লিক করুন:

আমার প্রোফাইল ছবি

তারপরে ঠিকানা বারে আপনার ব্যবহারকারীর আইডি সন্ধান করুন:

এটি / ব্যবহারকারী / এবং / আপনার ব্যবহারকারী নামের মধ্যে রয়েছে

যদি এটি অদ্ভুত হয় তবে আপনি নীল দলে আছেন।

যদি এটি সমান হয় তবে আপনি লাল দলে রয়েছেন।

আপনার হাতে আঁকানো চেনাশোনাগুলির জন্য স্বাগতম।

আপনার (বট) নাম

আপনার বটের নামটি আপনার দলের প্রথম অক্ষর ("আর" বা "বি") দিয়ে শুরু হবে। এটি অবশ্যই রিজেক্সের সাথে মেলে /^(r|b)[A-Za-z_-]$/। তা ছাড়া, আপনি নিজের বটের নাম বাছাই করতে পারেন। ইতিমধ্যে বিদ্যমান একটি ব্যবহার করবেন না।

শুরু হচ্ছে

লাল প্লেয়ারগুলি মানচিত্রের শীর্ষের কাছাকাছি শুরু হবে এবং নীলাটি নীচের দিকে শুরু হবে। ফাংশনের environmentপ্যারামিটারে আপনাকে প্রথম টিক (টার্ন) সম্পর্কিত বিশেষ তথ্য দেওয়া ontickহবে। আমি এটি সংরক্ষণ করার পরামর্শ দিচ্ছি। বিস্তারিত জানার জন্য এপিআই দেখুন।

আপনার পালা

টার্ন অর্ডার প্রথমে এলোমেলোভাবে করা হয় তবে তারপরে একই থাকে।

কর্ম সক্রিয় করুন

আপনি কেবল প্রতি একক ক্রিয়া করতে পারেন।

  • পদক্ষেপ

    আপনি যখন স্থানান্তর করতে চান, আপনি এপিআইতে কল this.move(num)করুন। numআপনি যে ঘরে যেতে চান সেই ঘরটি:

    0 শীর্ষ বাম, 1 শীর্ষ মধ্যম, 2 শীর্ষ ডান, 3 টি মাঝারি ডান, 4 টি মাঝ বাম, 5 নীচে বাম, 6 নীচে মাঝারি, এবং 7 নীচে ডান।

    আপনি যে নম্বরগুলিতে স্থানান্তর করতে পারেন তার আপেক্ষিক অবস্থানগুলি বিশ্ব ধ্রুবতে সংরক্ষণ করা হয় threeByThree:

[
    [0, 1, 2],
    [3, undefined, 4],
    [5, 6, 7]
]

যদি আপনি কোনও দেয়ালে বা অন্য কোনও খেলোয়াড়ের দিকে যান তবে কিছুই হয় না।

  • ঘুরান

    ঘোরার জন্য, আপনি কল করুন this.rotate(num)। আপনি যে দিকে ঘোরতে চান তা হ'ল নাম:

    0 শীর্ষে রয়েছে, 1 টি সঠিক, 2 টি নীচে এবং 3 টি বামে

    আবর্তন পরম।

  • বধ

    যদি আপনি যে কক্ষটির মুখোমুখি হয়ে থাকেন অন্য খেলোয়াড় (অন্য দল থেকে) থাকে তবে আপনি this.kill()তাদের কল করে হত্যা করতে পারেন । যদি সেখানে কেউ না থাকে বা তারা আপনার দলে থাকে তবে এটি কিছুই করে না। উদাহরণ:

    উপরের মতো একই সংখ্যা, 0 টি ঘর সবুজ, 1 টি নীল, 2 কমলা, এবং 3 টি হলুদ

    আপনি যদি পরিণত হয় 0, আপনি সবুজ হত্যা করতে পারেন। আপনি যদি 1 এ পরিণত হয় তবে আপনি নীলকে মেরে ফেলতে পারেন। যদি আপনি 2 এ পরিণত হয় তবে আপনি কমলা মেরে ফেলতে পারেন। আপনি 3 এ পরিণত হয়, আপনি হলুদ বধ করতে পারেন।

  • বোমা

    বোমাবর্ষণ আপনার চারপাশে 9 স্কোয়ারে আপনাকে এবং সতীর্থ সহ সমস্ত খেলোয়াড়কে হত্যা করে । উদাহরণ:

    প্রতিটি কক্ষে "x" গুলি সহ একটি 9x9 গ্রিড রয়েছে।

    আপনি কেন কখনও এটি করতে চান? কামিকাজেআপনার আশেপাশে 9 টি কক্ষে যদি আপনার দলে আরও খেলোয়াড় না থাকে তবে আপনার দলে রয়েছেন, আপনি বোমা ফেলার কথা বিবেচনা করতে পারেন। (আমি আপনাকে প্রথমে আপনার কমরেডকে অবহিত করার পরামর্শ দিচ্ছি!)

  • একটি ল্যান্ডমাইন রাখুন

    এটি আপনার দলে নয় অন্যদের জন্য একটি ডেথ স্কয়ার তৈরি করে। আপনি যখন কোনও ল্যান্ড মাইন স্থাপন করেন, আপনিও স্থানান্তরিত হন যাতে আপনি এটিতে পা না দেন। আপনি this.landMine(num)যেখানে নাম্বারটি যেতে চান সেই বর্গটি কল করুন । উদাহরণ:

    9x9 গ্রিডে একটি একক লাল বর্গক্ষেত্র, সাদা কক্ষ দ্বারা বেষ্টিত।

    তারপরে আপনি কল করুন this.landMine(4):

    [একটি 9x9 গ্রিড, মাঝখানে একটি লাল "এম" এবং মাঝখানে ডানদিকে একটি লাল ঘর রয়েছে।

    "এম" দেখুন? এটি একটি ল্যান্ডমাইন। অন্যরা আপাতত এটি দেখতে পাবে। এমনকি আপনার দলে নেই এমন যে কেউ, এটি রাখা টিকটিতে একটি ল্যান্ডমাইন দেখতে পাবেন। কিন্তু সেই টিকটি শেষ হওয়ার পরেও কেউ নেই, আপনি এটি দেখতেও পাচ্ছেন না। তবে কোনও শত্রু তার উপর দিয়ে হাঁটার সাথে সাথে এটি বিস্ফোরিত হবে। উদাহরণ:

    দুটি 9x9 গ্রিড, প্রথমটির মাঝখানে একটি নীল কক্ষ, প্রথমটির মাঝখানে একটি লাল "এম", দ্বিতীয়টির মাঝখানে একটি লাল "এক্স" এবং তাদের মধ্যে একটি তীর।

    আপনার ল্যান্ডমাইনটিতে নীল সরানো হয়েছে, এবং বুম! আপনি সবেমাত্র অন্য একটি হত্যা পেয়েছেন।

    প্রতি 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)

    আপনার পালা যখন বলা হয় Promise1 সেকেন্ড বা তারও কম সমাধানের সমাধান অবশ্যই করতে হবে বা তা উপেক্ষা করা হবে। এটি কার্য সম্পাদনের কারণে এবং এতে ট্যাবটি হ্যাং না করার দুর্দান্ত পার্শ্ব-প্রতিক্রিয়া রয়েছে।

    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"}। অ্যারের সূচকগুলি:

    0 শীর্ষ বাম, 1 শীর্ষ মধ্যম, 2 শীর্ষ ডান, 3 টি মাঝারি ডান, 4 টি মাঝ বাম, 5 নীচে বাম, 6 নীচে মাঝারি, এবং 7 নীচে ডান।

    নোট করুন যে বর্তমানের ব্যতীত অন্য কোনও টিকের উপরে রাখা ল্যান্ডমাইনগুলি প্রদর্শিত হবে না।

    aroundMe উদাহরণ:

    আসুন বলি এটি গ্রিড (আপনি লাল):

    একটি 9x9 গ্রিড, উপরের বামে হালকা নীল, উপরের ডানদিকে ধূসর "এম", মাঝখানে লাল, মাঝ বামে হলুদ এবং নীচে বামদিকে একটি লাল "এম"

    আপনার 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.
]

অ্যারের সূচিগুলি এখানে ব্যাখ্যা করা হয়েছে:

0 শীর্ষ বাম, 1 শীর্ষ মধ্যম, 2 শীর্ষ ডান, 3 টি মাঝারি ডান, 4 টি মাঝ বাম, 5 নীচে বাম, 6 নীচে মাঝারি, এবং 7 নীচে ডান।

আপনার বট কার্যকরভাবে এটি দেখে:

উপরের বামদিকে একটি হালকা নীল রঙের বাক্স যার সাথে একটি কালো নম্বর 0 রয়েছে, বাম প্রান্তে একটি হলুদ বাক্স যার সাথে কালো 4 নম্বর রয়েছে এবং নীচে বামদিকে একটি লাল "এম" রয়েছে যার উপরে একটি কালো 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 অনুগ্রহ পেতে পারেন।


1
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডেনিস

আমি কি একাধিক বট তৈরি করতে পারি? (দুঃখিত, আমি জানি যে কথোপকথনটি সরানো হয়েছে, আমি ঠিক তাই আড্ডা দিয়েছি)
ম্যাথু রোহ

@ সিআইজিএসইজিভি হ্যাঁ, তবে অন্য কাউকে অবশ্যই এটি পোস্ট করতে হবে। আপনি একটি বট পোস্ট করতে পারেন এবং অন্যের কোডটি আপনার দলের কাউকে দিতে পারেন, তবে আপনি দুবার পোস্ট করতে পারবেন না।
প্রোগ্রামার

অবস্থান সম্পর্কে, যেখানে [0, 0] -অনডেক্সড সেল, এটি কি শীর্ষ-বাম ঘর? এছাড়াও, বার্তাগুলি কী আপনার ক্রিয়া গ্রহণ করে (প্রতি টার্ন)? ধন্যবাদ।
থ্রাক্স

@ থ্রাক্স হ্যাঁ, এবং না। এমনকি আপনি কোনও বার্তার জবাবে বার্তাও দিতে পারেন।
programmer5000

উত্তর:


7

এক্সস্কার্ড (অ-প্রতিযোগী)

createBot({
    ontick: function(environment) {
        var reverse = [0, 1, 2, 3, 4, 5, 6, 7].reverse();
        return new Promise((resolve, reject)=>{
            (this.aroundMe || []).forEach((item,idx)=>{
                this.move(reverse[idx]);
                return resolve();
            });
            this.move(~~(Math.random() * 8));
            return resolve();
        });
    },
    onmessage: function() {
    },
    team: "none",
    name: "xscared",
    onkill: function(){
    }
});

মানুষকে খুব ভয় পেয়েছে। এটি দেখতে প্রথম ব্যক্তি (বা ল্যান্ডমাইন) থেকে দূরে চলে যায়। অন্যথায়, এটি এলোমেলোভাবে সরানো হয়। নোট করুন যে এটি প্রতিযোগিতা করছে না, কেবল একটি উদাহরণ। এটি বীট করার চেষ্টা করুন!


6

ব্যাকআপ, একটি নীল বট

আড্ডায় সতর্ক হিসাবে, আমি জীবনে কখনও জাভাস্ক্রিপ্টে কিছু লিখিনি, সুতরাং যদি আপনার কোনও ভুল খুঁজে পাওয়া যায় তবে দয়া করে আমাকে বলুন! (ইতিমধ্যে এটি সম্পর্কে আমাকে সহায়তা করার জন্য @ প্রোগ্রামার ৫০০০ কে ধন্যবাদ)
এই বটটির ধারণাটি হ'ল এটি একই দল থেকে অন্যান্য বটগুলির সাথে যোগাযোগ করে এবং এটি পাওয়া খনিগুলির মানচিত্রের সাথে তাদের অবস্থানটি প্রেরণ করে। এটি নিকটতম নীল বটটিতে যোগ দেওয়ার চেষ্টা করে (যদি কেউ তার অবস্থানের ডেটা [[x, y] অ্যারে হিসাবে দেওয়া হয়) প্রেরণ করে) এবং এটির নিকটে থাকে (যতটা সম্ভব তার পিছনে থাকে), লাল বটগুলির কাছে পৌঁছায় বা দেখবে খনি জন্য এগিয়ে।

createBot({
    team: 'blue',
    name: 'backup',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            //if (typeof this.x != "undefined") this.storage['position'] = [this.x, this.y];
            if (typeof environment.x != "undefined") this.storage['position'] = [environment.x, environment.y]; //Modified according to @WasteD
            if (typeof this.storage['map'] == "undefined") { //Create empty map
                var map = [[]];
                //for(i=0;i<this.gridHeight;i++) map[i]=[];
                for(i=0;i<environment.gridHeight;i++) map[i]=[]; //Modified according to @WasteD
                this.storage['map'] = map;
            }
            var blue = []
            var red = []
            var x = this.storage['position'][0];
            var y = this.storage['position'][1];
            var dx = [-1, 0, 1, -1, 0, 1, -1, 0, 1]
            var dy = [1, 1, 1, 0, 0, 0, -1, -1, -1]
            (this.aroundMe || []).forEach((item, idx) => { // Update map and list positions of surrounding blues and reds
                if (item && item.team == 'red' && typeof item.name != "undefined") red += idx;
                if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx[idx]][y+dy[idx]] = 'M';
                if (item && item.team == 'blue' && typeof item.name != "undefined") blue += idx;
            });
            this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']}); //Send to buddies my position and the map
            if (red.indexOf([1, 4, 6, 3][this.direction]) > -1) this.kill() ; //If red guy is in front of
            else if (red.indexOf([1,4,6,3]) > -1) this.rotate(red.indexOf([1,4,6,3])); //If red guy is next but not in front of
            else if (blue.indexOf(3) > -1){ //If blue buddy on the left
                if (blue.indexOf(4) > -1){ //If another one is on the right
                    if (blue.indexOf(1) > -1 && this.direction != 2) this.rotate(2); //...and a third one at the top
                    else var digging = this.dig();
                    }
                else if (this.direction != 1) this.rotate(1);
                else var digging = this.dig();
            }
            else if (blue.indexOf(1) > -1){
                if (blue.indexOf(6) > -1 && this.direction != 3) this.rotate(3);
                else if (this.direction != 2) this.rotate(2);
                else var digging = this.dig();
            }
            else if (blue.indexOf(4) > -1){
                if (this.direction != 3) this.rotate(3);
                else var digging = this.dig();
            }
            else if (blue.indexOf(6) > -1 && this.direction != 0) this.rotate(0);
            else if (blue.indexOf([0,2]) > -1){ //If no blue next to me but one in diagonal, move next
                this.move(1);
                this.storage['position'][1] = y+1; //Update position
            }
            else if (blue.indexOf([5,7]) > -1){
                this.move(6);
                this.storage['position'][1] = y-1;
            }
            else if (typeof this.storage['other_blue'] != "undefined"){ //Check if buddies said where they were, try to go near the closest one
                var dmin = 99999;
                var pos = []
                (this.storage['other_blue'] || {}).forEach((item, idx) => {
                    var d = Math.sqrt(Math.pow(item['position'][0]-x,2) + Math.pow(item['position'][1]-y,2));
                    if (d < dmin){
                        dmin = d;
                        pos = item['position'];
                        }
                });
                if (pos[0]-x > 0){
                    this.move(4);
                    this.storage['position'][0] = x+1
                }
                else if (pos[0] < 0){
                    this.move(3);
                    this.storage['position'][0] = x-1
                }
                else if (pos[1] > 0){
                    this.move(1);
                    this.storage['position'][1] = y+1
                }
                else{
                    this.move(6);
                    this.storage['position'][1] = y-1
                }
            }
            else var digging = this.dig();
            if (typeof digging != "undefined"){ //Check out surroundings if dig() was played and update the map accordingly
                var dx2 = [-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2];
                var dy2 = [2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2];
                (digging || []).forEach((item, idx) => {
                    //if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M';
                    if (item) this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M'; //previously misread what dig() returned
                });
            }
            resolve();
        });
    },
    onmessage: function(data, fromTeam, fromBot) {
        if (typeof data['position'] != "undefined" && fromTeam == 'blue') { //If position sent by a blue bot
            if (typeof this.storage['other_blue'] == "undefined") this.storage['other_blue'] = [];
            for (i in this.storage['other_blue']){
                var found = false;
                if ('name' in i){
                    if (i['name'] == fromBot){
                        i['position'] = data['position'];
                        found = true; //Update if position already known from previous ticks
                        }
                }
            }
            if (!found) this.storage['other_blue'] += {'position':data['position'], 'name':fromBot}; //Add position if previously unknown
            this.sendMessage(fromBot, undefined, "roger.");
        }
    },
    onkill: function() {this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']});}
});

আরে আপনি যত্নশীল আমি যদি এটিতে প্রবেশ করি তবে তবে (আলাদা নামের সাথে) আমিও নীল রঙে আছি
ক্রিস্টোফার

@ ক্রিস্টোফার না আমি কিছু মনে করি না তবে আপনি এবং দলের জন্য এটি কিছুটা আকর্ষণীয় হবে যদি আপনি কমপক্ষে কিছুটা আলাদা করেন (কমপক্ষে ইতিমধ্যে বিদ্যমান দুটি বট পরিপূরক হিসাবে)।
প্ল্যানাপাস

তা করবে। আমি এটি পরিবর্তন করব
ক্রিস্টোফার

আমি যদি আপনার বোট কোডেপেনে চালানোর চেষ্টা করি তবে এটি কাজ করে না কারণ আপনি ব্যবহার করছেন this.xএবং এগুলি হয় তবে environment.xআমি বা ভুল করছি?
বর্জ্য

@ ওয়াস্টডি যেমন বলেছিলাম আমি জাভাস্ক্রিপ্ট মোটেই জানি না, সুতরাং এটি সম্ভব। তবে যদি এটি হয় তবে আমার ধারণা এটিও হওয়া উচিত environment.gridHeightএবং environment.aroundMe? যা ক্ষেত্রে অন্যান্য বটগুলি সেগুলি ব্যবহার করা উচিত নয় this.aroundMe
প্ল্যানাপাস

5

নীল, নীল, আমার পৃথিবী নীল

createBot({
    team: 'blue',
    name: 'blue-blue-my-world-is-blue',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            var red = 0;
            // See who's around me
            (this.aroundMe || []).forEach((item, idx) => {
                if (item && item.team == 'red') red++;
            });
            // If surrounded, take one for the team
            if (red >= 6) this.bomb();
            else {
                // Translate direction into position
                var kill = [1, 4, 6, 3][this.direction];
                // Random values
                var move = Math.floor(Math.random() * 8);
                var nsew = Math.floor(Math.random() * 4);
                // Lay a landmine if possible
                if (this.landMines) this.landMine(move);
                // Kill if someone is in the way
                else if (this.aroundMe && this.aroundMe[kill] && this.aroundMe[kill].team == 'red' && this.aroundMe[kill].name) this.kill();
                else {
                    // Move somewhere if already in the requested direction
                    if (nsew == this.direction) this.move(move);
                    // Otherwise just rotate to the requested direction
                    else this.rotate(nsew);
                }
            }
            resolve();
        });
    },
    onmessage: function(data, from, fromBot) {},
    onkill: function() {}
});

বেশিরভাগ এলোমেলো, তবে চারপাশে থাকলে বোমা ফেলা হবে এবং চারপাশে যাচাই করা এবং চলার পথে হত্যার পক্ষে রয়েছে।


স্মার্ট! সুন্দর.
programmer5000

3
আপনি শুনুন, এখানে একটি গল্প, একটি নীল পৃথিবীতে বাস করা একটি ছোট্ট ছেলেটির কথা।
ম্যাথু রোহ 11

3

নিরুদ্বেগ-বোমারু বিমান

এই বটটি প্রতিটি দিকে কমপক্ষে 1 টি বিনামূল্যে সেল দিয়ে একটি জায়গা অনুসন্ধান করে তারপরে একটি খনি লাগায়। শত্রু কাছে না আসা পর্যন্ত এটি তার উপর শিবির স্থাপন করে। যখন কেউ কাছাকাছি আসবে, তখন সে অন্য খনিটির উপরে অন্য বোটটি টোপানোর জন্য পিছনে পিছনে সরে আসবে mine প্রয়োজনে তিনি ঘোরান এবং মেরে ফেলবেন। যখন তার কোনও খনি বাকি নেই, তিনি প্রাচীরের পিছনে উপরের বাম কোণে আশ্রয় চাইবেন এবং যদি তাকে হুমকি দেওয়া হয় তবে প্রতিশোধ নেবেন।

selfকীওয়ার্ডের সাহায্যে তাঁর দলে তাঁর অবস্থানের সম্প্রচার ছাড়াও এখানে কোনও বিশেষ টিম্প্লে নেই ।

createBot({
    team: 'red',
    name: 'relaxed-bomber',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            if (typeof this.storage['dropped'] == "undefined") {
                this.storage['dropped'] = false;
                this.storage['covered'] = false;
                this.storage['baited'] = false;
            }
            if (typeof environment.x != "undefined" && typeof environment.y != "undefined") {
                this.storage['pos'] = [environment.x, environment.y];
            }
            if (typeof environment.gridWidth != "undefined" && typeof environment.gridHeight != "undefined") {
                this.storage['grid'] = [environment.gridWidth, environment.gridHeight];
            }
            var x = this.storage['pos'][0];
            var y = this.storage['pos'][1];
            var x0 = this.storage['grid'][0];
            var y0 = this.storage['grid'][1];
            var source = [1, 4, 6, 3];
            var dest = [6, 3, 1, 4];
            var rot = [0, 1, 2, 3];
            var movex = [-1, 0, 1, -1, 1, -1, 0, 1];
            var movey = [-1, -1, -1, 0, 0, 1, 1, 1];
            var action = false;
            if (this.landMines > 0) { 
                var move = [false, false, false, false];
                var moveIndex = -1;
                if (x <= 0) { move[1] = true; }
                if (x >= x0 - 1) { move[3] = true; }
                if (y <= 0) { move[2] = true; }
                if (y >= y0 - 1) { move[0] = true; }    
                if (move[0] && !move[1] && !move[2] && move[3]) { moveIndex = 0; }
                if (move[0] && !move[1] && !move[2] && !move[3]) { moveIndex = 1; }
                if (move[0] && move[1] && !move[2] && !move[3]) { moveIndex = 2; }
                if (!move[0] && !move[1] && !move[2] && move[3]) { moveIndex = 3; }
                if (!move[0] && move[1] && !move[2] && !move[3]) { moveIndex = 4; }
                if (!move[0] && !move[1] && move[2] && move[3]) { moveIndex = 5; }
                if (!move[0] && !move[1] && move[2] && !move[3]) { moveIndex = 6; }
                if (!move[0] && move[1] && move[2] && !move[3]) { moveIndex = 7; }  
                if (moveIndex >= 0) {
                    this.storage['pos'] = [ x + movex[moveIndex], y + movey[moveIndex]];
                    this.move(moveIndex);
                } else {
                    this.storage['dropped'] = true;
                    this.storage['covered'] = false;
                    this.landMine(1);
                }
            } else {
                if (this.storage['dropped']) {
                    this.storage['dropped'] = false;
                    this.storage['covered'] = true;
                    this.storage['pos'] = [ x + movex[6], y + movey[6]];
                    this.move(6);
                } else if (this.storage['covered']) {
                    for (var i = 0; i < source.length; i++) {
                        if (typeof environment.aroundMe[source[i]] != "undefined" && typeof environment.aroundMe[source[i]].team != "undefined" && environment.aroundMe[source[i]].team == "blue" && typeof environment.aroundMe[source[i]].name != "undefined") {
                            this.storage['covered'] = false;
                            this.storage['baited'] = true;
                            this.storage['mine'] = this.storage['pos'].slice();
                            this.storage['reverse'] = source[dest[i]];
                            this.storage['pos'] = [ x + movex[dest[i]], y + movey[dest[i]]];
                            this.move(dest[i]);
                            action = true;
                        }
                    }
                    if (!action) {
                        this.dig();
                    }
                } else if (this.storage['baited']) {
                    for (var i = 0; i < source.length; i++) {
                        if (typeof environment.aroundMe[source[i]] != "undefined" && typeof environment.aroundMe[source[i]].team != "undefined" && environment.aroundMe[source[i]].team == "blue" && typeof environment.aroundMe[source[i]].name != "undefined") {
                            if (this.direction == rot[source[i]]) {
                                this.kill();
                                this.storage['baited'] = false;
                                action = true;
                            } else {
                                this.rotate(rot[source[i]]);
                                action = true;
                            }
                        }
                    }
                    if (!action) {
                        if (this.storage['mine'][0] == this.storage['pos'][0] && this.storage['mine'][1] == this.storage['pos'][1]) {
                            this.storage['pos'] = [ x + movex[this.storage['reverse']], y + movey[this.storage['reverse']]];
                            this.move(this.storage['reverse']);
                            this.storage['reverse'] = source[this.storage['reverse']];
                        } else {
                            this.storage['pos'] = [ x + movex[this.storage['reverse']], y + movey[this.storage['reverse']]];
                            this.move(this.storage['reverse']);
                            this.storage['reverse'] = dest[this.storage['reverse']];
                        }
                    }
                } else {
                    for (var i = 0; i < source.length; i++) {
                        if (typeof environment.aroundMe[source[i]] != "undefined" && typeof environment.aroundMe[source[i]].team != "undefined" && environment.aroundMe[source[i]].team == "blue" && typeof environment.aroundMe[source[i]].name != "undefined") {
                            if (this.direction == rot[source[i]]) {
                                this.kill();
                                this.storage['baited'] = false;
                                action = true;
                            } else {
                                this.rotate(rot[source[i]]);
                                action = true;
                            }
                        }
                    }
                    if (!action) {
                        if (x > 0 && y > 0) {
                            this.storage['pos'] = [ x + movex[0], y + movey[0]];
                            this.move(0);
                        } else if (x > 0 && y == 0) {
                            this.storage['pos'] = [ x + movex[3], y + movey[3]];
                            this.move(3);
                        } else if (x == 0 && y > 0) {
                            this.storage['pos'] = [ x + movex[1], y + movey[1]];
                            this.move(1);
                        } else {
                            this.rotate(1);
                        }
                    }
                }
            }
            this.sendMessage(undefined, "red", {'self': this.storage['pos'] });
            resolve();
        });
    },
    onmessage: function(data, fromTeam, fromBot) {},
    onkill: function() {}
});

আপনি কোন দলের সাথে আছেন?
প্রোগ্রামার

@ প্রোগ্রামার ৫০০০০ যেহেতু বটের নামগুলি দলের চিঠি দিয়ে শুরু করতে হবে, আমি অনুমান করি আমি টিম রেড :)
থ্রাক্স

চমৎকার বট! আমি আপনাকে আপনার দলের আশেপাশে যা আছে তা ব্রডকাস্ট করার পরামর্শ দিচ্ছি।
প্রোগ্রামার

1

ব্যাকআপ 1 অন্য নীল বট (এটি আগে করতে ভুলে গেছেন)

createBot({
    team: 'blue',
    name: 'backup1',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            //if (typeof this.x != "undefined") this.storage['position'] = [this.x, this.y];
            if (typeof environment.x != "undefined") this.storage['position'] = [environment.x, environment.y]; //Modified according to @WasteD
            if (typeof this.storage['map'] == "undefined") { //Create empty map
                var map = [[]];
                //for(i=0;i<this.gridHeight;i++) map[i]=[];
                for(i=0;i<environment.gridHeight;i++) map[i]=[]; //Modified according to @WasteD
                this.storage['map'] = map;
            }
            var blue = []
            var red = []
            var x = this.storage['position'][0];
            var y = this.storage['position'][1];
            var dx = [-1, 0, 1, -1, 0, 1, -1, 0, 1]
            var dy = [1, 1, 1, 0, 0, 0, -1, -1, -1]
            (this.aroundMe || []).forEach((item, idx) => { // Update map and list positions of surrounding blues and reds
                if (item && item.team == 'red' && typeof item.name != "undefined") red += idx;
                if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx[idx]][y+dy[idx]] = 'M';
                if (item && item.team == 'blue' && typeof item.name != "undefined") blue += idx;
            });
            this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']}); //Send to buddies my position and the map
            if (red.indexOf([1, 4, 6, 3][this.direction]) > -1) this.kill() ; //If red guy is in front of
            else if (red.indexOf([1,4,6,3]) > -1) this.rotate(red.indexOf([1,4,6,3])); //If red guy is next but not in front of
            else if (blue.indexOf(3) > -1){ //If blue buddy on the left
                if (blue.indexOf(4) > -1){ //If another one is on the right
                    if (blue.indexOf(1) > -1 && this.direction != 2) this.rotate(2); //...and a third one at the top
                    else var digging = this.dig();
                    }
                else if (this.direction != 1) this.rotate(1);
                else var digging = this.dig();
            }
            else if (blue.indexOf(1) > -1){
                if (blue.indexOf(6) > -1 && this.direction != 3) this.rotate(3);
                else if (this.direction != 2) this.rotate(2);
                else var digging = this.dig();
            }
            else if (blue.indexOf(4) > -1){
                if (this.direction != 3) this.rotate(3);
                else var digging = this.dig();
            }
            else if (blue.indexOf(6) > -1 && this.direction != 0) this.rotate(0);
            else if (blue.indexOf([0,2]) > -1){ //If no blue next to me but one in diagonal, move next
                this.move(1);
                this.storage['position'][1] = y+1; //Update position
            }
            else if (blue.indexOf([5,7]) > -1){
                this.move(6);
                this.storage['position'][1] = y-1;
            }
            else if (typeof this.storage['other_blue'] != "undefined"){ //Check if buddies said where they were, try to go near the closest one
                var dmin = 99999;
                var pos = []
                (this.storage['other_blue'] || {}).forEach((item, idx) => {
                    var d = Math.sqrt(Math.pow(item['position'][0]-x,2) + Math.pow(item['position'][1]-y,2));
                    if (d < dmin){
                        dmin = d;
                        pos = item['position'];
                        }
                });
                if (pos[0]-x > 0){
                    this.move(4);
                    this.storage['position'][0] = x+1
                }
                else if (pos[0] < 0){
                    this.move(3);
                    this.storage['position'][0] = x-1
                }
                else if (pos[1] > 0){
                    this.move(1);
                    this.storage['position'][1] = y+1
                }
                else{
                    this.move(6);
                    this.storage['position'][1] = y-1
                }
            }
            else var digging = this.dig();
            if (typeof digging != "undefined"){ //Check out surroundings if dig() was played and update the map accordingly
                var dx2 = [-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2];
                var dy2 = [2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2];
                (digging || []).forEach((item, idx) => {
                    //if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M';
                    if (item) this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M'; //previously misread what dig() returned
                });
            }
            resolve();
        });
    },
    onmessage: function(data, fromTeam, fromBot) {
        if (typeof data['position'] != "undefined" && fromTeam == 'blue') { //If position sent by a blue bot
            if (typeof this.storage['other_blue'] == "undefined") this.storage['other_blue'] = [];
            for (i in this.storage['other_blue']){
                var found = false;
                if ('name' in i){
                    if (i['name'] == fromBot){
                        i['position'] = data['position'];
                        found = true; //Update if position already known from previous ticks
                        }
                }
            }
            if (!found) this.storage['other_blue'] += {'position':data['position'], 'name':fromBot}; //Add position if previously unknown
            this.sendMessage(fromBot, undefined, "roger.");
        }
    },
    onkill: function() {this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']});}
});

1

ব্লু ফাইটার

createBot({
  team: "blue",
  name: "blue-fighter",
  ontick: function(environment) {
    return new Promise((resolve, reject)=>{
      let map = environment.aroundMe;
      let sides = [1, 4, 6, 3];
      let facing = sides[this.direction];
      let isTeam = (team,a) => a && a.team === team;
      let isRed = (a)=>isTeam("red",a);
      let isBlue = (a)=>isTeam("blue",a);
      let randomSquare = ()=>Math.floor(Math.random()*8);
      let redNum = map.filter(isRed).length;
      let blueNum =  map.filter(isBlue).length;
      if(redNum > blueNum && redNum > 2){
        this.bomb();
      }else if(isRed(map[facing])){
        this.kill();
      }else if(sides.includes(map.findIndex(isRed))){
        this.rotate(sides.indexOf(map.findIndex(isRed)));
      }else if(Math.random() < 0.5 && this.landMines > 0){
        this.landMine(randomSquare());
      }else{            
        this.move(randomSquare());
      }
      resolve();
    });
  },
  onmessage: function(data, from, fromBot) {},
  onkill: function(){}
});

নীল যোদ্ধা এলোমেলোভাবে মুভমেন্ট এবং ল্যান্ডমাইনগুলি এবং লাল প্লেয়ারগুলির দিকে ঘোরে। যদি আশেপাশের ব্লকগুলিতে নীলের চেয়ে বেশি লাল থাকে তবে এটি বোমা ফাটিয়ে দেয়। যদি এটি কোনও লাল প্লেয়ারের মুখোমুখি হয় তবে এটি এটি হত্যা করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.