পতাকার ছবি তোল


12

এটি পতাকাটি ক্যাপচার করার একটি খেলা, প্রচন্ডভাবে অনুপ্রাণিত এবং রেড বনাম ব্লু - পিক্সেল টিম ব্যাটলবটসের ভিত্তিতে । এটি একটি দুর্দান্ত প্রশ্ন ছিল (আপনাকে অনেক ধন্যবাদ ক্যালভিনের শখগুলি; আমি আশা করি আপনি যে নির্লজ্জভাবে আপনার কাছ থেকে প্রচুর কোড চুরি করেছেন তাতে আপনি আপত্তি করবেন না) - এখানে পাহাড়ের কিংড-ভিত্তিক আরেকটি দল রয়েছে। আশা করি, পতাকাটি ক্যাপচারের জন্য আরও টিমের সহযোগিতার পাশাপাশি আরও কৌশল প্রয়োজন।

এটি মিশ্রিত করতে, আপনার আইডির শেষ সংখ্যাটি যদি অন্তর্ভুক্ত করে 0এবং 4অন্তর্ভুক্ত করে তবে আপনাকে লাল দলে বিবেচনা করা হবে। যদি একই লোকেরা উত্তর দেওয়ার সিদ্ধান্ত নেয় তবে এটিকে আবার একই লড়াই করতে বাধা দেওয়া উচিত। বোর্ড 350pxদ্বারা 350px। নীল দলটি বোর্ডের উপরের অর্ধেক থেকে শুরু হয় এবং লাল দলটি নিম্নার্ধে শুরু হয়।

আপনি পতাকাটি ক্যাপচার করার উপায়টি নিম্নরূপ: গেমের উদ্দেশ্য হ'ল প্রতিপক্ষ দলের পতাকা নেওয়া এবং এটি আপনার নিজের দিকে ফিরিয়ে আনা। আপনি যদি তাদের পক্ষে থাকেন তবে আপনাকে ট্যাগ করে কারাগারে পাঠানো যেতে পারে। আপনি যদি কারাগারে থাকেন তবে আপনি স্থানান্তর করতে পারবেন না। আপনি যদি আপনার পক্ষে থাকেন তবে আপনার কাজ হ'ল বিরোধী দলের সদস্যদের তাদের কারাগারে প্রেরণের জন্য ট্যাগ করা। জেল থেকে বেরিয়ে আসার একমাত্র উপায় হ'ল আপনার দলের যে কেউ কারাগারে প্রত্যেককে ট্যাগ করতে মুক্ত free (দ্রষ্টব্য যে জেলটি বিরোধী দলের পক্ষে অবস্থিত)।

বিশেষ করে:

  • একটি ধ্রুবক রয়েছে - FIELD_PADDING20 এ সেট করুন This এটি ক্ষেত্রের জন্য প্যাডিং। যদি এটি শূন্য হয়, তবে পতাকা এবং জেলটি ঠিক ক্যানভাসের কোণে থাকবে। যেহেতু এটি না, পতাকা এবং জেল কোণ থেকে 20 পিক্সেল দূরে।
  • নীল পতাকা (মনে রাখবেন: নীল দলটি উপরের অর্ধেকের উপরে রয়েছে) (WIDTH - FIELD_PADDING, FIELD_PADDING) = (330, 20)অর্থাৎ উপরের অংশে ডানদিকে অবস্থিত।
  • লাল পতাকা আছে (FIELD_PADDING, HEIGHT - FIELD_PADDING) = (20, 330)
  • নীল কারাগার (যেখানে লাল সদস্য রাখা হয়) (20, 20)অর্থাত্ নীলের দিকে, উপরের বামে।
  • লাল কারাগার, যেখানে নীল সদস্যদের রাখা হয়েছে, রয়েছে (330, 330)

প্রতিটি দলের সদস্য এলোমেলোভাবে একটি পজিশনে 45 < x < 305এবং 45 < y < 175নীল এবং 175 < y < 305লাল জন্য শুরু করে। কোনও দলের সদস্য DEFENSE_RADIUS = 25তাদের নিজস্ব পতাকা বা তাদের নিজস্ব কারাগারের পিক্সেলগুলির মধ্যে যেতে পারবেন না (যদি না অবশ্যই আপনার নিজের পতাকা কোনও বিরোধী বট হাতে নেয়, তবে আপনাকে সেই বটটি ট্যাগ করতে হবে)। এটি বটের মতো কুকুরছানা-রক্ষা রোধ করতে। আপনি যদি এই সীমার মধ্যে যান তবে আপনাকে পিছনে "ধাক্কা" দেওয়া হবে। একইভাবে, কোনও দলের সদস্য সীমানার বাইরে যেতে পারবেন না (শূন্যের চেয়ে কম বা 350 টিরও বেশি) - আপনি যদি এটি করেন তবে আপনাকে আপনার কাছের সবচেয়ে কাছের আইনি জায়গায় ফিরিয়ে দেওয়া হবে।

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

স্পেস :

চিত্রটি পিক্সেল টিম ব্যাটলবটসের প্রশ্নের সাথে বেশ মিল। জাভাস্ক্রিপ্টে আপনার একটি কোড ব্লক (মনে রাখবেন, কোনও বৈশ্বিক ভেরিয়েবল) লিখতে হবে। এটি একটি সঙ্গে একটি বস্তু ফেরত পাঠাবেন x-value এবং y-value আপনার Y মানের মধ্যে x এর মধ্যে পরিবর্তন এবং পরিবর্তন উপস্থাপন করছেন। নিম্নলিখিত উত্তর:

return {
  x: 0,
  y: -2
};

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

  • this - নিজে, একজন খেলোয়াড় হিসাবে (খেলোয়াড় কী তা নীচে দেখুন)
  • move - গোল সংখ্যা, 0 থেকে শুরু করে
  • tJailed - আপনার দলের কারাগারে থাকা সমস্ত খেলোয়াড়ের একটি অ্যারে
  • eJailed - জেল হয় এমন বিরোধী দলের সমস্ত খেলোয়াড়ের একটি অ্যারে
  • team - আপনার দলের সমস্ত খেলোয়াড়ের একটি অ্যারে, কেবল আপনার কাছের মানুষগুলি নয়
  • enemies - অন্য দলের সমস্ত খেলোয়াড়ের একটি অ্যারে, কেবল আপনার নিকটবর্তী ব্যক্তিদের নয়
  • tFlag - আপনার পতাকা (আপনি এটি রক্ষার চেষ্টা করছেন)
  • eFlag - অন্যান্য পতাকা (আপনি এটি চুরি করার চেষ্টা করছেন)
  • messages - নীচে ব্যাখ্যা
  • ধ্রুবক একটি তালিকা: WIDTH = 350, HEIGHT = 350, FIELD_PADDING = 20, DEFENSE_RADIUS = 25

প্রতিটি "প্লেয়ার" নিম্নলিখিত বৈশিষ্ট্যযুক্ত একটি বস্তু:

  • x এবং y
  • strength
  • id
  • isJailed - খেলোয়াড় কারাগারে থাকলে সত্য

প্রতিটি পতাকাটিতে নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  • x এবং y
  • pickedUpBy - বর্তমানে যে প্লেয়ারের পতাকা রয়েছে, বা যদি কোনও খেলোয়াড়ের পতাকা না থাকে তবে তা বাতিল করে দিন।

এখন, messagesএমন একটি জিনিস যা আপনার সতীর্থদের মধ্যে ভাগ করা হয়। আপনি এটি দিয়ে কী করেন তা আমি যত্নশীল নই। একই জিনিসটি ভাগ করে নেওয়া এবং আপনার দলের সদস্যদের প্রত্যেককে দেওয়া হয়েছে। আপনি যোগাযোগ করতে পারেন এই একমাত্র উপায়। আপনি এটিতে বৈশিষ্ট্যগুলি সংযুক্ত করতে পারেন, বস্তুগুলি ভাগ করতে পারেন ইত্যাদি want এটি আপনার পছন্দ মতো বড় হতে পারে - কোনও আকারের সীমা নেই।

প্রতিটি ঘুরিয়ে নিম্নলিখিতটি ঘটে:

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

সংকেতগুলি:

  • কমপক্ষে নিয়মিত পতাকাটি ক্যাপচার করার সময়, অনেক খেলোয়াড় একসাথে গেলে আক্রমণগুলি আরও ভাল কাজ করে, কারণ এটি ডিফেন্ডারদের বিভ্রান্ত করে যে তাদের কোন খেলোয়াড়কে তাড়া করা উচিত।
  • একইভাবে, ডিফেন্ডাররা আক্রমণগুলি যাতে না ঘটে সেজন্য তারা কারা তাড়া করছে তা সমন্বয় করতে চাইতে পারে

স্ট্যাক স্নিপেট:

window.onload=function(){(function(){function p(a,b,c,e){return Math.sqrt((a-c)*(a-c)+(b-e)*(b-e))}function l(a,b){this.x=this.y=0;this.id=a.id;this.title=a.title+" ["+this.id+"]";this.link=a.link||"javascript:;";this.team=b;this.isJailed=!1;this.flag=null;this.moveFn=new Function("move","tJailed","eJailed","team","enemies","tFlag","eFlag","messages","WIDTH","HEIGHT","FIELD_PADDING","DEFENSE_RADIUS",a.code);this.init()}function x(a,b){return Math.floor(Math.random()*(b-a))+a}function q(a,b){this.startX=this.x=a;this.startY=
this.y=b;this.following=null}function t(a,b){return a===e&&b||a===h&&!b?{x:20,y:20}:{x:g.width-20,y:g.height-20}}function y(){var a,b=$("#redTeam"),c=$("#blueTeam");for(a=0;a<e.length;++a)e[a].addToDiv(b);for(a=0;a<h.length;++a)h[a].addToDiv(c)}function z(){d.clearRect(0,0,g.width,g.height);d.beginPath();d.moveTo(0,g.height/2);d.lineTo(g.width,g.height/2);d.stroke();var a=e.concat(h),b,c;for(b=a.length-1;0<b;b--){c=Math.floor(Math.random()*(b+1));var f=a[b];a[b]=a[c];a[c]=f}for(b=0;b<a.length;++b)a[b].step(u);
for(b=0;b<e.length;++b)for(c=0;c<h.length;++c)10>p(e[b].x,e[b].y,h[c].x,h[c].y)&&(e[b].y<g.height/2&&e[b].goToJail(),h[c].y>g.height/2&&h[c].goToJail());for(b=0;b<a.length;++b)c=a[b].team===e!==!0?m:n,!c.following&&10>p(a[b].x,a[b].y,c.x,c.y)&&(c.following=a[b]);for(b=0;b<a.length;++b)if(c=t(a[b].team,!0),!a[b].isJailed&&10>p(a[b].x,a[b].y,c.x,c.y))for(c=a[b].team,f=0;f<c.length;++f)c[f].isJailed&&(c[f].isJailed=!1,c[f].init());m.follow();n.follow();b=m.y<g.height/2;c=n.y>g.height/2;b&&c&&alert("EXACT TIE!!!! This is very unlikely to happen.");
b&&!c&&(alert("Blue wins!"),$("#playpause").click().hide());c&&!b&&(alert("Red wins!"),$("#playpause").click().hide());for(b=0;b<a.length;++b)a[b].draw(d);m.draw("red");n.draw("blue");u++}$.ajaxSetup({cache:!1});var e=[],h=[],g=$("canvas")[0],d=g.getContext("2d"),v,u=0,m={},n={},r=!0,A={},B={},w;l.prototype.init=function(){this.x=x(45,g.width-45);this.y=x(45,g.height/2);this.team===e&&(this.y+=g.height/2);this.strength=20};l.prototype.makeShallowCopy=function(){return{x:this.x,y:this.y,strength:this.strength,
id:this.id,isJailed:this.isJailed}};l.prototype.goToJail=function(){this.isJailed=!0;var a=this.team===e!==!0?m:n;(this.team===e!==!0?m:n).following===this&&(a.following=null);a=t(this.team,!0);this.x=a.x;this.y=a.y;this.strength=0};l.prototype.step=function(a){function b(a,b,c){var e,d,f;for(e=0;e<a.length;++e)d=a[e],d!==C&&(f=d.makeShallowCopy(),d.isJailed?b.push(f):c.push(f))}var c=[],f=[],d=[],k=[],l=this.team===e?h:e,C=this,q=this.team===e?m:n,r=this.team===e?n:m;b(this.team,c,d);b(l,f,k);f=
this.moveFn.call(this.makeShallowCopy(),a,c,f,d,k,q.copy(),r.copy(),this.team===e?A:B,g.width,g.height,20,25);"object"===typeof f&&"number"===typeof f.x&&"number"===typeof f.y&&(d=p(0,0,f.x,f.y),a=t(this.team,!1),c=this.team===e!==!1?m:n,d<=this.strength&&(this.strength-=d,this.x+=f.x,this.y+=f.y,0>this.x&&(this.x=0),0>this.y&&(this.y=0),this.x>g.width&&(this.x=g.width),this.y>g.height&&(this.y=g.height),f=p(this.x,this.y,c.x,c.y),d=p(this.x,this.y,a.x,a.y),25>f&&null===c.following&&(this.x=25*(this.x-
c.x)/f*1.3+c.x,this.y=25*(this.y-c.y)/f*1.3+c.y),25>d&&(this.x=25*(this.x-a.x)/d*1.3+a.x,this.y=25*(this.y-a.y)/d*1.3+a.y)),this.isJailed||(this.strength+=2),20<this.strength&&(this.strength=20))};l.prototype.addToDiv=function(a){var b=$("<option>").text(this.title).val(this.id);a.find(".playersContainer").append(b)};l.prototype.draw=function(a){a.fillStyle=this.team===e?"red":"blue";a.beginPath();a.arc(this.x,this.y,5,0,2*Math.PI,!0);a.fill();!this.isJailed&&$("#labels").is(":checked")&&a.fillText(this.title,
this.x+5,this.y+10)};q.prototype.draw=function(a){d.strokeStyle=a;d.beginPath();d.arc(this.x,this.y,5,0,2*Math.PI,!0);d.stroke();d.fillStyle=a;d.strokeRect(this.x-2,this.y-2,4,2);d.beginPath();d.moveTo(this.x-2,this.y);d.lineTo(this.x-2,this.y+3);d.stroke()};q.prototype.copy=function(){return{x:this.x,y:this.y,pickedUpBy:this.following&&this.following.makeShallowCopy()}};q.prototype.follow=function(){null!==this.following&&(this.x=this.following.x,this.y=this.following.y)};$("#newgame").click(function(){function a(a,
b){w?b(w):$.get("https://api.stackexchange.com/2.2/questions/"+(49028).toString()+"/answers",{page:a.toString(),pagesize:100,order:"asc",sort:"creation",site:"codegolf",filter:"!JDuPcYJfXobC6I9Y-*EgYWAe3jP_HxmEee"},b,"json")}function b(g){w=g;g.items.forEach(function(a){function b(a){return $("<textarea>").html(a).text()}var d=4>=a.owner.user_id%10?e:h;a.owner.display_name=b(a.owner.display_name);if(!(a.hasOwnProperty("last_edit_date")&&28800<a.last_edit_date-a.creation_date&&33208!==a.owner.user_id||
-1<p.indexOf(a.owner.user_id))){p.push(a.owner.user_id);var g=c.exec(a.body);if(!(null===g||1>=g.length)){var f={};f.id=a.owner.user_id;f.title=a.owner.display_name;f.code=b(g[1]);f.link=a.link;d.push(new l(f,d))}}});g.has_more?a(++d,b):(console.log("Red team",e),console.log("Blue team",h),y(),clearInterval(v),r=!0,$("#playpause").show().click())}var c=/<pre><code>((?:\n|.)*?)\n<\/code><\/pre>/,d=1,p=[];e=[];h=[];u=0;m=new q(20,g.height-20);n=new q(g.width-20,20);$(".teamColumn select").empty();var k=
$("#testbotCode").val();0<k.length&&(console.log("Using test entry"),k={title:"TEST ENTRY",link:"javascript:;",code:k},$("#testbotIsRed").is(":checked")&&(k.id=-1,e.push(new l(k,e)),k.id=-3,e.push(new l(k,e))),$("#testbotIsBlue").is(":checked")&&(k.id=-2,h.push(new l(k,h)),k.id=-4,h.push(new l(k,h))));a(1,b)});$("#playpause").hide().click(function(){r?(v=setInterval(z,25),$(this).text("Pause")):(clearInterval(v),$(this).text("Play"));r=!r})})();}
#main{padding:10px;text-align:center}#testbot{padding:10px;clear:both}.teamColumn{width:25%;padding:0 10px;border:3px solid;border-color:#000;text-align:center;height:500px;overflow:scroll;white-space:nowrap}.playersContainer p{padding:0;margin:0}#redTeam{float:left;border-color:red;color:red;background-color:#fee}#blueTeam{float:right;border-color:#00f;color:#00f;background-color:#fee}#arena{display:inline-block;width:40%;text-align:center}canvas{border:1px solid #000}select{width:100%}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><div id=main><div class=teamColumn id=redTeam><h1>Red Team</h1><select size=20 class=playersContainer></select></div><div id=arena><h1>Battlefield</h1><canvas width=350 height=350></canvas></div><div class=teamColumn id=blueTeam><h1>Blue Team</h1><select size=20 class=playersContainer></select></div><div id=loadingInfo><button id=newgame>New Game</button> <button id=playpause>Play</button><br><input type=checkbox id="labels"> Show labels</div></div><div id=testbot><textarea id=testbotCode placeholder="testbot code"></textarea><br><input type=checkbox id="testbotIsRed">Red Team<br><input type=checkbox id="testbotIsBlue">Blue Team<br></div>

