পশ্চিমের দ্রুততম বন্দুক, পাহাড়ের চ্যালেঞ্জের রাজা


22

এটি একটি রাউন্ড রবিনে হিল চ্যালেঞ্জের কিং। এটি পশ্চিমের সেরা বন্দুকধারীর সন্ধানের লড়াই!

এই প্রতিযোগিতায় অংশ নিতে সক্ষম হতে আপনার দুটি ফাংশন করা দরকার। প্রথমটি আপনার বন্দুকধারীর বৈশিষ্ট্য নির্ধারণ করে এবং দ্বিতীয়টি বন্দুকধারীর জন্য মূল যুক্তি ফাংশন।

বৈশিষ্ট্য ফাংশন

function () {

    var bot = {
        name: "testBot",
        numbOfBullets: 7,
        reloadSpeed: 1, 
        shotsPerTurn: 1,
        moveSpeed: 2 
    }
    return bot
}

বৈশিষ্ট্য ফাংশনটিতে 5 টি ভেরিয়েবল অন্তর্ভুক্ত রয়েছে যা আপনাকে কিছু নিয়ম অনুসারে সেট করতে হবে (এটি বাদ দিয়ে nameকোনও স্ট্রিং হতে পারে)। আপনার বন্দুকধারীর উপর আপনাকে অবশ্যই মোট 15 পয়েন্ট ব্যয় করতে হবে - বন্দুকধারীরা যা সমস্ত 15 পয়েন্ট ব্যয় করে না তারা যোগ্য নয়। বৈশিষ্ট্যগুলি কীভাবে কাজ করে তা এখানে:

  • numbOfBullets - আপনার বন্দুকটি কয়টি বুলেট ধারণ করে তা নির্ধারণ করে।

    প্রাথমিক এবং সর্বনিম্ন মান numbOfBullets1। প্রতিটি অতিরিক্ত বুলেটটির জন্য 1 পয়েন্টের ব্যয় হয় 15 পয়েন্ট ব্যয় সহ সর্বাধিক 16 টি বুলেট।

  • reloadSpeed - আপনার বন্দুকধারীর গুলি শেষ হয়ে যাওয়ার পরে তার বন্দুকটি পুনরায় লোড করার জন্য কতটি পালা দরকার তা নির্ধারণ করে।

    বেস এবং সর্বাধিক মান 4 ন্যূনতম হওয়ার সাথে সাথে 4 this এই গুণটি 1 টি দ্বারা কমিয়ে 2 পয়েন্ট করে।

  • shotsPerTurn - সংজ্ঞা দেয় যে আপনার বন্দুকধারী এক বারে কতবার গুলি করতে পারে।

    বেস এবং সর্বনিম্ন মান হল 1। প্রতিটি বৃদ্ধি 1 পয়েন্ট 3 পয়েন্ট তাই আপনি 15 পয়েন্ট ব্যয় সঙ্গে রাউন্ডে সর্বাধিক 6 শট থাকতে পারে। এই বৈশিষ্ট্যটির উপরে উত্থাপন numbOfBulletsকরা পাল্টা উত্পাদনশীল কারণ আপনি আরও গুলি চালাতে পারবেন না তবে আপনার বন্দুকটি ধরে রাখতে পারে।

  • moveSpeed - আপনার বন্দুকধারীর এক পালায় কত স্পেস চালাতে পারে তা নির্ধারণ করে।

    বেস এবং সর্বনিম্ন মান 1। প্রতিটি বৃদ্ধি 1 পয়েন্ট ব্যয় সঙ্গে সর্বাধিক 6 গতি সঙ্গে 3 পয়েন্ট। বন্দুকধারী তার চলন গতি সর্বাধিক পর্যন্ত প্রতিটি বাঁক বাম বা ডান চালাতে পারে। তিনি স্থির হয়ে দাঁড়াতে পারেন যা তাকে বোনাস দেয় (আরও পরে এটি)।

উপরের উদাহরণের ফাংশনটিতে বুলেটগুলিতে 6 পয়েন্ট ব্যয়, পুনরায় লোড গতিতে 6 পয়েন্ট ব্যয় এবং গতিবেগে 3 পয়েন্ট ব্যয় রয়েছে।

প্রধান ফাংশন

function main(bulletsLeft, yourShots, enemyShots, yourMovement, enemyMovement) {

    var shots = [];
    shots.push(Math.floor((Math.random() * 24) + 1));
    var move = yourMovement[yourMovement.length - 1] + 2
    var play = [];
    play.shots = shots;
    play.move = move;
    play.reload = false;
    return play;
}

পরামিতি:

  • bulletsLeft, আপনার বন্দুকের গুলি গুলি সংখ্যা
  • yourShots, এটি আপনার বন্দুকধারীর দ্বারা চালিত অতীতের সমস্ত অবস্থানের অ্যারে।

    একজন বন্দুকধারীর উদাহরণ যিনি প্রতি রাউন্ডে 1 টি গুলি চালাতে পারেন:

    [[12],[4],[22],...]  
    

    একজন বন্দুকধারীর উদাহরণ যিনি প্রতি রাউন্ডে 3 টি গুলি চালাতে পারেন:

    [[12,13,14],[11,15,16],[9,14],...]
    
  • enemyShots - উপরের মতো তবে আপনার শত্রুর জন্যও

  • yourMovement - আপনার সমস্ত অতীতের চলমান অবস্থানের একটি অ্যারে
  • enemyMovement, উপরের মতো তবে আপনার শত্রুর জন্যও

আপনাকে কী ফিরিয়ে দিতে হবে:

