কোথ: প্রত্যেকে টোকেন পছন্দ করে


24

এই গেমটিতে দুটি খেলোয়াড় সর্বাধিক পয়েন্ট টোকেন খাওয়ার প্রতিযোগিতা করে, তবে একটি মোড় আছে! একই রঙের এক সারি একাধিক টোকেন খাওয়া একটি ক্রমবর্ধমান বোনাস দেয়, তবে নজর রাখুন, বা আপনার প্রতিপক্ষ আপনি চান টোকেনগুলি খাওয়ার আগে আপনার পরিকল্পনা ব্যর্থ করে দেবে!

নিয়মাবলী:

  • 1 বনাম 1
  • n বোর্ড দ্বারা (5x5 এবং 15x15 এর মধ্যে এলোমেলো আকার)
  • আপনি এবং আপনার প্রতিদ্বন্দ্বী একই এলোমেলো কক্ষে স্পোন করবে
  • পুরো বোর্ড জুড়ে এলোমেলোভাবে কয়েকটি কোষে 1-3 থেকে শুরু করে মান উত্পন্ন করা হবে
  • 2 * (বোর্ডের প্রস্থ) টোকেন তৈরি করা হবে, তবে সেখানে ওভাররাইডগুলি হতে পারে, তাই সুযোগের ফলে কমও থাকতে পারে।
  • প্রতিটি সংখ্যা 3 টি রঙের মধ্যে একটি হবে: লাল, সবুজ বা নীল, হেক্স আরজিবি ফর্ম্যাটে
  • প্রতিটি রাউন্ডে, প্লেয়ার 1 চালায় এবং বোর্ড আপডেট হয়, তারপরে প্লেয়ার 2 চালিত হয় এবং বোর্ড আপডেট হয়। সুতরাং প্রতিটি খেলোয়াড় বোর্ড স্টেটের পরিবর্তনের উপর ভিত্তি করে আগের খেলোয়াড়টি কী পদক্ষেপ নিয়েছিল তা কার্যকরভাবে বলতে পারে। গেমটি শেষ না হওয়া পর্যন্ত এটি অব্যাহত থাকবে, পরে বর্ণিত।
  • আপনার পরিবর্তনের জন্য 6 টি অ্যাকশন রয়েছে: ইউপি, রাইট, ডাউন, বাম, ইএটি এবং পাস
  • 4 পদক্ষেপের আদেশগুলি স্ব-বর্ণনামূলক এবং আপনি নিজের পালাও পার করতে পারেন। আপনি যদি কোনও অযৌক্তিক পদক্ষেপ ফিরিয়ে দেন তবে আমরা ধরে নেব আপনাকে বোঝানো পাস। আপনি যদি বোর্ডের প্রান্তটি সরাতে চেষ্টা করেন তবে আপনি সরে যাবেন না। প্রান্তগুলি মোড়ানো হয় না।
  • আপনি বর্তমানে একই জায়গাতে যে নম্বরটি করছেন সেটিকে EAT গ্রাস করে
  • আপনি যতটা নম্বর পান সে হিসাবে আপনি অনেক পয়েন্ট অর্জন করতে পারেন
  • আপনি যদি একই রঙের এক সারিতে 2 নম্বর খান তবে আপনি +1 পাবেন
  • আপনি যদি একই রঙের এক সারিতে 3 নম্বর খান তবে আপনি +2 পান
  • আপনি যদি একই রঙের এক সারিতে এম সংখ্যা খান তবে আপনি + (মি -1) পাবেন
  • এই বোনাসগুলি সম্মিলিতভাবে যুক্ত করা হয়, সুতরাং একক সারিতে এম সংখ্যা পেতে আপনি আলাদা রঙ খাওয়ার সময়কালে মোট বোনাসে এম * (এম -1) / 2 বাড়ে।
  • খেলা শেষ শর্ত:
    • সমস্ত সংখ্যা গ্রাস করা হয়
    • 4 * (বোর্ডের প্রস্থ) টার্নগুলি কার্যকর খাওয়া ছাড়াই চলেছে (কেবল "EAT" বলে টোকেন যেখানে আপনি গণনা করছেন না) কোনও খেলোয়াড় দ্বারা ঘটছে (কোনও টোকেন 2 * (প্রস্থে) পৌঁছাতে পারে) চলুন, সুতরাং উভয় খেলোয়াড়ের মনে কোনও একক লক্ষ্য টোকেন না থাকলে এই সীমাটি ছাড়িয়ে যাবে only
  • আপনার এআইটি স্থানান্তর করতে এক সেকেন্ডেরও কম সময় নেয়, অন্যথায় পাস আপনার পছন্দ হিসাবে ধরে নেওয়া হবে।