নিয়ন্ত্রক: http://jsfiddle.net/prankol57/4L7fdmkk/

পূর্ণ স্ক্রীন নিয়ামক: http://jsfiddle.net/prankol57/4L7fdmkk/ এম্বেডড / রিসাল্ট/

কন্ট্রোলারে কোনও বাগ আছে কিনা তা আমাকে জানান।

দ্রষ্টব্য: আপনি যদি নিয়ামকের কাছে যান এবং মনে করেন যে এটি কোনও কিছুই লোড করছে না, "নতুন গেম" টিপুন। এটি "নতুন গেম" টিপানোর পরে কেবলমাত্র সমস্ত কিছু বোঝায় যাতে এটি একবারে সমস্ত বট এবং সম্ভাব্য পরীক্ষার বটগুলি লোড করতে পারে।

শুভকামনা।


যদি কেউ উদাহরণস্বরূপ খেলাটি দেখতে চান, আমি একটি উদাহরণ বট তৈরি করেছিলাম যা আপনি "টেস্টবোট" টেক্সারিয়াতে কপি এবং পেস্ট করতে পারেন (টেস্টবোটটি প্রতিটি দলে দুটি নকল তৈরি করে; লাল দল এবং নীল দল দুটি পরীক্ষা করুন):

var r2 = Math.sqrt(2);
if (this.id === -1) {
  // red team 1
  // go after flag regardless of what is going on
  if (eFlag.pickedUpBy !== null && eFlag.pickedUpBy.id === this.id) {
    return {
      x: 0,
      y: 2
    };
  }
  return {
    x: this.x < eFlag.x ? r2 : -r2,
    y: this.y < eFlag.y ? r2 : -r2
  };
}
if (this.id === -2) {
  // blue team 1
  // a) go after opposing team members on your side b) get the other flag if no enemies on your side
  var closestEnemy = null;
  for (var i = 0; i < enemies.length; ++i) {
    if (enemies[i].y < HEIGHT/2 && (closestEnemy === null || enemies[i].y < closestEnemy.y)) {
      closestEnemy = enemies[i];
    }
  }
  if (closestEnemy !== null) {
    return {
      x: this.x < closestEnemy.x ? r2 : -r2,
      y: this.y < closestEnemy.y ? r2 : -r2
    };
  }
  if (eFlag.pickedUpBy !== null && eFlag.pickedUpBy.id === this.id) {
    return {
      x: 0,
      y: -2
    };
  }
  return {
    x: this.x < eFlag.x ? r2 : -r2,
    y: this.y < eFlag.y ? r2 : -r2
  };
}
if (this.id === -3) {
  // red team 2
  // a) defend the flag b) if at least half of enemies in jail and no enemies on this side, free jailed reds and quickly return
  var closestEnemy = null;
  for (var i = 0; i < enemies.length; ++i) {
    if (enemies[i].y > HEIGHT/2 && (closestEnemy === null || enemies[i].y > closestEnemy.y)) {
      closestEnemy = enemies[i];
    }
  }
  if (closestEnemy !== null) {
    return {
      x: this.x < closestEnemy.x ? r2 : -r2,
      y: this.y < closestEnemy.y ? r2 : -r2
    };
  }
  if (enemies.length / eJailed.length <= 1 && tJailed.length > 0) {
    return {
      x: this.x < FIELD_PADDING ? r2 : -r2,
      y: this.y < FIELD_PADDING ? r2 : -r2
    };
  }
  if (this.y < 350/2) return {x: 0, y: 2};
  return {
    x: this.x < tFlag.x ? r2 : -r2, 
    y: this.y < tFlag.y ? r2 : -r2
  };
}
if (this.id === -4) {
  // blue team 2
  // a) try freeing jail if there are jailed team members b) capture the flag
  if (tJailed.length > 0) {
    return {
      x: this.x < WIDTH - FIELD_PADDING ? r2 : -r2,
      y: this.y < HEIGHT - FIELD_PADDING ? r2 : -r2
    };
  }
  if (eFlag.pickedUpBy !== null && eFlag.pickedUpBy.id === this.id) {
    return {
      x: 0,
      y: -2
    };
  }
  return {
    x: this.x < eFlag.x ? r2 : -r2,
    y: this.y < eFlag.y ? r2 : -r2
  };
}

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

1
আপনি যদি পূর্ণস্ক্রিনের জন্য jsfiddle.net/prankol57/4L7fdmkk/ebded/result এ কন্ট্রোলার লিঙ্কটি পরিবর্তন করেন তবে তা অবধারিত হবে ।
LegionMammal978

2
নিয়ামক কি সবচেয়ে গুরুত্বপূর্ণ অঙ্গগুলির মধ্যে একটি নয় ...?
অ্যালেক্স এ।

1
@ অ্যালেক্সা হ্যাঁ, তবে কীভাবে এটি স্যান্ডবক্সে পোস্ট করা নিয়ন্ত্রণকারীর মধ্যে বাগগুলি ঠিক করতে সহায়তা করবে (উত্তরগুলি লোড করছে না, উত্তরগুলি চালাচ্ছে)? লোকেরা প্রকৃত উত্তরগুলি পোস্ট করতে শুরু করবে যে কাজটি, যা আমার মতে, মেটা কীসের জন্য নয়, যার অর্থ সম্ভবত আমার কেবল এটি এখানে পোস্ট করা উচিত। নিয়মিত KOTH নিয়ামকগুলিতেও বাগগুলি অনিবার্যভাবে সামনে আসবে।
soktinpk

1
আমার বট কন্ট্রোলারে প্রদর্শিত হচ্ছে না।
LegionMammal978