আপনাকে একটি পরিবর্তনশীল ফিরিয়ে দিতে হবে যার 3 টি বৈশিষ্ট্য রয়েছে:

  • shots - সংখ্যার একটি অ্যারে যা নির্ধারণ করে যে আপনার বন্দুকধারী কোন স্থানটিতে গুলি করবে
  • move - এমন একক সংখ্যা যা আপনার বন্দুকধারী কোন স্থানটিতে যাওয়ার চেষ্টা করবে তা নির্ধারণ করে
  • reload - একটি সত্য / মিথ্যা মান যার সাহায্যে আপনি আপনার বন্দুকধারাকে পুনরায় লোড করতে পারেন

দ্বৈল

প্রতিযোগিতাটি একটি বৃত্তাকার রবিন 1 বনাম 1 সিস্টেম অনুসরণ করে। প্রতিটি বন্দুকধারীর প্রতি অন্য বন্দুকধারীর বিরুদ্ধে 50 টি রাউন্ড রয়েছে। একটি গুলি যতক্ষণ না কাউকে বুলেট দ্বারা আঘাত করা হয় বা turns turns টার্ন না পেরে যায় (উভয় খেলোয়াড় যখন গুলিবিদ্ধ হয় তখনই একটি পালা হয়)।

বন্দুকধারী তাদের প্রতিপক্ষকে হত্যা করে ২ পয়েন্ট অর্জন করতে পারে, যদি তারা উভয় একই পাল্লায় মারা যায় বা যদি তারা turns 66 টার্নের সীমাতে পৌঁছায় তবে 0 পয়েন্ট। শুটিংয়ের ক্ষেত্রটি 24 স্পেসের প্রস্থ (1-24 সহ)। কোনও খেলোয়াড়কে আঘাত করতে এবং একটি রাউন্ড জিততে আপনার বর্তমানে যে স্থানে দাঁড়িয়ে আছেন ঠিক একই জায়গায় শ্যুট করতে হবে।

দ্বৈত কাজটি কীভাবে কাজ করে সে সম্পর্কে একটি ধাপে ধাপে গাইড এখানে। এটি সমস্ত অবৈধ আদেশ এবং বিশেষ বিধিগুলিও কভার করে:

  • প্রতিটি দ্বন্দ্বের শুরুতে উভয় খেলোয়াড়কে 12 টি স্পেসে রাখা হয় এবং তাদের রিভলবারগুলি পুরোপুরি লোড হয়
  • মূল ফাংশনটি বলা হয় এবং বন্দুকধারীরা তাদের প্রথম চালনা কমান্ড তৈরি করে এবং যেখানে তারা গুলি করতে চায় তা চয়ন করে
  • প্রথমে বন্দুকধারীরা তাদের নতুন জায়গায় চলে যায়। যদি কোনও অবৈধ ইনপুট মুভ কমান্ডে করা হয় (অবস্থানগুলি নীচে তারপরে 1 বা তার বেশি হয় তবে 24 বা তারা আরও স্থান সরিয়ে নিয়ে যায় তবে তাদেরও অনুমতি দেওয়া হয়) তারা একই অবস্থানে থাকে।
  • পরবর্তী পুনরায় লোডিং চেক করা হয়, যদি আপনি আগের টার্নে গুলি চালিয়ে যান বা আপনি নিজেকে পুনরায় লোডিং বলে থাকেন তবে আপনার বন্দুকধারী পুনরায় লোড চক্রের মধ্যে চলে যায়। আপনি নিজের reloadSpeedমান সেট করার সাথে সাথে তিনি যতগুলি টার্নের জন্য পুনরায় লোড করছেন । আপনি যদি স্থির হয়ে দাঁড়ানোর সিদ্ধান্ত নিয়েছেন (যেখানে আগে দাঁড়িয়েছেন ঠিক একই স্থান পূর্ণসংখ্যাটি ফিরে আসছেন বা কেবলমাত্র একটি অবৈধ মান প্রত্যাবর্তন করছেন) আপনি পুনরায় লোড কাউন্টারটি একের পরিবর্তে 2 টি পরিবর্তে নেমে যাবেন।
  • এখন আপনার শ্যুটিংয়ের মানগুলি পরীক্ষা করে আসে, প্রতিটি টার্নে আপনি যতটা শুটিংয়ের জায়গাতে চান ঠিক তেমন প্রবেশদ্বারটি যথাযথ বৈধ পরিমাণে কেটে যাবে যা দ্বারা নির্ধারিত হয়: প্রতি ঘুরিয়ে শটের সংখ্যা এবং আপনার রিভলবারের বুলেটের সংখ্যা ( যেটি কম) shotsPerTurnআপনি যদি এই পালাটি স্থির করার সিদ্ধান্ত নেন তবে আপনার মান 1 দ্বারা বৃদ্ধি পেয়েছে, তাই আপনি যদি স্থির থাকার সিদ্ধান্ত নেন তবে আপনি অতিরিক্ত শট করতে পারেন make আপনি যদি পুনরায় লোড চক্রের মধ্যে থাকেন তবে আপনার 0 টি শট রয়েছে।
  • এখন আসল শুটিং আসে, এটি নীচে যেতে পারে এমন 2 টি উপায় রয়েছে। উভয় বন্দুকধারীর যদি একই মুভিস্পিড স্ট্যাট থাকে তবে তারা দুজন একই সাথে গুলি চালায় এবং দুজনেই একই সাথে একে অপরকে হত্যা করতে পারে। তাদের ক্ষেত্রে বিভিন্ন মুভিস্পিডের পরিসংখ্যান রয়েছে এমন ক্ষেত্রে উচ্চতর মুভিস্পিড স্ট্যাটের সাথে বটটি প্রথমে শ্যুটিং শুরু করে এবং যদি তিনি তার প্রতিপক্ষকে হত্যা করেন তবে তিনি এই রাউন্ডে জয়ী হন। বন্দুকধারী যদি এক রাউন্ডে এক বা একাধিক গুলি গুলি করতে পারে তবে উদাহরণ হিসাবে আরও চক্র ব্যতীত এটি উপরের মতো একই নিয়ম অনুসরণ করে: বলুন যে বট 1 এ 3 টি বুলেট রয়েছে এবং দ্রুত এবং বট 2 তে 2 গুলি রয়েছে তবে এটি এর মতো হবে :

    Bot1 shoots, Bot2 shoots cycle 1
    Bot1 shoots, Bot2 shoots cycle 2
    Bot1 shoots              cycle 3
    