টুর্নামেন্টটি বিশাল সংখ্যক রাউন্ডের সাথে গোলাকার রবিন হবে, 100 বা 1000 বলে দিন A টুর্নামেন্টটি সম্পূর্ণ হওয়ার পরে আমরা লোকদের মোট স্কোর অনুসারে রেঙ্ক করব will সুতরাং আপনি যদি কোনও গেমের খেলোয়াড় 2 হন, আপনার লক্ষ্য এখনও যথাসম্ভব পয়েন্ট পেতে পারে।

এআই জমা দেওয়া: আমার নিয়ামক যে ভাষাটি সমর্থন করেন তা হ'ল জাভাস্ক্রিপ্ট। একাধিক জমা দেওয়ার অনুমতি রয়েছে। প্রত্যেকে এই জাতীয় জিনিসের জন্য কনস্ট্রাক্টর জমা দেয়:

function (player1) {
    this.yourMove = function (b) {
        return "MOVE";
    }
}

ইনপুটটি player1হ'ল বুলিয়ান যা আপনি প্লেয়ার 1 বা না থাকুক saying আপনার কনস্ট্রাক্টরের অবশ্যই yourMoveফাংশন থাকতে হবে তবে এতে অতিরিক্ত সংখ্যক ফাংশন বা মানও থাকতে পারে। কোনও বৈশ্বিক ভেরিয়েবল সংজ্ঞায়িত করবেন না, কেবল তাদেরকে আপনার বস্তুতে ভেরিয়েবল হিসাবে রাখুন। প্রতিটি ম্যাচের শুরুতে আপনার অবজেক্টের একটি নতুন সংস্করণ তৈরি করা হবে এবং আপনার প্রতিটি টার্নে yourMoveবর্তমান বোর্ডকে ইনপুট হিসাবে এটিতে ডাকা হবে এবং এটিতে একটি বৈধ পদক্ষেপ নেওয়া উচিত।

b, ইনপুটটি yourMoveহ'ল বর্তমান বোর্ডের একটি অনুলিপি , এখানে নির্মাণকারী রয়েছে, ইনপুট উদাহরণ সহ, যদিও আপনি নিজেরাই তাদের কল করতে পারবেন না:

function token(color, points) {
    this.color = color; //"#FF0000"
    this.points = points; //5
}

function player(pos, score, colorBonus, lastColor) {
    this.pos = pos; //[5, 5]
    this.score = score; //9
    this.colorBonus = colorBonus; //i.e. 2 if you just ate 3 blue tokens in a row
                                  //0 if you just ate two different colors.
    this.lastColor = lastColor; //"#00FF00", is "#000000" at start
}

function board(player1, player2, tokens) {
    this.player1 = player1; //new player([5, 5], 9, 2, "#00FF00")
    this.player2 = player2; //new player([5, 5], 9, 2, "#00FF00")
    this.tokens = tokens; //[[new token("#0000FF", 5), false],
                      // [new token("#0000FF", 5), false]]
}

টোকেন অ্যারেতে কোনও ফাঁকা স্কোয়ারের জন্য "মিথ্যা" রয়েছে এবং টোকেনস [এ] [বি] টি টোকেনটি হ'ল x = a, y = b, উপরের-বাম কোণ থেকে শুরু হয়েছে।

নিয়ামক: এখানে গিটহাবের নিয়ামকের একটি লিঙ্ক। এটি একটি এইচটিএমএল ফাইল যা আপনি খেলা এবং রাউন্ড-রবিন কীভাবে কাজ করে তা দেখতে দৌড়াতে পারবেন এবং এটি দুটি এআই, একটি এলোমেলো একটি যা এলোমেলোভাবে প্রতিটি দিকে ঘুরে কিন্তু তার অবস্থানে টোকেন খায় এবং একটি নির্দোষ অ্যালগরিদম সর্বাধিক পয়েন্ট দেয় যে নিকটতম টোকেন জন্য যান। এটি জমা দেওয়ার সাথে সাথে আমি প্রতিটি এআইতে যুক্ত করব।