উত্তর:


4

লাল - অলস জেল হোগ | অলস ফ্ল্যাগার

এই দু'টির কাছাকাছি দিকে চলে: নীল রঙের জেল, বা নীল পতাকা।

  • কারাগারের জন্য গেলে কারাগারে moveুকবে এবং থামবে। (যেহেতু নীল তার নিজস্ব কারাগার স্পর্শ করতে পারে না, এটি অদম্য এবং স্বয়ংক্রিয়ভাবে সমস্ত মিত্রদের মুক্ত করবে)
  • পতাকাটির জন্য গেলে, এটি অন্ধভাবে পতাকাটির জন্য সরবে এবং ফিরে আসবে।

অবশেষে, এর মস্তিষ্ক সম্পূর্ণরূপে সঞ্চিত হয় messages[29354]এবং কেবল প্রথম পদক্ষেপে শুরু হয়। সুতরাং, মিত্ররা যদি এই বটের জন্য আরও ভাল ব্যবহার খুঁজে পায় তবে তারা তাদের উচ্চতর উদ্দেশ্যে এর মস্তিষ্ককে প্রতিস্থাপন করতে পারে।

if (move === 0) {
    //On the first turn, set messages[this.id] to the function I will call to move me
    messages[this.id] = function(move, tJailed, eJailed, team, enemies, tFlag, eFlag, messages) {
        //Arbitrary function to move to a point at some speed, which may be in the point
        //  If we are at the point, undefined is returned
        var moveTo = function(p, max) {
            if (!p) {
                return {x:0, y:0};
            }
            max = Math.min(this.strength, max || p.max || 2);
            var dx = p.x - this.x;
            var dy = p.y - this.y;
            var dist = Math.abs(dx)+Math.abs(dy);
            if (dist === 0) {
                return undefined; 
            } else if (dist < max) {
                return {x: dx, y: dy};
            }
            var ux = Math.floor(max * dx / dist);
            var uy = Math.floor(max * dy / dist);
            while (Math.abs(ux) + Math.abs(uy) < max) {
                if (ux + this.x !== p.x) {
                    ux += ux > 0 ? 1 : -1;
                } else if (uy + this.y !== p.y) {
                    uy += uy > 0 ? 1 : -1;
                } else {
                    break;
                }
            }
            return {x: ux, y:uy};
        }.bind(this);

        //Set the way points
        var points = [];
        if (this.x > WIDTH/2) {
            points.push({x: WIDTH-FIELD_PADDING, y:HEIGHT/2+5});
            points.push({x: WIDTH-FIELD_PADDING, y:FIELD_PADDING, max: 5});
            points.push({x: WIDTH-FIELD_PADDING, y:HEIGHT/2+25, max: 5});
        } else {
            points.push({x: FIELD_PADDING, y:HEIGHT/2+5});
            points.push({x: FIELD_PADDING, y:FIELD_PADDING, max: 5});
            points.push(undefined); //Special case to do nothing / hog the jail
        }

        //Move through the points
        var state = messages[this.id].state || 0;
        var ret;
        while (!ret) {
            //Special case: if we were doing nothing, make sure we're where we think we were
            if (!points[state]) {
                ret = moveTo(points[state-1]);
                if (ret) {
                    state = 0;
                }
            }

            //Move to the next point
            ret = moveTo(points[state]);
            if (!ret) {
                state = (state + 1) % points.length;
            }
        }
        messages[this.id].state = state;
        return ret;
    };
}
//Move me based on that function, which may be changed by my allies
return messages[this.id].call(this, move, tJailed, eJailed, team, enemies, tFlag, eFlag, messages);

নিয়ন্ত্রক চলাচলের জন্য ইউক্যালিডিয়ান দূরত্ব ব্যবহার করে।
TheNumberOne

4

লাল - গার্ড

এই বটটি পতাকাটি বেশ ভালভাবে রক্ষা করবে। এর পথে যাবেন না ...

if (!messages[this.id]) {
    //On the first turn, set messages[this.id] to the function I will call to move me. You can replace this function on subsequent turns
    //to control it. Additionally, you can use it as a library to find one of the best places to go to defend.
    messages[this.id] = function(move, tJailed, eJailed, team, enemies, tFlag, eFlag, messages, WIDTH, HEIGHT, FIELD_PADDING, DEFENSE_RADIUS) {
        var distance = function(p1, p2) {
            var dx = p1.x - p2.x;
            var dy = p1.y - p2.y;
            return Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
        }

        var moveTo = function(p) {
            if (!p) {
                return {x:0, y:0};
            }
            var dx = p.x - this.x;
            var dy = p.y - this.y;
            var max = this.strength;
            var dist = distance(p, this);
            if (dist < max) {
                return {x: dx, y: dy};
            }
            dx = dx * max / dist;
            dy = dy * max / dist;
            while (Math.sqrt(Math.abs(dx)+Math.abs(dy)) > max) {
                if (dx > dy) {
                    dx = dx - 0.001;
                } else {
                    dy = dy - 0.001;
                }
            }
            return {x: dx, y:dy};
        }.bind(this);

        if (tFlag.pickedUp) {
            if (tFlag.y - HEIGHT / 2 > distance(this, {x: tFlag.x, y: HEIGHT / 2})) {
                return moveTo(tFlag);
            } else {
                return moveTo({y: Math.min(this.y, tFlag.y), x: tFlag.x });
            }
        }

        if (eFlag.pickedUp == this.id) {
            return moveTo({x: x, y: HEIGHT / 2});            
        }

        var targetPoints = [];
        var crossedBorder = false;

        var weightedMiddlePoint = function(enemy) {
            var x1 = (enemy.x + tFlag.x) / 2;
            var y1 = (enemy.y + tFlag.y) / 2;
            var w = 1/Math.pow(distance(enemy, tFlag),2);
            return {x:x1,y:y1,w:w};
        }

        for (var i = 0; i < enemies.length; i++) {
            var enemy = enemies[i];
            if (enemy.isJailed){
                continue;
            }
            if (enemy.y > HEIGHT / 2) {
                crossedBorder = true;
            }
        }

        for (var i = 0; i < enemies.length; i++) {
            enemy = enemies[i];
            if (enemy.isJailed){
                continue;
            }
            if (crossedBorder) {
                if (enemy.y > HEIGHT / 2) {
                    targetPoints.push(weightedMiddlePoint(enemy));
                }
            } else {
                targetPoints.push(weightedMiddlePoint(enemy));
            }
        }

        if (targetPoints.length == 0) {
            return moveTo(eFlag);
        }

        var sumX = 0;
        var sumY = 0;
        var sumW = 0;

        for (var i = 0; i < targetPoints.length; i++) {
            point = targetPoints[i];
            sumX += point.x * point.w;
            sumY += point.y * point.w;
            sumW += point.w;
        }

        var targetPoint = {x: sumX / sumW, y: sumY / sumW};

        return moveTo(targetPoint);

    };
}