এটি দেখতে একই রকম হবে যদি তাদের কেবল একই মুভ স্পিড থাকে তবে এখন যদি বোট 1 একই চক্রের বোট 2 টি আঘাত করে তবে বোট 2ও বট 1-এ আঘাত করতে পারে এবং এটি টাই হবে।

নিয়ম

প্রথমে আমি ক্যালভিনের শখের এন্ট্রি থেকে কিছু নিয়ম অনুলিপি করছি যা এখানেও প্রযোজ্য।

নতুন জাভাস্ক্রিপ্ট ভেরিয়েবল ঘোষণার সময়, আপনাকে অবশ্যই ভেরওয়ার্ডটি ব্যবহার করতে হবে। এর কারণ হ'ল ভেরিয়েবল পরিবর্তিত ঘোষিত ভেরিয়েবল স্থানীয় না হয়ে বৈশ্বিক হয়ে যায়, তাই নিয়ন্ত্রকের সাথে দুর্ঘটনাক্রমে (বা ইচ্ছাকৃতভাবে) ঝামেলা করা বা অন্যান্য খেলোয়াড়ের সাথে অবাধে যোগাযোগ করা সহজ হবে। এটি পরিষ্কার হতে হবে যে আপনি প্রতারণার চেষ্টা করছেন না।

ফাংশনগুলি ঘোষণাকালে ভের কীওয়ার্ডটিও ব্যবহার করা ভাল, অর্থাত্ তার var f = function(...) {...}পরিবর্তে ব্যবহার করুন function f(...) {...}.কেন আমি পুরোপুরি নিশ্চিত নই তবে কখনও কখনও এটি কোনও তাত্পর্যপূর্ণ বলে মনে হয়।

আপনার কোড আপনি নাও করতে পারেন ...

  • নিয়ামক বা অন্যান্য প্লেয়ারের কোড অ্যাক্সেস বা সংশোধন করার চেষ্টা করুন।
  • জাভাস্ক্রিপ্ট মধ্যে নির্মিত যে কোনও পরিবর্তন করার চেষ্টা।
  • ওয়েব অনুসন্ধান করুন।
  • অন্যথায় দূষিত জিনিসগুলি করুন।

আমার অতিরিক্ত নিয়ম:

  • ব্যবহারকারীরা যতটা চান বন্দুকধারী তৈরি করতে পারেন এবং যে কোনও সময়ের জন্য তাদের ফাংশন পরিবর্তন করতে পারেন
  • আমি গেমটি থেকে এমন কোনও এন্ট্রি সরিয়ে ফেলব যা হয় অতিরিক্ত পরিমাণে সময় নেয় বা যে কোনও উপায়ে আমার সাথে ফিট হওয়ার প্রবণতা দেখা যায়
  • আপনার ফাংশনটি যে বৈশিষ্ট্যগুলির ফিরতে হবে তার নামগুলি একই কাঠামোর উদাহরণগুলিতে একই হতে হবে!

আপনার উত্তরটি এই ফর্ম্যাটে থাকা উচিত, প্রথম ফাংশনটি অ্যাট্রিবিউট ফাংশন এবং দ্বিতীয়টি লজিক ফাংশন। লক্ষ্য করুন যে আমি একটি বিস্ময়বোধক চিহ্নটি ব্যবহার করেছি কারণ আপনি যদি কোড ব্লকগুলির মধ্যে কেবল নতুন লাইন তৈরি করেন তবে পার্সার দুটি ভিন্ন কোড ব্লক দেখতে পাবে না যাতে সেগুলি পৃথক করতে আপনাকে কোনও চিহ্ন (কেবল একটি বিস্মৃতি চিহ্ন ব্যবহার করতে হবে):

var bot = {
    name: "testBot",
    numbOfBullets: 7,
    reloadSpeed: 1,
    shotsPerTurn: 1,
    moveSpeed: 2
}
return bot
var shots = []
var testBot_moveUp = true
if(Math.random() * 2 > 1)
    testBot_moveUp = false
shots.push(Math.floor((Math.random() * 24) + 1))
var move = 0
if (testBot_moveUp)
    move = yourMovement[yourMovement.length - 1] + 2
else
    move = yourMovement[yourMovement.length - 1] - 2
move = 12
var play = []
play.shots = shots
play.move = move
play.reload = false
return play

এবং এখানে নিয়ামক: গেম কনট্রোলার । কেবলমাত্র লিঙ্কটি খুলুন এবং বটগুলি লোড হওয়ার জন্য অপেক্ষা করুন, তারপরে লড়াইয়ে আপনি কোনটি বেছে নিতে চান (সম্ভবত সমস্ত) এবং স্টার্ট বোতামটি টিপুন।

আমি আমার উত্তর হিসাবে একটি টেস্টবোটও রেখেছিলাম যা প্রতিযোগিতা করবে, এটি উত্তরটির কাঠামোটি কেমন হওয়া উচিত তা উদাহরণ হিসাবে কাজ করে। একটি নোট হিসাবে, আপনি যদি একটি ছোট ভুল করেন এবং আপনার উত্তরটি স্ট্যাকেক্সচেঞ্জগুলি অ্যালগরিদম সম্পাদনা করেন তবে তা সরাসরি গ্রহণ করতে পারে না এবং স্ট্যাকেক্সচেঞ্জ দ্বারা উত্পাদিত কন্ট্রোলার যে সাইট ব্যবহার করে তা আপডেট হয় না (তবে পরে বা আপনি যদি আমার প্রস্তাবিত আরও বড় পরিবর্তন করেন তবে করছেন, কেবল শেষে কিছু পাঠ্য যুক্ত করুন)। এখানে সাইট: কোডেলিংক