নীচে একটি স্নিপেট যা আপনাকে ডিফল্ট এআই এ নিয়ন্ত্রণকারী চালানোর অনুমতি দেয়। বর্তমান এআই:

  • KindaRandomAI
  • NaiveAI
  • MirrorBot
  • HungryBot


12
হ্যাঁ, একজন কোথাকার! এটা সর্বশেষ থেকে চিরকাল।
TheNumberOne

2
সম্মত, আমি আমাকে একটি ভাল KOTH ভালবাসি এবং এটি একটি দুর্দান্ত ভিত্তি বলে মনে হচ্ছে। আমি জেএসকে কিছুটা সবুজ, যদি আমরা প্লেয়ার অবজেক্টের মধ্যে ফলাফলগুলি সংরক্ষণ করতে না পারি তবে কীভাবে চলন্তগুলির মধ্যে গেমের অবস্থা ধরে রাখা যায়?
ডক্টরহেকল

বোর্ডের প্রস্থটি কি কার্যক্রমে কোথাও পেরিয়ে গেছে?
TheNumberOne

@BentNeeHumor হ্যাঁ, ফাংশন যা লাগে player1বুলিয়ান আপনার এআই নির্মাণকারী, যা একটি থাকবে yourMoveফাংশন যা ইনপুট হিসাবে বর্তমান বোর্ড লাগে, যেমন b
কাল্পনিক মেলুন

1
@ ডিলানস্প, কখনও কখনও মিলনের সম্ভাবনার কারণে তাদের অনুমতি দেওয়া হয় না তবে এই ক্ষেত্রে, জোটবদ্ধকরণের ন্যূনতম উপকার হবে, তাই আমি একাধিক জমা দেওয়ার অনুমতি দেব।
কাল্পনিক মেলুন

উত্তর:


4

HungryBot

প্রতিটি টোকেন অনুসরণ করার মানকে ওজন যুক্ত করতে একটি পয়েন্ট সিস্টেম ব্যবহার করে। এর বিবেচনায় বিভিন্ন কারণের বিভিন্ন ব্যবহার করে এবং এর সর্বোত্তম কৌশল অনুসরণের জন্য এটির প্রতিটি পালা পুনরায় মূল্যায়ন করে।

function hungryBot(first) {
  // Set up "self"
  var self = this;

  // Determine player order
  this.player = -(first - 2);
  this.enemy = first + 1;

  // Action associative array
  this.actions = ['EAT', 'LEFT', 'RIGHT', 'UP', 'DOWN'];

  //Logic handler
  this.yourMove = function(board) {
    // Determine player object
    var player = board['player' + self.player];
    var enemy = board['player' + self.enemy];

    // Point value action grid
    var actions = [0, 0, 0, 0, 0]; // Associative with "this.actions"

    // Board dimensions
    var size = board.tokens.length;
    var maxDist = size * 2;

    // Colors remaining
    var colors = {
      '#FF0000': 0,
      '#00FF00': 0,
      '#0000FF': 0
    };

    // Averaged value weight
    var average = [0, 0];

    // Total points
    var points = 0;

    // Token holder
    var tokens = [];

    // Token parser
    for (var i = 0, x = 0, y = 0; i < size * size; i += 1, x = i % size, y = i / size | 0) {
      if (!board.tokens[x][y]) {
        continue;
      } else {
        var token = {};
        token.points = board.tokens[x][y].points;
        token.color = board.tokens[x][y].color;
        token.x = x - player.pos[0];
        token.y = y - player.pos[1];
        token.distX = Math.abs(token.x);
        token.distY = Math.abs(token.y);
        token.dist = token.distX + token.distY;
        token.distE = Math.abs(x - enemy.pos[0]) + Math.abs(y - enemy.pos[1]);
        token.value = -token.points - (player.colorBonus + 1) * (token.color == player.lastColor) * ((token.dist == 0) + 1) * 1.618 - (enemy.colorBonus + 1) * (token.color == enemy.lastColor);
        tokens.push(token);
        colors[token.color] += 1;
        points += token.points;
        average[0] += x * token.points;
        average[1] += y * token.points;
      }
    }

    // Determine actual average
    average[0] = average[0] / points | 0;
    average[1] = average[1] / points | 0;

    // Pick best token
    var best = 0;

    // Calculate point values of tokens
    for (i = 0; i < tokens.length; i++) {
      var token = tokens[i];
      // Add remaining numbers of tokens of color as factor
      token.value -= (colors[token.color] / tokens.length) * 1.618;
      // Subtract distance as a factor
      token.value += token.dist;
      // Add distance to average to value
      token.value += (Math.abs(average[0] - (token.x + player.pos[0])) + Math.abs(average[1] - (token.y + player.pos[1]))) / Math.sqrt(2);
      // Consider them higher value if we are closer, and lower if they are
      token.value += ((token.dist - token.distE) / (token.dist + token.distE + 0.001)) * token.dist;
      // Don't go for it if enemy is already there
      token.value += (token.distE == 0 && token.dist > 0) * 100;

      if (tokens[best].value > tokens[i].value || (tokens[best].value === tokens[i].value && Math.round(Math.random()))) {
        best = i;
      }
    }

    // Set token to best token
    var token = tokens[best];

    // What to respond with
    var response = 'PASS';

    // Find best action to get token
    if (token.dist == 0) {
      response = 'EAT'; // We're on the token
    } else if (token.distX >= token.distY) { // Token is more horizontal
      if (token.x < 0) { // Token is left
        response = 'LEFT';
      } else if (token.x > 0) { // Token is right
        response = 'RIGHT';
      }
    } else if (token.distX < token.distY) { // Token is more vertical
      if (token.y < 0) { // Token is above
        response = 'UP';
      } else if (token.y > 0) { // Token is below
        response = 'DOWN';
      }
    }

    // Return response
    return response;
  }
};