return messages[this.id].call(this, move, tJailed, eJailed, team, enemies, tFlag, eFlag, messages, WIDTH, HEIGHT, FIELD_PADDING, DEFENSE_RADIUS);

4

নীল - LegionMammal978

function repeat(el, n) // Helper function
{
    var rtn = [];
    for (var i = 0; i < n; i++)
        rtn.push(el);
    return rtn;
}
function sign(n) { return n ? n < 0 ? -1 : 1 : 0; } // Another helper function
if (!messages[this.id])
    messages[this.id] = { "dir": 1 };
if (this.isJailed) // Oh noes, I'm in jail!
{
    console.log(this.id, messages);
    if (!messages[this.id].jailTicks)
        messages[this.id].jailTicks = 0;
    messages[this.id].jailTicks++;
    // Call for help!
    messages.callsForHelp = repeat(["Help!", this.id, this.x, this.y], messages[this.id].jailTicks);
    return { "x": 0, "y": 0 };
}
if (messages[this.id].jailTicks)
    if (!(delete messages[this.id].jailTicks && delete messages.callsForHelp)) // Cleanliness
        messages[this.id].jailTicks = messages.callsForHelp = undefined;       // ...
var bounds = Math.floor(HEIGHT / 2); // Be safe with fractions
if (this.y > bounds - 5) // Get back to shelter!
    return { "x": 0, "y": this.y - this.strength <= bounds - 5 ? bounds - 5 - this.y : -4 };
var target = { "none": true, "x": WIDTH << 1, "y": HEIGHT << 1 };
enemies.forEach(function (en) { if (!en.isJailed && en.y < bounds - 5 && Math.abs(en.x - this.x) < Math.abs(target.x - this.x) && Math.abs(en.y - this.y) < Math.abs(target.y - this.y)) target = en; }, this);
if (target.none)
{
    if (this.y < bounds - 5)
        return { "x": 0, "y": 2 };
    var speed = this.strength < 30 ? 1 : 2;
    if (this.x == 5 || this.x == WIDTH - 5)
        messages[this.id].dir = -messages[this.id].dir;
    return { "x": speed * messages[this.id].dir, "y": 0 };
}
if (this.x - target.x >= 0 && this.x - target.x < this.strength)
{
    if (this.y - target.y > 0 && this.y - target.y < this.strength + target.x - this.x)
        return { "x": this.x - target.x, "y": this.y - target.y };
    if (target.y - this.y > 0 && target.y - this.y < this.strength + target.x - this.x)
        return { "x": this.x - target.x, "y": target.y - this.y };
}
if (target.x - this.x > 0 && target.x - this.x < this.strength)
{
    if (this.y - target.y > 0 && this.y - target.y < this.strength + this.x - target.x)
        return { "x": target.x - this.x, "y": this.y - target.y };
    if (target.y - this.y > 0 && target.y - this.y < this.strength + this.x - target.x)
        return { "x": target.x - this.x, "y": this.y - target.y };
}
return { "x": 6 * sign(target.x - this.x), "y": 6 * sign(target.y - this.y) };

প্রতিরক্ষা বট।


1
জাভাস্ক্রিপ্ট সম্পর্কে সামান্য জিনিস - আপনি thisকোনও ফাংশনের অভ্যন্তর (আপনার forEachলুপে) ব্যবহার করতে পারবেন না । আপনাকে এটিকে আগে (যেমন var _this = this;) হিসাবে পরিবর্তনশীল হিসাবে সংরক্ষণ করতে হবে এবং ব্যবহার করতে হবে _this। আপনি যদি শীঘ্রই সম্পাদনা করেন তবে আমি আপনাকে ব্যতিক্রম হিসাবে যুক্ত করব কারণ আপনি ভেবেছিলেন যে নিয়ামক আপনার কোডটি লোড করছে না এবং পরীক্ষা করতে পারে না।
soktinpk

@soktinpk শুধু ব্যবহৃত forEach'র ঐচ্ছিক thisArg
LegionMammal978

আপনি দেরীতে সম্পাদনা করা সত্ত্বেও আপনাকে অনুমতি দেওয়ার জন্য আমি নিয়ামককে আপডেট করেছি।
soktinpk

1

লাল - পতাকা হান্টার