আমি এই মুহুর্তে দুটি বটকে একে অপরের সাথে লড়াই করতে সক্ষম বলে মনে হচ্ছে না- যদি আমি তাদের উভয়কেই বেছে নিয়েছি, আরম্ভ করা টিপলে কিছু করার মনে হয় না এবং আমি নিশ্চিত নই যে এটি আমার বটটি ভুল হয়েছে কিনা নিয়ামক দীর্ঘ সময়
নিচ্ছেন

হ্যাঁ যেভাবে আমি আমার প্রশ্নের শেষে ব্যাখ্যা করেছি যখন আপনি নিজের উত্তরটি সম্পাদনা করেছেন তখন এটি স্ট্যাকেক্সচেঞ্জ কোড জেনারেটরে এখনও সম্পাদনা করতে পারেনি কারণ এটি লক্ষ্য করে দেখেনি যে কোনও পরিবর্তন হয়েছে, যদি আপনি নিজের উত্তর শেষে কিছু পাঠ্য যুক্ত করেন তবে এটি কার্যকর হবে
ভজুরা

1
আমি মনে করি (আঙ্গুলগুলি পেরিয়ে গেছে) আমি এই ত্রুটিগুলি সংশোধন করেছি- যদি নিয়ামক আমাকে সঠিক আউটপুট সরবরাহ না করে এবং নিঃশব্দে কিছুই করেন না বলে ত্রুটিগুলি খুঁজে পাওয়া ঠিক কঠিন
ইউনজট

8
আপনি <!---->"অদৃশ্যভাবে" (ছাড়া !) কোডব্লকগুলি পৃথক করতে ব্যবহার করতে পারেন ।
কেআরয়ান

1
ত্রুটিটি পাওয়া গেছে। "প্লে 1 = মাস্কডএভাল (প্লেয়ার্স [এ] .কোড, প্যারামস)" "থেকে" প্লে 1 = মাস্কডেভাল (প্লেয়ারপ্লেয়ার্স [এ] .কোড, প্যারামস) "- প্লে 2 এর জন্য সমান
কোয়াড্রেক্সট এট

উত্তর:


6

Pandarus

var bot = {
    name:"Pandarus",
    numbOfBullets: 2,
    reloadSpeed: 3,
    shotsPerTurn: 1,
    moveSpeed: 5
}
return bot

var myPos;
if(yourMovement.length > 0)
{
    myPos = yourMovement[yourMovement.length - 1];
}
else
{
    myPos = 12;

}
var EnemyPos;
if(enemyMovement.length>0) {
    EnemyPos = enemyMovement[enemyMovement.length - 1];
}
else
{
    EnemyPos = 12;
}

var play = {
    shots: [
    ],
    reload: true,
    move: 12
};
if (bulletsLeft < 1)
{
    //Reload
    play.reload = true;
    play.shots = [
    ];
}
else
{
    //FIRE!!!
    play.reload = false;
    var enemyMoveSum = 0;
    for (var i = 0; i < enemyMovement.length; i++)
    {
        var MoveSinceLast;
        if (i == 0)
        {
            MoveSinceLast = enemyMovement[i] - 12;
        }
        else
        {
            MoveSinceLast =enemyMovement[i] - enemyMovement[i-1];
        }

        enemyMoveSum += Math.abs(MoveSinceLast);
    }

    var enemyAvgMove;
    if (enemyMovement.length > 0)
    {
        enemyAvgMove = Math.round(enemyMoveSum / enemyMovement.length);
    }
    else
    {
        enemyAvgMove = 0;
    }

    var LeftShot = EnemyPos - enemyAvgMove;
    var RightShot = EnemyPos + enemyAvgMove;

    if (RightShot > 24 ||( (LeftShot>0) && (Math.random()*2 < 1)))
    {
        play.shots.push(
            LeftShot
        );
    }
    else
    {
        play.shots.push(
            RightShot
        );
    }
}

var MyMove = myPos;
do
{
    var move = Math.floor(Math.random() * 10) - 5;
    if(move == 0)
    {
        move = 5;
    }
    MyMove = myPos + move;
}
while (MyMove<1 || MyMove > 23)

play.move = MyMove;

return play;

বুলেটগুলি বের করার জন্য পান্ডারাস তার গতিতে নির্ভর করে এবং শত্রুরা পূর্ববর্তী আন্দোলনগুলি কোথায় যায় সে অনুমান করতে ব্যবহার করে।


ক্ষমা করতে হবে, স্কোরিংয়ে একটি বাগ ছিল এখন সবকিছু সঠিকভাবে কাজ করে। আমার কাছে খুব অদ্ভুত
লাগছিল

ওহ এবং আপনার জমা দেওয়ার ক্ষেত্রে আরও একটি অদ্ভুত জিনিস ছিল, আপনার মুভ কমান্ডের জন্য সংখ্যাগুলি যেখানে
দশমিকগুলি

আমি সত্যিই জানি না কেন এটা দশমিক outputting ছিল :-) আমি চেষ্টা এবং আগামীকাল আরও উন্নত করব
euanjt


হ্যাঁ দুঃখিত, যাইহোক আমি (অবশেষে) এটি এখন কাজ করে পেয়েছি (এবং আপনার পরীক্ষার বটকে মারছে) :)
ইউয়ানজট

5

একটি সাধারণ মানুষ

কোনও কিছুর ক্ষেত্রে নিখুঁত নয়, তবে কম শক্তি দ্বারা সমস্ত কিছুতে বেশ ভাল good