আপনি কি পাইথন প্রোগ্রামার?
ক্যালকুলেটরফলাইন

পছন্দ করুন
Mwr247

ভেবেছিলেন আপনি ছিলেন কারণ self:)
ক্যালকুলেটরফ্লাইন

কেন ব্যবহার করবেন self? thisযথেষ্ট নয় ?
কনর ও ব্রায়ান

2

পাঠ বট

অ্যাক্রোনিম মানে প্যাথফাইন্ডিং এবং ট্রি হিউরিস্টিক বট

সম্পাদনা করুন: এখন পর্যন্ত, এখানে এআইগুলির জন্য পয়েন্টগুলি সহ র‌্যাঙ্কিং রয়েছে

  1. হাংরিবোট (22৪২২)
  2. পাঠ বট (4591)
  3. নাইভাইএআই (3811)
  4. কিন্ডারান্ডোমএআই (618)
  5. মিররবট (193)
  6. অলসবোট (25)

সম্পূর্ণ নিয়ামকের লিঙ্ক গিথুব এ

বর্ণনা: নাইভাইএআই-র মতো, এই বটটি সর্বাধিক পয়েন্ট দেবে এমন নিকটতম টোকেনকে সন্ধান করে। তবে এটি তার প্রতিটি চলার ফলাফলগুলিও 6 বার পর্যন্ত সিমুলেট করে।

যুক্তি: কারণ নাইভএইএই ইতিমধ্যে বেশ ভাল, যদিও আমি এটি আরও ভাল করে তুলব। কোডটি না দেখে প্রথমে (বড় ভুল)।

বিটস: হাংরিবোট বাদে সবই
হেরে: হাংরিবোট ব্যতীত আর কিছুই নয়

সমস্যা:

  • বর্ধিত রেখার অনুকরণ করা যায় না
  • সেরা টোকেন গণনার সময় স্তব্ধ হয়ে যায়
  • টেলিপোর্ট করতে পারে

আমি কেন জানি না কেন এটি টেলিপোর্টিং ছিল তবে আমি এটি ঠিক করেছিলাম। পুরানো ভিডিও এখানে: https://youtu.be/BIhSKycF9iA

সম্পূর্ণ কোড:

pathBot = function (player1)
{
    this.pathNode = function(pos,ppt,parents,par)
    {
        this.pos = pos;this.ppt = ppt;this.parents = parents;this.par=par;
        this.childs=[];
    }
    this.addChildren = function (pn,children)
    {
        pn.childs=[];
        for(var i=0; i<children.length; i=i+1)
        {
            if(pn.parents.indexOf(children[i].pos)==-1&&pn.pos!=children[i].pos)
                pn.childs.push(
                    new this.pathNode(
                        children[i].pos,
                        children[i].ppt*pn.ppt,
                        pn.parents.concat([pn.pos]),
                        pn
                    )
                );
        }
    }
    this.orderTokensByPPT = function(b,pos){
        var tokens = [];
        for(var y=0; y<b.tokens.length; y=y+1)
        {
            for(var x=0; x<b.tokens[y].length; x=x+1)
            {
                var tok = b.tokens[y][x];
                if(tok)
                {
                    tokens.push(
                        new this.pathNode(
                            [y,x],
                            (tok.points+(tok.color==this.color ? this.streak : 0)) / this.lenOfMovesTo(pos,[y,x]),
                            [],
                            undefined
                        )
                    );
                }
            }
        }
        tokens.sort(function(a,b){
            return b.ppt - a.ppt;
        });
        return tokens;
    }
    this.lenOfMovesTo = function(cur,pos)
    {
        return Math.abs(cur[0]-pos[0])+Math.abs(cur[1]-pos[1])+1;
    }
    this.startAndGoalToCommand = function (start, goal) {
        var diff = [goal[0] - start[0], goal[1] - start[1]];
        if (diff[0] > 0) { return "RIGHT"; }
        else if (diff[1] > 0) { return "DOWN"; }
        else if (diff[1] < 0) { return "UP"; }
        else if (diff[0] < 0) { return "LEFT"; }
        else { return "EAT"; }
    }
    this.color = 0;
    this.streak = 0;
    this.eatTok = function(b)
    {
        if(b.tokens[this.me.pos[0]][this.me.pos[1]].color==this.color)
        {
            this.streak++;
        }
        else{
            this.streak = 0;
            this.color = b.tokens[this.me.pos[0]][this.me.pos[1]].color;
        }
        this.bestToken = false;
        return "EAT";
    }

    this.recurLen = 6;
    this.include = 4;
    this.recurDown = function(b,pn,level)
    {
        if(level==0) return pn;
        this.addChildren(pn,this.orderTokensByPPT(b,pn.pos));
        var newChilds = [];
        for(var i=0; i<pn.childs.length&&i<this.include; i=i+1)
        {
            newChilds.push(this.recurDown(b,pn.childs[i],level-1));
        }
        pn.childs = newChilds;
        return pn;
    }
    this.findMax = function(pn)
    {
        if(pn.childs)
        {
            var maxList = [];
            for(var i=0; i<pn.childs.length; i=i+1)
                maxList.push(this.findMax(pn.childs[i]));
            maxList.sort(
                function(a,b)
                {
                    return b.ppt-a.ppt;
                }
            );
            return maxList[0];
        }
        return pn;
    }
    this.findMaxList = function(pnList)
    {
        for(var i=0; i<pnList.lenght; i=i+1)
        {
            pnList[i] = this.findMax(pnList[i]);
        }
        pnList.sort(function(a,b){return b.ppt-a.ppt;});
        return pnList[0];
    }
    this.bestToken=false;
    this.yourMove = function(b){
        this.op = player1 ? b.player2 : b.player1;
        this.me = player1 ? b.player1 : b.player2;
        if(this.bestToken)
        {
            if(b.tokens[this.bestToken.pos[0]][this.bestToken.pos[1]]==undefined)
                this.bestToken = false;
        }
        if(!this.bestToken)
        {
            var paths = this.orderTokensByPPT(b,this.me.pos);
            for(var i=0; i<paths.length; i++)
            {
                paths[i] = this.recurDown(b,paths[i],this.recurLen);
            }
            var max = this.findMaxList(paths);
            while(max.par)
            {
                max = max.par;
            }
            this.bestToken = max;
        }
        var move = this.startAndGoalToCommand(this.me.pos,this.bestToken.pos);
        if(move=="EAT") return this.eatTok(b);
        else return move;
    }
}

এসএএলএনটিবোট টার্নের গতি কমিয়ে দিচ্ছে, এবং আমার সিপিইউর 15% খেয়ে ফেলছে ... ডি: সম্পাদনা: এবং কিছু খাচ্ছে না?
Mwr247

@ Mwr247 @ গতি, হ্যাঁ, এটি প্রতিটি টিকের 2500 ডলার সম্ভাবনার মডেল করে। তবে খাওয়ার জিনিসটির জন্য, আমি ঠিক জানি না কেন। আমি যেমন প্রশ্নে বলেছিলাম, এটি কেবল টেলিপোর্ট (একপাশে একাধিক স্পেস মুভ করে), এবং সেখানে কিছুই করেনি। আমি ফিরে আসার ঠিক আগে একটি সতর্কতা রেখেছিলাম এবং মনে হয় প্রতিবারই সঠিক নির্দেশনা দেওয়া হচ্ছে।
নীল