var distance = function(x1, y1, x2, y2) {
    return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
var moveTo = function(x, y, max) {
    if (max > this.strength)
        max = this.strength;
    var dX = x - this.x;
    var dY = y - this.y;
    var dist = distance(x, y, this.x, this.y);
    if (dist <= max) {
        return {x: dX, y: dY};
    }
    dX = dX * max / dist;
    dY = dY * max / dist;
    while (Math.sqrt(Math.abs(dX)+Math.abs(dY)) > max) {
        if (dX > dY) {
            dX = dX - 0.001;
        } else {
            dY = dY - 0.001;
        }
    }
    return {x: dX, y:dY};
}.bind(this);

var getSurroundingPoints = function(x, y, dist) {
    var points = [];
    for (var i = x - dist; i <= x + dist; i+= 0.2) {
        for (var j = y - dist; j <= y + dist; j+= 0.2) {
            if (i >= 0 && j >= 0 && j <= 180 && distance(i,j,x,y) <= dist) {
                points.push({x: i, y: j, danger: 0});
            }
        }
    }
    return points;
}

if (this.isJailed) {
    return {x:0, y:0};
}

var destination = {x: eFlag.x, y: eFlag.y}; //default: try to get the flag
if (eFlag.pickedUpBy != null) { //we got the flag
    if (eFlag.pickedUpBy.id == this.id) { //I got the flag => get back to the red side
        if (distance(this.x, this.y, this.x, 175.1) <= this.strength) {
            return moveTo(this.x, 175.1, this.strength);
        }
        destination.x = this.x;
        destination.y = 180;
    } else { //someone else got the flag => free those in the jail
        destination.x = 20;
        destination.y = 20;
    }
} else if (this.y > HEIGHT / 2) { //I am on the red side
    return moveTo(175, 175, 2);
} else if (distance(this.x, this.y, eFlag.x, eFlag.y) <= 15)  { //I am in the safe zone (flag)
    if (this.strength < 20)
        return {x:0, y:0};
    return moveTo(eFlag.x, eFlag.y, 2); //get the flag
} else if (distance(this.x, this.y, eFlag.x, eFlag.y) - this.strength <= 15)  { //I can reach the safe zone (flag)
    return moveTo(eFlag.x, eFlag.y, distance(this.x, this.y, eFlag.x, eFlag.y) - 14);
} else if (distance(this.x, this.y, 20, 20) < 10)  { //I am in the safe zone (jail)
    if (this.strength < 20)
        return {x:0, y:0};
} else if (distance(this.x, this.y, eFlag.x, eFlag.y) - this.strength <= 15)  { //I can reach the safe zone (jail)
    return moveTo(20, 20, this.strength);
}

//I am somewhere on the blue side
var points = getSurroundingPoints(this.x, this.y, this.strength);
var me = this;
points.forEach(function(point) {
    if (point.y < 175) {
        enemies.forEach(function(enemy) {
            if (distance(enemy.x, enemy.y, point.x, point.y) <= enemy.strength+10) {
                point.danger += 5;
            }
        });
        if (distance(me.x, me.y, point.x, point.y) <= 2 && point.danger == 0) {
            point.danger--;
        }
    }
});
var bestPoint = points[0];
points.forEach(function(point) {
    if (point.danger < bestPoint.danger || (point.danger == bestPoint.danger && distance(point.x, point.y, destination.x, destination.y) < distance(bestPoint.x, bestPoint.y, destination.x, destination.y))) {
        bestPoint = point;
    }
});
return moveTo(bestPoint.x, bestPoint.y, this.strength);

পতাকা পাওয়ার চেষ্টা করে। অন্য কেউ যদি ইতিমধ্যে এটি পেয়ে থাকে তবে ফ্ল্যাং হান্টার শত্রুকে বিভ্রান্ত করে বা তার দলের সদস্যদের মুক্ত করে কারাগারের দিকে চলে।


1

নীল - একটি খুব ভাল ফেলো

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

// Euclidean distance
var distance = function(p1,p2){
 return Math.sqrt( (p1.x - p2.x)**2 + (p1.y - p2.y)**2 );
}

// points from p1 to p2
var direction = function(p1, p2){
 return Math.atan2( p2.y - p1.y, p2.x - p1.x);
}

//moving
var move2 = function(dir, step){
    if(isNaN(dir)){   dir = 0; };
    if(isNaN(step)){ step = 0; };
    return {
        x: Math.cos(dir)*step,
        y: Math.sin(dir)*step
    };
}


var intercept_at = function(me, they, field){
    if ( distance(me, they)<me.strength ){
        return they;
    }

    //console.log("I am at (", me.x, me.y, ") ");
    //console.log("They are at (", they.x, they.y, ") ");           


    //first goal
    if( field.my_flag.pickedUpBy == null ){
        their_goal = field.my_flag;
        eta = (distance(they, their_goal) - they.strength)/2;
        their_dir = direction(they, their_goal);
        for( var i=1; i<eta; i++){
          they_next = {
            x: they.x + Math.cos(their_dir)*(they.strength/2 + (i+1)*2),
            y: they.y + Math.sin(their_dir)*(they.strength/2 + (i+1)*2)
          };
          if( (distance(me, they_next) )<(1.95*i) ){
            //console.log("goal is flag at (", their_goal.x, their_goal.y, ") ");   
            //console.log("I can reach it at (", they_next.x, they_next.y, ") in less than ", i);
            return they_next;
          }
        }
    // second goal  
    }

    my_flag = field.my_flag;
    their_goal = { x: my_flag.x, y:field.h/2 - 5};
    eta = (distance(my_flag, their_goal) - they.strength)/2;
    their_dir = direction(my_flag, their_goal);
    for( var i=0; i<eta; i++){
        they_next = {
            x: my_flag.x + Math.cos(their_dir)*(they.strength/2 + (i+1)*2),
            y: my_flag.y + Math.sin(their_dir)*(they.strength/2 + (i+1)*2)
        };
        if( (distance(me, they_next) )<(1.95*i) ){
            //console.log("goal is escaping at (", their_goal.x, their_goal.y, ") "); 
            //console.log("I can front-run it at (", they_next.x, they_next.y, ") in less than ", i);
            return they_next;
        }       
    }
    //console.log("Goose chase at (", they.x, they.y, ") ");
    return they;
}

var intercept = function(me, they, field){
  they_at = intercept_at(me, they, field);
  they_at.y = Math.min(they_at.y, field.h/2-5)
  dist2me = distance(me, they_at);
  dir2me = direction(me, they_at);  
  if ( dist2me<me.strength ){
    return move2(dir2me, dist2me);
  }else{
    return move2(dir2me, 2);
  }
}


var closest_enemy = function(my_flag, enemies){
    cur_tgt_num = null;
    cur_tgt_dst = 999;

    for( var i=0; i<enemies.length; i++){
      if(!enemies[i].isJailed){
        cur_dst = distance(enemies[i], my_flag);
        if ( cur_dst < cur_tgt_dst ){
          cur_tgt_dst = cur_dst;
          cur_tgt_num = i;
        }
      }
    }    

    return enemies[cur_tgt_num];
}


var enemies_closer_than = function(enemies, radius, field){
    closer_than = 0;
    for( var i = 0; i<enemies.length; i++){
        if(!enemies[i].isJailed){
            closer_than = closer_than + ( distance(enemies[i], field.my_flag)<radius );
        }
    }
    return closer_than;
}


var team_jailed = function(team){
    for( var i = 0; i<team.length; i++){
        if(team[i].isJailed){
            return team[i];
        }
    }
    return null;
}


var bound_positions = function(p0, field){
    p0.x = Math.max(0, Math.min(p0.x, field.w));
    p0.y = Math.max(0, Math.min(p0.y, field.h));    
    return p0;
}

var avoid_obstacle = function(me, goal, obstacle, field, can_run){
    //we know that there is a safe haven
    if( distance(me, goal)<me.strength && can_run){
        return move2(direction(me, goal), me.strength)
    }

    if( obstacle == null ){
        return move2(direction(me, goal), 2);
    }

    ob_dir = direction(me, obstacle);
    if( distance(me, obstacle) < Math.sqrt(2)*(4+obstacle.strength)){
        me_next1 = bound_positions({x: me.x - 4*Math.cos(ob_dir),y: me.y - 4*Math.sin(ob_dir)}, field);
        me_next2 = bound_positions({x: me.x - 4*Math.sin(ob_dir),y: me.y - 4*Math.cos(ob_dir)}, field);
        me_next3 = bound_positions({x: me.x - 4*Math.sin(ob_dir),y: me.y - 4*Math.cos(ob_dir)}, field);
        if( distance(goal, me_next1) < distance(goal, me_next2) ){
          if( distance(goal, me_next1) < distance(goal, me_next3) ){
            me_next = me_next1;
          }else{
            me_next = me_next3;
          }
        }else{
          if( distance(goal, me_next2) < distance(goal, me_next3) ){
            me_next = me_next2;
          }else{
            me_next = me_next3;
          }
        }           

        //console.log("Escaping from (", obstacle.x, obstacle.y, ")");
        return move2(direction(me, me_next), 4);
    }

    eta = (distance(me, goal)/2);
    my_dir = direction(me, goal);
    me_next = me;
    i=0;
    while(i<eta && (distance(me_next, obstacle) > obstacle.strength+2*i)){
       i++;
       me_next = {x: me_next.x + i*Math.cos(my_dir),y: me_next.y + i*Math.sin(my_dir)};
       me_next = bound_positions(me_next, field);
       if( distance(me_next, obstacle) < obstacle.strength+2*i ){
         me_next1 = {x: me_next.x + i*Math.sin(ob_dir),y: me_next.y - i*Math.cos(ob_dir)};
         me_next2 = {x: me_next.x - i*Math.sin(ob_dir),y: me_next.y + i*Math.cos(ob_dir)};
         if( distance(goal, me_next1) > distance(goal, me_next2) ){
            me_next = bound_positions(me_next2, field);
         }else{
            me_next = bound_positions(me_next1, field);
         }
       }
    }
    if( distance(me_next, obstacle) > obstacle.strength+2*i ){
        //console.log("Trying to reach goal at (", goal.x, goal.y, ") by pointing at (",me_next.x, me_next.y,")");      
        return move2(direction(me, me_next), 2);
    }

    //console.log("Waiting to reach (", goal.x, goal.y,")");
    my_dir = direction(me, goal);
    me_next = {
        x: me.x + Math.cos(my_dir)*6,
        y: me.y + Math.sin(my_dir)*6
    }
    for( var i=0; i<field.team.length; i++){
        me_next.x = me_next.x - Math.sign(field.team[i].x - me_next.x);
        me_next.y = me_next.y - Math.sign(field.team[i].y - me_next.y);
    }               
    return move2(direction(me, me_next), Math.floor(Math.random() * 2));
}


var field = {
    w: WIDTH, 
    h: HEIGHT, 
    g: DEFENSE_RADIUS,
    my_flag: tFlag,
    their_flag: eFlag,
    team: team,
    enemies: enemies
    };

var n_enemy = enemies.length;


  if( enemies_closer_than(enemies, field.h*0.67, field)>0 || tFlag.pickedUpBy !== null){
    //console.log("My flag is in danger");      

    // directive defend
    messages[123 + this.id] = 'defend_own_flag';
    if ( tFlag.pickedUpBy !== null ) {
      return intercept(this, tFlag.pickedUpBy, field);
    }else{
      return intercept(this, closest_enemy(tFlag, enemies), field);
    }   
  }else{

    if( tJailed.length>0 ){

        // directive support
        console.log("rescueing team member");
        console.log(tJailed);
        return avoid_obstacle(this, tJailed[0], closest_enemy(this, enemies), field, 0);
    }else{

      // directive attack
      messages[123 + this.id] = 'capture_enemy_flag';
      if ( eFlag.pickedUpBy == null ){
        //console.log("Going to capture the flag");
        return avoid_obstacle(this, eFlag, closest_enemy(this, enemies), field, 0)

      }else if (this.id == eFlag.pickedUpBy.id){
        //console.log("I have the flag");
        return avoid_obstacle(this, {x:this.x, y:field.h/2 - 1}, closest_enemy(this, enemies), field, 1);      

      }else {
        //console.log("Someone else has the flag");
        return avoid_obstacle(this, eFlag, closest_enemy(this, enemies), field, 0);

      }
    }
  }

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