return {
    name: "A Simple Man",
    numbOfBullets: 7,   /* 9 points */
    shotsPerTurn: 2,    /* 3 points */
    reloadSpeed: 4,     /* 0 points */
    moveSpeed: 3        /* 3 points */
}
var lastPos = yourMovement[ yourMovement.length - 1 ],
    lastEnemyPos = enemyMovement[ enemyMovement.length - 1 ],
    lastEnemyMove = enemyMovement.length > 1 ? 
        ( function () {
            var i = 0,
                currentMove,
                minMove = Infinity;
            while ( i < enemyMovement.length ) {
                currentMove = Math.abs( enemyMovement[ enemyMovement.length - 1 ] - enemyMovement[ enemyMovement.length - 2 ] );
                if ( currentMove < minMove ) { minMove = currentMove; }
                return minMove;
            }
        } )()
        : 1,
    needsToReload = bulletsLeft === 0;

return {
    shots: [ yourMovement.length === 1 ? 12 : lastEnemyPos + lastEnemyMove, lastEnemyPos - lastEnemyMove ],
    move: needsToReload ? lastPos : lastPos + Math.floor( Math.random() * 3 + 1 ) * ( ( Math.random() > 0.5 ) ? -1 : 1 ),
    reload: needsToReload
};

সিনট্যাক্স হাইলাইট করার জন্য @ প্রোগ্রামফক্সকে ধন্যবাদ, তবে এটি প্রোগ্রামটি ভেঙে দিয়েছে।
মার্কাস ব্লাটারম্যান man

এটা বিরক্তিকর. সিনট্যাক্স হাইলাইটিং যুক্ত করা কেবল একটি HTML মন্তব্য এবং প্রোগ্রামটি ভাঙ্গা উচিত নয়।
প্রোগ্রামফক্স

জানেন না, তবে প্রোগ্রামামটি আমার কোডটি আর লোড করে নি, এখন আবার ঠিক আছে।
মার্কাস ব্লাটারম্যান

আহ, আমি দেখছি, সম্ভবত পার্সার এইচটিএমএল মন্তব্যে ফর্ম্যাটটি বুঝতে পারেন নি, সুতরাং এটি প্রোগ্রামটি প্রকৃতপক্ষে ভেঙে ফেলল। আমার খারাপ!
প্রোগ্রামফক্স

4
var bot = {
    name: "testBot",
    numbOfBullets: 7,
    reloadSpeed: 1,
    shotsPerTurn: 1,
    moveSpeed: 2
}
return bot
var shots = []
var testBot_moveUp = true
if(Math.random() * 3 > 1)
    testBot_moveUp = false
shots.push(Math.floor((Math.random() * 24) + 1))
var move = 0
if (testBot_moveUp)
    move = yourMovement[yourMovement.length - 1] + 2
else
    move = yourMovement[yourMovement.length - 1] - 2
var play = []
play.shots = shots
play.move = move
play.reload = false
return play

পরীক্ষা বট, এটি একটি নিয়ন্ত্রণ পরীক্ষা হিসাবে যুক্ত হয়েছে। কেউ যদি এতে হেরে যায় তবে আপনার লজ্জা হওয়া উচিত :) :) স্থির বট আচরণ, অনুলিপিটি ভুল পরীক্ষার বটকে আটকে দিয়েছে (এটি সর্বদা ফিল্ডে থাকে 12)


4
var bot = {
    name: "Sniper",
    numbOfBullets: 4,   /* 3 points */
    reloadSpeed: 4,     /* 0 points */
    shotsPerTurn: 1,    /* 0 points */
    moveSpeed: 5        /* 12 points */
};
return bot;
var play = {};
var my_speed = 5;

var gatherStatistics = function(moves) {
    var enemyMoves = [];

    for (var m = 1; m < moves.length; ++m) {
        var diff = moves[m]-moves[m-1];

        var found = false;
        for (var i = 0; i < enemyMoves.length; ++i) {
            if (enemyMoves[i][0] === diff) {
                ++enemyMoves[i][1];
                found = true;
                break;
            }
        }
        if (!found) enemyMoves.push([diff,1]);
    }

    return enemyMoves;
};
var calcOptimalTarget = function(moves, histogram) {
    var enemy_pos = moves[moves.length-1];
    var optimalDiffs = [];
    var optimalScore = 0;

    for (var i = 0; i < histogram.length; ++i) {
        var diff = histogram[i][0];
        var score = histogram[i][1];

        if (score > optimalScore) {
            optimalScore = score;
            optimalDiffs = [diff];
        } else if (score === optimalScore) {
            optimalDiffs.push(diff);
        }
    }

    var chosenDiff = optimalDiffs[Math.floor(Math.random() * optimalDiffs.length)];
    return enemy_pos + chosenDiff;
};

/* Never reload */
play.reloading = false;

/* Run around like a mad man */
var my_pos = yourMovement[yourMovement.length-1];
var rand_sign = 2*Math.floor(2*Math.random())-1;

/* Never run into walls */
if (my_pos <= my_speed+1) {
    rand_sign = 1;
} else if (my_pos >= 24 - my_speed - 1) {
    rand_sign = -1;
}

if (yourMovement.length === 1) { /* Leap out of the way on first move */
    play.move = yourMovement[yourMovement.length-1] + rand_sign*my_speed;
} else {
    play.move = yourMovement[yourMovement.length-1] + rand_sign*((my_speed-1)*Math.floor(2*Math.random()) + 1);
}

/* Shoot all bullets by the end of the game */
var random_shot = (Math.random() > 0.15) ? true : false;

if (enemyMovement[enemyMovement.length-1] === enemyMovement[enemyMovement.length-2]) {
    /* Enemy is standing still; now is our time to STRIKE! */
    play.shots = [ enemyMovement[enemyMovement.length-1] ];
} else if (enemyMovement.length >= 2 && random_shot) {
    /* We take a random shot; best guess by enemies movement */
    var histogram = gatherStatistics(enemyMovement);
    play.shots = [ calcOptimalTarget(enemyMovement, histogram) ];
} else {
    /* No default shooting */
    play.shots = [];
}