হতে পারে এটি: "আপনার এআই পদক্ষেপ নিতে এক সেকেন্ডেরও কম সময় নেয়, অন্যথায় পাস আপনার পছন্দ হিসাবে ধরে নেওয়া হবে"। আমি কন্ট্রোলারটি পড়িনি, তবে এটি যদি এক সেকেন্ড সময় নেয় তবে এটি কী পাস অনুমান করছে?
Mwr247

@ এমডব্লিউ ২7 I'll আমি এটি সন্ধান করব তবে এটি আমার মেশিনে <1 সেকেন্ড (বা আমি যদিও) নিচ্ছিলাম বলে মনে হচ্ছে না। তবুও, কখনও দেখতে ব্যথা করে না। ধন্যবাদ!
নীল

@ এমডব্লিউ 247 আরও কিছু পরীক্ষার পরে, এটি নয়। এটি নেভায়েইয়ের মতো প্রায় দ্রুত (কমপক্ষে আমার জন্য) সিদ্ধান্ত নিচ্ছে। এছাড়াও, আপনি বড় মানচিত্রের টেলিপোর্টেশন অনুভব করার সম্ভাবনা বেশি রয়েছে
নীল

1

NaiveAI

শুরু করে r=0, rআপনার অবস্থান থেকে দূরে ট্যাক্সিক্যাব দূরত্বে সমস্ত টোকেন দেখুন । যদি কোনও থাকে তবে একটি বেছে নিন যা এখনই যদি এটি পেয়ে থাকে তবে আপনাকে সর্বোচ্চ স্কোর দেয়। অন্যথায়, r1 দ্বারা বৃদ্ধি করুন এবং আবার চেষ্টা করুন।

naiveAI = function(player1) {
  this.player1 = player1;
  this.yourMove = function(b) {
    var me;
    if (this.player1) {
      me = b.player1;
    } else {
      me = b.player2;
    }
    var d = 0;
    var tokenP;
    while (tokenP == undefined) {
      var arr = this.findTokensAtDistance(me.pos, d)
      tokenP = this.findBestToken(arr, b.tokens, me);
      d += 1;
    }
    return this.startAndGoalToCommand(me.pos, tokenP);
  }
  this.findTokensAtDistance = function(p, d) {
    if (d == 0) {
      return [
        [p[0], p[1]]
      ];
    }
    var myArr = [];
    for (i = 0; i <= d; i++) {
      myArr[i] = [i, d - i];
    }
    var mySecArr = [];
    for (i = 0; i <= d; i++) {
      mySecArr[i] = [myArr[i][0] + p[0], myArr[i][1] + p[1]];
    }
    mySecArr[mySecArr.length] = [myArr[0][0] + p[0], -myArr[0][1] + p[1]];
    for (i = 1; i < myArr.length - 1; i++) {
      mySecArr[mySecArr.length] = [-myArr[i][0] + p[0], myArr[i][1] + p[1]]
      mySecArr[mySecArr.length] = [myArr[i][0] + p[0], -myArr[i][1] + p[1]]
      mySecArr[mySecArr.length] = [-myArr[i][0] + p[0], -myArr[i][1] + p[1]]
    }
    mySecArr[mySecArr.length] = [-myArr[myArr.length - 1][0] + p[0], myArr[myArr.length - 1][1] + p[1]];
    return mySecArr;
  }
  this.findBestToken = function(arr, t, player) {
    var tokenPos;
    for (i = 0; i < arr.length; i++) {
      if (arr[i][0] >= 0 && arr[i][0] < t.length && arr[i][1] >= 0 && arr[i][1] < t.length) {
        if (t[arr[i][0]][arr[i][1]] != false && ((tokenPos == undefined) || (this.tokenScore(player, t[arr[i][0]][arr[i][1]]) > this.tokenScore(player, t[tokenPos[0]][tokenPos[1]])))) {
          tokenPos = [arr[i][0],
            [arr[i][1]]
          ];
        }
      }
    }
    return tokenPos;
  }
  this.tokenScore = function(player, token) {
    if (player.lastColor == token.color) {
      return player.colorBonus + 1 + token.points;
    } else {
      return token.points;
    }
  }
  this.startAndGoalToCommand = function(start, goal) {
    var diff = [goal[0] - start[0], goal[1] - start[1]];
    if (diff[0] > 0) {
      return "RIGHT";
    } else if (diff[1] > 0) {
      return "DOWN";
    } else if (diff[1] < 0) {
      return "UP";
    } else if (diff[0] < 0) {
      return "LEFT";
    } else {
      return "EAT";
    }
  }
}