return play;

সুতরাং শত্রু যদি কখনও দাঁড়িয়ে না থাকে তবে স্নাইপার কখনই গুলি চালায় না? : ডি
ভজুরা

3

তাঁতি

হত্যার চেয়েও বেঁচে থাকার সাথে বেশি চিন্তিত, তিনি পিছনে পিছনে বুনে, প্রতিবার তার দূরত্ব বাড়িয়ে তোলে। শ্যুট করার জন্য শত্রুদের মধ্যে প্রমাণিত পরিসীমাটির মধ্যে একটি এলোমেলো স্থান বেছে নেয়।

var bot = {
    name: "TheWeaver",
    numbOfBullets: 4, // 3 points
    reloadSpeed: 4, // 0 points
    shotsPerTurn: 1, // 0 points
    moveSpeed: 5 // 12 points
}
return bot;

var play = {};
var moveSpeed = 2;

//Guess the enemies speed
var enSpeed = 1; 
var prev = 12;
for(var move in enemyMovement){
    if(Math.abs(move - prev) > enSpeed){
        enSpeed = Math.abs(move - prev);
    }
    prev = move;
}

//Randomly shoot in his range
var enemyPos = 12;
if(enemyMovement.length > 0){
    enemyPos = enemyMovement[enemyMovement.length - 1];
}
var shots = [];

//Shoot somewhere in his range
var distance = Math.random()*enSpeed;
var direction = 1;
if(Math.random() < 0.5){ direction = -1;}
if(enemyPos + enSpeed > 24){ direction = -1;}
if(enemyPos - enSpeed <= 0){ direction = 1;}
shots.push(enemyPos + distance*direction);





var move = 12;

//Start with a dash
if(yourMovement.length == 0){
    move = 12 + moveSpeed - 1;
}
//Quick switch
else if(yourMovement.length == 1){
    move = 11
}
//Wave baby, weave
else{
    var lastPos = yourMovement[yourMovement.length - 1];
    var lastMove = yourMovement[yourMovement.length - 1] - yourMovement[yourMovement.length - 2];
    var distance = Math.abs(lastMove + 1);
    if(distance > moveSpeed) { distance = 0;}
    var direction = lastMove/Math.abs(lastMove)*(-1);
    move = lastPos + distance*direction;
}


//Correct move
if(move > 24){
    move = 24;
}
if(move < 1){
    move = 1;
}

play.move = move;
play.reload = false;
play.shots = shots;



return play;

move = 12 + moveSpeed - 1;সমান move = 11 + moveSpeed;, না? অন্যথায় এটি দেখতে একটি ভাল বট;)
তালি

@ কনফিউজড এমআর_সি হাহা হ্যাঁ, এটি একই, আমি অনুমান করি যে আমি কেবল পঠনযোগ্যতার জন্য প্রথমটি বেছে নিয়েছি, এটি আরও স্পষ্ট করে তুলেছে যে এটি প্রথম দিক থেকে সরিয়ে নেওয়া সর্বাধিক মুভস্পিডের চেয়ে কম স্থানান্তরিত করে। মানচিত্রের আকার পরিবর্তন বা কোনও কিছু বদলে 15 দিয়ে সমস্ত 12 টি প্রতিস্থাপন করা সহজ করে তোলে
কেইন

2
ওহ ঠিক আছে. আমরা এখানে সমস্ত প্রোগ্রামার রয়েছি তাই আমি অবাক হয়ে গিয়েছিলাম যে অন্য কেউ এর উল্লেখ করেনি: P
তালি

3

আলেকজান্ডার হ্যামিল্টন

তিনি যদি প্রথম রাউন্ডে না জিতেন তবে সম্ভবত মরে যাবেন

var bot = {
    name: "Hamilton",
    numbOfBullets: 7, // 6 pts
    reloadSpeed: 4, // 0 pts
    shotsPerTurn: 4, // 9 pts
    moveSpeed: 1 // 0pts
}
return bot

!

var shots = []
var move = yourMovement[yourMovement.length - 1] + 1
var play = []
play.shots = [12,11,10,13,14,9,15,8,16,7,17,6,18]
play.move = move
play.reload = false
return play

3

হারুন বুড়

var bot = {
    name: "Burr",
    numbOfBullets: 7, // 6 pts
    reloadSpeed: 4, // 0 pts
    shotsPerTurn: 3, // 6 pts
    moveSpeed: 2 // 3pts
}
return bot  

!

var shots = []
var move = yourMovement[yourMovement.length - 1]
// Dodging dance
switch (yourMovement.length % 4) {
  case 1:
    move += 2
    break;
  case 2:
    move -= 1
    break;
  case 3:
    move -= 2
    break;
  case 0:
    move += 1
    break;
}
var play = []
var elast = enemyMovement[enemyMovement.length - 1]
play.shots = [elast + 1, elast -1, elast]
play.move = move
play.reload = false
return play

3
var bot = {
    name: "Winger",
    numbOfBullets: 7, // 6 points
    reloadSpeed: 4, // 0 points
    shotsPerTurn: 3, // 6 points
    moveSpeed: 2 // 3 points
}
return bot;
var play = {};
var moveSpeed = 2;

//Guess the enemies speed
var enSpeed = 5; // Assume they are fast on the first turn
var prev = 12;
for(var move in enemyMovement){
    if(Math.abs(move - prev) > enSpeed){
        enSpeed = Math.abs(move - prev);
    }
    prev = move;
}


var move = 12;
if(Math.random() < 0.5){ moveSpeed = 1; }
//Move against the enemies shots
if(yourMovement.length == 0 || enemyShots.length == 0){
    move = 12 + moveSpeed;
}
else if(enemyShots.length == 1){
    if(enemyShots[0] <= 12){
        move = yourMovement[yourMovement.length - 1] - moveSpeed;
    }
    else{
        move = yourMovement[yourMovement.length - 1] + moveSpeed;
    }
}
else{
    var dir = enemyShots[enemyShots.length - 1][0] - yourMovement[yourMovement.length - 1];
    if(dir > 0){
        move = yourMovement[yourMovement.length - 1] + moveSpeed;
    }
    else{
        move = yourMovement[yourMovement.length - 1] - moveSpeed;
    }
}

//reload?
var reload = false;
if(bulletsLeft < 3){
    reload=true;
}

var enemyPos = 12;
if(enemyMovement.length > 0){
    enemyPos = enemyMovement[enemyMovement.length - 1];
}
var shots = [];
if(reload == false){
    //Shoot a spread around the opponent
    shots.push(enemyPos);
    if(enemyPos + enSpeed <= 24){ shots.push(enemyPos + enSpeed);}
    if(enemyPos - enSpeed > 0){ shots.push(enemyPos - enSpeed);}

}

//Correct move
if(move > 24){
    move = 24;
}
if(move < 1){
    move = 1;
}
if(reload && (yourMovement[yourMovement.length - 1] - yourMovement[yourMovement.length - 2]) != 0){
    move = yourMovement[yourMovement.length - 1];
}

play.move = move;
play.reload = reload;
play.shots = shots;



return play;

উইঙ্গার এমন একটি বিস্তার ছড়িয়ে দেয় যা শত্রুদের সীমার সীমাবদ্ধ করে। শত্রুদের শটেও তিনি এক ধরণের রান করেন।

রিসেটটি ধাক্কা দেওয়ার জন্য এটি এখানে রেখে চলেছে।


2

SMG

তার বন্দুকটি তার প্রচ্ছদ। দুর্ভাগ্যক্রমে, এটি তার দৃষ্টিভঙ্গি আটকাচ্ছে বলে মনে হচ্ছে। দ্রুত পুনরায় লোড করার জন্য এবং অতিরিক্ত শট নেওয়ার জন্য স্থির হয়ে দাঁড়িয়ে থাকা সুবিধা নিয়েও তিনি ভাল।

var bot = {
    name: "SMG",
    numbOfBullets: 12, //11pt
    reloadSpeed: 2,    //4pt
    shotsPerTurn: 1,   //0pt
    moveSpeed: 1       //0pt
}
return bot
var shots = [];
shots.push(Math.floor((Math.random() * 24) + 1));
shots.push(Math.floor((Math.random() * 24) + 1));
var play = [];
if (bulletsLeft < 1) {
play.reload = true;
play.shots = [];
}
play.shots = shots;
play.move = Math.floor((Math.random() * 24) + 1);
play.reload = false;
return play;

2
var bot = {
    name: "Random Evader",
    numbOfBullets: 7,
    reloadSpeed: 4, 
    shotsPerTurn: 1,
    moveSpeed: 4 
}
return bot
var getSpeed=function(Moves){
    var m = 0;
    for(var i=1;i<Moves.length;i++){
        var d = Math.abs(Moves[i]-Moves[i-1]);
        m = m>d?m:d;
    }
    return m;
}
var validMove=function(moves,speed){
    speed = speed||getSpeed(moves);
    var m;
    do{
        m=moves[moves.length-1]+Math.floor(Math.random()*(speed*2+1)-speed);
    }while(m>25 && m<0);
    return m;
}
var shots = [];
shots.push(validMove(enemyMovement));
var move = validMove(yourMovement,4);
return {
    shots:shots,
    move:move,
    reload:false
};

যেহেতু এটি কখনই পুনরায় লোড হচ্ছে না, আপনি পুনরায় লোড গতির কোনও পয়েন্ট নষ্ট না করে পরিবর্তে আরও বুলেট কিনলে ভাল হয় better
QuadrExAtt

@ কোয়াড্রেক্সট: আপনার শট শেষ হয়ে গেলে পুনরায় লোড স্বয়ংক্রিয় হয়।
মেগাটম

2
var bot = {
    name: "Gun and run",
    numbOfBullets: 4,   /* 3 points */
    reloadSpeed: 4,     /* 0 points */
    shotsPerTurn: 3,    /* 6 points */
    moveSpeed: 3        /* 6 points */
};
return bot;
var play = {};
play.reload = false;
if (yourShots.length === 1) { /* Opening move */
    if (Math.random() < 0.5) {
        play.shots = [13,14,15,16];
    } else {
        play.shots = [8,9,10,11];
    }
    play.move = 12;
} else { /* YOLO */
    play.shots = [];
    switch (yourMovement[yourMovement.length - 1]) {
        case 12:
            play.move = 15; 
            break;
        case 15:
            play.move = 18;
            break;
        case 18:
            play.move = 15;
            break;
    }
}
return play;

1
আরে এটির "আপনার শটস" আমার মাই শটগুলি নয়, এখন আমি এটি সম্পর্কে "মাইশটস" ভাবলে আরও ভাল হত, ওহ এবং সরানো একটি অ্যারে কেবল তার একটি সংখ্যা নয়
বাজুর

1

Diephobus

var bot = {
    name: 'Deiphobus',
    numbOfBullets: 5,
    reloadSpeed: 3,
    shotsPerTurn: 4,
    moveSpeed: 1
};
return bot