1

KindaRandomAI

প্রতিটি পালা, নিম্নলিখিতটি করুন: আপনার অবস্থানে যদি একটি টোকেন থাকে তবে "EAT"। অন্যথায়, এলোমেলোভাবে কার্যকর দিকনির্দেশে সরান, অর্থাত্ আপনি যদি বাম প্রান্তে থাকেন তবে "LEFT" বলবেন না।

kindaRandomAI = function(player1) {
    this.player1 = player1;
    this.yourMove = function(b) {
        var me;
        if (this.player1) {
            me = b.player1;
        } else {
            me = b.player2;
        }
        if (b.tokens[me.pos[0]][me.pos[1]] != false) {
            return "EAT";
        } else {
            var dirs = this.getViableDirections(b, me.pos);
            var rand = Math.floor(Math.random() * dirs.length);
            return dirs[rand];
        }
    }
    this.getViableDirections = function(b, p) {
        var dirs = [];
        if (p[0] > 0) {
            dirs.push("LEFT");
        }
        if (p[1] > 0) {
            dirs.push("UP");
        }
        if (p[1] < b.tokens.length - 1) {
            dirs.push("DOWN");
        }
        if (p[0] < b.tokens.length - 1) {
            dirs.push("RIGHT");
        }
        return dirs;
    }
}

-1 সম্পূর্ণ এলোমেলো নয়
ক্যালকুলেটরফলাইন


1

LazyBot

কেবল সে কিছু খায় যদি সে এর উপর বিকাশ করে। এটির জয়ের কোনও সুযোগ নেই, তবে চ্যালেঞ্জের এর মধ্যে একটিও ছিল না, তবে কেন নয়।

lazyBot = function (player1) {
    this.yourMove = function(b) {
        return "EAT";
    }
}

1
প্রতিটি কথের একটি ইমোওল্ফ থাকে ...
নীল

3
@ ব্লু এটি 100% ইমো নয়, এটি খাওয়ার চেষ্টা করে।
বিলিন্ট


1

MirrorBot

"কামানের চারণ" বলা উচিত

বর্ণনা: অন্যান্য খেলোয়াড় যা করেছে তার ঠিক বিপরীত দিকে সরায়

যুক্তি: আমি আবার জেএসে আরামদায়ক প্রোগ্রামিং পেতে চাই। এটি জেতা উচিত নয়

মারবে: কেউ নেই

হারাবে: প্রত্যেকে

function mirror(player1) {
    this.hasStarted=false;
    this.player1 = player1;
    this.opl=[0,0];
    this.yourMove = function(b){
        this.op = this.player1 ? b.player2.pos : b.player1.pos;
        out = "EAT";
        console.log(this.op);
        console.log(this.opl);
        if(this.hasStarted){
            if(this.opl[0] < this.op[0]) out = "RIGHT";
            if(this.opl[0] > this.op[0]) out = "LEFT";
            if(this.opl[1] < this.op[1]) out = "UP";
            if(this.opl[1] > this.op[1]) out = "DOWN";
        }
        this.opl = [this.op[0],this.op[1]];
        this.hasStarted = true;
        return out;
    }
}

আপনার কোডটিতে কয়েকটি সমস্যা রয়েছে। ডান এবং বাম বিপরীত নয়, এবং আপনারআমাদের জন্য আপনার ফাংশন সংজ্ঞাটি বৈধ সিনট্যাক্স নয়। আমার কোডটিও এর আগে ভেঙে গেছে, সুতরাং আমার কোডটিতে সমস্যাটি সন্ধান এবং ফিক্সিংয়ের প্রক্রিয়ায় আমি আপনার কোডটিও ঠিক করেছিলাম। আপনি আমার স্ক্রিপ্টে স্থির কোডটি দেখতে পারেন।
কাল্পনিক মেলুন

@ ফ্রিক্যটিভেলন আমি ভাঙা ফাংশন সংজ্ঞাটি ঠিক করেছি। আমাকে দাবিটি পাল্টাতে হবে যে অধিকারটি বিপরীত নয়।
নীল