var getSorted = function(list)
{
    var modifiedList = [0,0,0,0,0,0,0,0,0,0,0,0,0];
    modifiedList[0] = list[6];
    modifiedList[1] = list[7];
    modifiedList[2] = list[5];
    modifiedList[3] = list[8];
    modifiedList[4] = list[4];
    modifiedList[5] = list[9];
    modifiedList[6] = list[3];
    modifiedList[7] = list[10];
    modifiedList[8] = list[2];
    modifiedList[9] = list[11];
    modifiedList[10] = list[1];
    modifiedList[11] = list[12];
    modifiedList[12] = list[0];

    var messedUpOrder = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];
    for(var order = 0; order < 13; order++) {
        var currBest = -2;

        for (var i = 0; i < 13; i++) {
            if ((messedUpOrder.indexOf(i) < 0) && (modifiedList[i] > modifiedList[currBest] || currBest<0)) {

                currBest = i;
            }
        }

        messedUpOrder[order] = currBest;
    }

    var toRet = [0,0,0,0,0,0,0,0,0,0,0,0,0];
    toRet[6] = messedUpOrder[0];
    toRet[7] = messedUpOrder[1];
    toRet[5] = messedUpOrder[2];
    toRet[8] = messedUpOrder[3];
    toRet[4] = messedUpOrder[4];
    toRet[9] = messedUpOrder[5];
    toRet[3] = messedUpOrder[6];
    toRet[10] = messedUpOrder[7];
    toRet[2] = messedUpOrder[8];
    toRet[11] = messedUpOrder[9];
    toRet[1] = messedUpOrder[10];
    toRet[12] = messedUpOrder[11];
    toRet[0] = messedUpOrder[12];

    return toRet;
};
var myPos;
if(yourMovement.length>0) {
   myPos  = yourMovement[yourMovement.length - 1];
}
else{
    myPos = 12;
}
var EnemyPos;
var play = {
    shots: [
    ],
    reload: true,
    move: 12
};
if(enemyMovement.length>0) {
    EnemyPos = enemyMovement[enemyMovement.length - 1];
}
else
{
    EnemyPos = 12;
}
if(bulletsLeft<4)
{
    play.reload = true;
}
else
{
    play.reload = false;
    var enemyChanges = [0,0,0,0,0,0,0,0,0,0,0,0,0];
    for(var i = 0; i<enemyMovement.length; i++)
    {
        var enemyChange;
        if(i == 0)
        {
            enemyChange = enemyMovement[i] - 12;
        }
        else
        {
            enemyChange = enemyMovement[i] - enemyMovement[i-1];
        }

        enemyChanges[enemyChange+6] = enemyChanges[enemyChange+6]+1;
    }

    var orderedEnemyChanges = getSorted(enemyChanges);
    var CurrentShot = 0;
    play.shots = [12,12,12,12];
    for(var i = 0; i<orderedEnemyChanges.length && CurrentShot<4; i++)
    {
        var pos = orderedEnemyChanges[i] + EnemyPos - 6;
        if(pos<24 && pos>0)
        {
            play.shots[CurrentShot] = pos;
            CurrentShot ++;
        }
    }
}
if(myPos == 1)
{
    play.move = 2;
}
else if (myPos == 23)
{
    play.move = 22;
}
else
{
    play.move = myPos + (Math.floor((Math.random() * 3)) %3) - 1;
}
return play;

ডাইফোবাস সর্বত্র নির্লজ্জভাবে গুলি চালিয়ে গুলি চালায় যেখানে সে মনে করে যে তার শত্রু হতে পারে তবে সে কিছুটা ধীর।


1

ASCIIGunInTheWest

দুটি পালা শট দেয় এবং অনুমান করে যেখানে শত্রু কতটা দ্রুত চলে তার উপর ভিত্তি করে শত্রু যেতে পারে। কোনও ত্রুটি থাকলে আমাকে ক্ষমা করুন, আমি জাভাস্ক্রিপ্টে খুব বেশি কোডিং করি নি।

var bot = {
    name: "ASCIIGunInTheWest",
    numbOfBullets: 4,
    reloadSpeed: 1,
    shotsPerTurn: 2,
    moveSpeed: 2
}
return bot

!

function main(bulletsLeft, yourShots, enemyShots, yourMovement, enemyMovement) {
    var randnum = function (min, max) { return Math.floor( Math.random() * (max - min + 1) ) + min }
    var getDiff = function (num1, num2) { return Math.abs( (num1 > num2) ? num1-num2 : num2-num1 ) }
    var shots = []
    var enemyMaxMovement = 0
    for (index = 0 index < enemyMovement.length ++index) {
    var moveDiff = getDiff(enemyMovement[index], enemyMovement[index - 1])
        if (index != 0 && moveDiff > enemyMaxMovement) {
           enemyMaxMovement = moveDiff
        }
    }
    var enemyCurrentPosition = enemyMovement[enemyMovement.length - 1]
    var enemyMinMoveRange = enemyCurrentPosition - enemyMaxMovement
    var enemyMaxMoveRange = enemyCurrentPosition + enemyMaxMovement
    shots.push( randnum(enemyMinMoveRange, enemyMaxMoveRange) )
    shots.push( randnum(enemyMinMoveRange, enemyMaxMoveRange) )
    var move = yourMovement[yourMovement.length - 1] + randnum(-2, 2)
    var play = []
    play.shots = shots
    play.move = move
    play.reload = false
    return play
}

সম্পাদনা: দৃশ্যত আমার বট (কেবলমাত্র আমার) জেএসফিডেলে ব্যবহার করা যাবে না। কেউ কি জানো এটা কেন? আমি আমার বন্দুকধারীর জন্য আমার সমস্ত পয়েন্ট ব্যবহার করছি, তাই আমার মনে হয় না যে আমি অযোগ্য হয়েছি।


এটি সম্ভবত 3 বছর আগে অনেক বেশি দরকারী হয়ে উঠেছে তবে কোটএইচ টুর্নামেন্টের রানার রিফ্যাকচারিংয়ের সময় আমার মনে হয় কেন: আপনি একটি মূল () ফাংশন ঘোষণা করেছিলেন যেখানে এমন একটি সুযোগে যেখানে একটি মূল ফাংশন ইতিমধ্যে টুর্নামেন্টের রানার দ্বারা তৈরি করা হয়েছিল ( হ্যাঁ, বাস্তবায়নের বিশদ)।
eaglgenes101

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