0,0 হ'ল উপরের-বাম কোণে, তাই ধনাত্মক x ডান এবং নেতিবাচক x বামে। যদি নতুন এক্স-পজ পুরানো এক্স-পজ-এর চেয়ে বেশি হয় তবে অন্য প্লেয়ারটি ডানদিকে সরানো হয়েছে, সুতরাং আপনার বাম দিকে চলে যেতে হবে এবং তদ্বিপরীত। এছাড়াও, var out = "EAT";পরিবর্তে আপনার ব্যবহার করা উচিত out = "EAT";, যেহেতু পরবর্তীকালে একটি বৈশ্বিক চলক সংজ্ঞায়িত করা হয়। কিছুটা নিতপিকিং করা, তৃতীয় এবং চতুর্থ লাইনগুলি কিছু করে না এবং পাশাপাশি মুছে ফেলা যায়, এবং কোনও সম্পত্তির পরিবর্তে opস্থানীয় পরিবর্তনশীল হতে পারে out
কাল্পনিক তরমুজ

@ ফ্রিক্যটিভমেলন আহ, আপনি যা বলছেন তা পেয়েছি। আমি কোড আপডেট করেছি। ধন্যবাদ!
নীল

আমি আপনার নতুন কোডটি স্ক্রিপ্টে রেখেছি এবং এটি এখন কাজ করছে। যদিও র্যান্ডমএআইএকে পরাজিত করে না :(
কাল্পনিক মেলন

0

OneTarget

টোকেনটি সন্ধান করে যা সর্বনিম্ন সময়ে সর্বাধিক পয়েন্ট দেবে এবং এটির জন্য যাবে। ক্রমযুক্ত প্রভাবের কারণে একই রঙের টোকেনগুলি খানিকটা বেশি।

function (player1) {
    this.yourMove = function (b) {
        var me = player1? b.player1: b.player2;
        var him= player1? b.player2: b.player1;
        var x = me.pos[0];
        var y = me.pos[1];
        var maxVal = -1;
        var maxX = 0;
        var maxY = 0;
        for(var i = 0;i < b.tokens.length;i++){
            for(var j = 0;j < b.tokens.length;j++){
                if(b.tokens[i][j]){
                    var dist = Math.abs(x-i) + Math.abs(y-j);
                    var val = this.valueOf(b.tokens[i][j]);
                    val /= (dist + 1);
                    if(val > maxVal){
                        maxVal = val;
                        maxX = i;
                        maxY = j;
                    }
                }
            }
        }
        if(maxY < y)
            return "UP";
        if(maxX < x)
            return "LEFT";
        if(maxY > y)
            return "DOWN";
        if(maxX > x)
            return "RIGHT";
        return "EAT";
    }
    this.valueOf = function(t){
        //how many points would it give you?
        return t.points + (this.lastColor == t.color? 2 * this.colorBonus + 1 : 0);
    }
}

0

QuantityPlayer

সমস্ত কোয়ান্টিটিপ্লেয়ার যে বিষয়গুলি যত্ন করে সে হ'ল বিন্দুগুলির বিন্দুর পরিমাণ, বিন্দুর মান বা রঙ নয়। তিনি জানেন যে সমস্ত বিন্দু আলাদা হলেও তাদের একইরকম আচরণ করা উচিত।

QuantityBot = function(playernum) {

this.dist = function(token) {
    return (Math.abs(token[0])+Math.abs(token[1]))
}

this.yourMove = function(game_board) {

    board_size = game_board.tokens.length
    board_area = board_size * board_size
    fete = board_size = size * 2

    token_list = []
    count = curr_x = curr_y = 0
    while(count < board_area) {
        if(game_board.tokens[x][y]) {
        token_list.push([x-player.pos[0],y-player.pos[1]])
        }
        count++; x = count % board_size; y = Math.floor(count / size)
    }

    closest_token = token_list[0]
    count = 1
    while(count < token_list.length) {
        curr_token = token_list[count]
        if(dist(curr_token) < dist(closest_token)){closest_token = curr_token}

        count++
    }

    if(dist(closest_token)==0){return 'EAT'}
    else{
    if(closest_token[0] >= closest_token[1]) {if(closest_token[0]<0) {return 'LEFT'} {return 'RIGHT'}}
    else{if(closest_token[1]<0) {return 'UP'} {return 'DOWN'}}
    }

}

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