পাহাড়ের রাজা - স্পেসওয়ার!


64

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

কোটটি এখানে হোস্ট করা হয়েছে: পিপিসিজি - স্পেসওয়ার! পাহাড়ের রাজাগেমটি কীভাবে কাজ করে তার অনুভূতি পেতে আপনাকে কমপক্ষে একটি অন্য বটের বিরুদ্ধে মানব হিসাবে খেলতে উত্সাহিত করি।

খেলাাটি

  • একটি ফ্রেম 30 মিলিসেকেন্ড (এইভাবে, প্রতি সেকেন্ডে প্রায় 33 ফ্রেম)।
  • ক্ষেত্রটি 800 পিক্সেল প্রশস্ত এবং 600 পিক্সেল লম্বা।
  • ক্ষেত্রটি টেরয়েডাল, যার অর্থ ক্ষেত্রের বাইরে চলে যাওয়া স্পেসশিপ এবং মিসাইলগুলি বিপরীত দিকে আবার উপস্থিত হবে।
  • লাল এবং নীল দুটি স্পেসশিপ রয়েছে।
    • রেডটি x = 50 এবং এলোমেলো y এর 50, (ক্ষেত্রের উচ্চতা - 50) পিক্সেলের মধ্যে অবস্থিত।
    • নীলটি x = (ক্ষেত্রের প্রস্থ - 50) এবং এলোমেলো y এর 50, (ক্ষেত্রের উচ্চতা - 50) পিক্সেলের উপরে অবস্থিত।
    • উভয় মুখ x = (ক্ষেত্রের প্রস্থ) / 2।
  • উপলব্ধ নিয়ন্ত্রণগুলি হ'ল:
    • বাম দিকে ঘুরুন - প্রতি ফ্রেমের প্রতি ঘড়ির কাঁটার দিকে 5 ডিগ্রি।
    • ডানদিকে ঘুরুন - ঘড়ির কাঁটার দিকে ফ্রেম প্রতি 5 ডিগ্রি।
    • অগ্নি ক্ষেপণাস্ত্র - জাহাজটি যে দিকে ইশারা করছিল সেদিকে জাহাজের গতিবেগ ছাড়াও ফ্রেম প্রতি অতিরিক্ত 10 পিক্সেল ভ্রমণ করে।
    • ফায়ার ইঞ্জিন - স্পেসশিপটি নির্দেশ করছে যে দিকে ফ্রেম প্রতি 0.30 পিক্সেল এ স্পেসশিপটি ত্বরান্বিত করে।
    • হাইপারস্পেস জাম্প - ক্ষেত্রের কয়েকটি এলোমেলো স্থানাঙ্কে টেলিফোনগুলি, বিস্ফোরণের 25% সম্ভাবনা রয়েছে। এই এলোমেলো স্থানাঙ্কগুলি সূর্যের শীর্ষে থাকতে পারে।
  • মাধ্যাকর্ষণ বৃদ্ধির সময় জাহাজগুলির জন্য সর্বোচ্চ গতি ইঞ্জিন পাওয়ারের অধীনে ফ্রেম প্রতি 15 পিক্সেল এবং ফ্রেম প্রতি 40 পিক্সেল।
    • প্রতি ফ্রেম 15 পিক্সেলের বেশি দ্রুত ভ্রমণ করার সময় ইঞ্জিন থ্রাস্ট কেবল দিক পরিবর্তন বা ধীর হতে পারে।
  • ক্ষেপণাস্ত্র সম্পর্কিত:
    • মিসাইলগুলি একটি সরল লাইনে ভ্রমণ করে।
    • মিসাইলগুলি 0.1 সেকেন্ডে সর্বোচ্চ 1 হারে নিক্ষেপ করা হতে পারে।
    • মিসাইলগুলির আজীবন ২.২৫ সেকেন্ড থাকে।
    • জাহাজগুলির প্রতিটিতে সর্বোচ্চ 20 টি ক্ষেপণাস্ত্র রয়েছে।
    • মিসাইলগুলি অভ্যন্তরীণভাবে পয়েন্ট কণা।
  • খুব কেন্দ্রে একটি সূর্য রয়েছে যা আপনার জাহাজের পক্ষে অত্যন্ত বিপজ্জনক। নামমাত্র যোগাযোগ মারাত্মক হয়। এই সূর্য ক্ষেপণাস্ত্র ধ্বংস করে।
  • সূর্যের মাধ্যাকর্ষণ আছে। ফলস্বরূপ ত্বরণটি 5000 / (দূরত্ব ^ 2) পিক্সেল / ফ্রেম ^ 2, যেখানে দূরত্ব পিক্সেলে রয়েছে। স্পেসশিপ এবং ক্ষেপণাস্ত্রগুলি প্রভাবিত হয়।
  • উভয় জাহাজের তিনটি স্ট্রাইক অঞ্চল রয়েছে: নাক, বাম শাখা এবং ডান ডানা।
    • নাকের উপর আঘাত হানা তাত্ক্ষণিক মৃত্যু।
    • উভয় পক্ষের উপর আঘাত হ'ল স্পেসশিপের টার্ন রেট এবং ইঞ্জিনের ত্বরণ অর্ধেক হ্রাস করে।
    • উভয় ডানা ধ্বংস হয়ে গেলে, স্পেসশিপটি চালিত করা যায় না এবং কেবল মিসাইল গুলি চালানো যেতে পারে fire
  • জাহাজগুলির একে অপরের সাথে সংঘর্ষ হতে পারে।
    • উভয় জাহাজের জন্য নাক-নাকের প্রভাব মারাত্মক।
    • একটি নাক ডানা প্রভাব ডানা ধ্বংস।
    • একটি ডানা ডানা প্রভাব উভয় ডানা ধ্বংস করে।
  • মৃত জাহাজগুলি শক্ত এবং হিমায়িত হয় যতক্ষণ না তারা 1 সেকেন্ড পরে বিস্ফোরিত হয়।
  • কমপক্ষে একটি জাহাজ মারা যাওয়ার পরে, ক্ষেত্রটি 3 সেকেন্ড পরে পুনরায় সেট করা হবে। ততক্ষণে, সূর্য এবং অন্য কোনও মিসাইল এখনও ঝুঁকিপূর্ণ।

আসল গেমটিতে মারাত্মক এবং অবিনাশী গ্রহাণুও রয়েছে তবে আমি সেগুলি অন্তর্ভুক্ত করব না।

নিয়ম

  • আপনার বটটি অবশ্যই জাভাস্ক্রিপ্টে লেখা উচিত।
  • আপনার বটটি এর সিদ্ধান্তটিকে প্রায় 10 মিলিসেকেন্ডে সীমাবদ্ধ করে। আপনার বোটের কারণে যদি আমি ধারাবাহিকভাবে পিছিয়ে পড়ে লক্ষ্য করি তবে আমি এটিকে অযোগ্য ঘোষণা করব এবং আপনাকে জানাতে পারি যাতে আপনি এটি ঠিক করতে পারেন।
  • বটগুলির নিম্নলিখিতগুলিতে অ্যাক্সেস থাকবে:
    • ক্ষেত্রের প্রস্থ এবং ক্ষেত্রের উচ্চতা
    • সূর্যের অবস্থান এবং ব্যাসার্ধ
    • উভয় জাহাজের অবস্থান, ঘূর্ণন, বেগ, আকার, ক্ষেপণাস্ত্র স্টক এবং হাইপারস্পেসের স্থিতি
    • সমস্ত ক্ষেপণাস্ত্রগুলির অবস্থান এবং বেগ
  • জিজ্ঞাসা করা হলে, আপনার বট স্ট্রিংগুলির একটি তালিকা ফেরত দেওয়া উচিত।
    • : এই স্ট্রিং নিম্নলিখিত কোনো একটি হওয়া আবশ্যক turn left, turn right, fire engine, fire missile, hyperspace। অন্য কোনও স্ট্রিং উপেক্ষা করা হবে।
    • যদি কোনও সদৃশ থাকে তবে কেবল প্রথমটিই লক্ষ্য করা যাবে।
    • hyperspace অন্য সকলের চেয়ে অগ্রাধিকার নেয়।
    • turn leftএবং turn rightএকই সাথে কোনও প্রভাব ফেলবে না।
    • fire engine যদি জাহাজটির কেবল নাক থাকে বা মারা যায় তবে তার কোনও প্রভাব পড়বে না।
    • fire missile খুব সম্প্রতি একটি ক্ষেপণাস্ত্র চালিত হলে এর কোনও প্রভাব পড়বে না।
  • স্বাভাবিকের পরিবর্তনে, আপনার বটকে অন্য বটের আচরণের সুযোগ নিতে দেওয়া হয়। আমি একটি মেটাগেমকে উত্সাহিত করতে চাই।
    • বটগুলি অন্যান্য বটগুলি অনুকরণ করতে পারে না । (অর্থাত্ মন-পঠন নেই))
    • বটস গেম এবং পদার্থবিজ্ঞানের কোড দ্বারা ব্যবহৃত কোনও ভেরিয়েবল সেট নাও করতে পারে । (অর্থাত্ কোনও প্রতারণা নেই))

বট বাস্তবায়ন বিশদ

আমি আপনার বটটি ফাইলের নাম সহ স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করা নিজস্ব জাভাস্ক্রিপ্ট ফাইলটিতে সংরক্ষণ করব bot_<name>.js। সুতরাং এমন কোনও স্পেস বা অক্ষর রাখবেন না যা এতে বা জাভাস্ক্রিপ্টে কোনও ফাংশন নামকরণের সাথে হস্তক্ষেপ করবে। এটি কারণ আপনার নিম্নলিখিত ফাংশনগুলি সংজ্ঞায়িত করা উচিত: <name>_setup(team)এবং <name>_getActions(gameInfo, botVars)। পৃষ্ঠার আরও নিচে, ব্যবহারকারীর জন্য টেক্সারিয়াস রয়েছে যা আপনি আপনার কোডটি পরীক্ষা করতে সম্পাদনা করতে পারবেন।

<name>_setup(team)

আপনি অবিরত রাখতে চান এমন কোনও ভেরিয়েবল সংজ্ঞায়িত করার জন্য এই ফাংশনটি। teamহয় হয় "red"বা হয় "blue"। এই ফাংশন অবশ্যই একটি বস্তু ফেরত দিতে হবে। ভেরিয়েবলগুলি এর মতো সংজ্ঞায়িত করুন:

var vars = {};
vars['example'] = "example";
return vars;

এই varsঅবজেক্টটি অন্য ফাংশনে প্রবেশ করবে:

<name>_getActions(gameInfo, botVars)

botVarsবস্তুটি দ্বারা প্রত্যাবর্তিত হয় <name>_setup(team)gameInfoনিম্নলিখিত ভেরিয়েবল সমন্বিত একটি অবজেক্ট:

redScore
blueScore
timeLeft

fieldWidth
fieldHeight

sun_x
sun_y
sun_r //sun's radius

gravityStrength //acceleration in pixels/frame^2 at 1 pixel away from the sun's center
engineThrust    //acceleration in pixels/frame^2

speedLimit //maximum speed under engine power
maxSpeed   //maximum speed from gravity boosts

red_x
red_y
red_rot          //rotation in degrees
red_xv           //x velocity
red_yv           //y velocity
red_shape        //one of "full ship", "left wing", "right wing", "nose only"
red_missileStock //the number of missiles red has left
red_inHyperspace //true if red is in hyperspace
red_exploded     //until red explodes, it is still solid and hazardous
red_alive
// likewise for blue //

numMissiles
missiles //this is a list of objects, each with the following variables
  x
  y
  xv
  yv

আপনার বট এগুলিতে সম্পূর্ণ অ্যাক্সেস রয়েছে। আমি নিশ্চিত যে আপনি তাদের কাছে লিখতে পারেন এবং আসল ভেরিয়েবলগুলি প্রভাবিত করতে পারবেন না, তবে যাইহোক এটি করবেন না। ঘুর্ণন একটি নোট: জাহাজ বাতলান , + Y দিক নিচের দিকে, তাই কিছু জাহাজ দিয়ে সারিবদ্ধ করতে চান 90 ডিগ্রী পুষিয়ে করা প্রয়োজন। এছাড়াও, ইতিবাচক ঘূর্ণনটি ঘড়ির কাঁটার দিকে।

এই ফাংশনটি অবশ্যই আপনার বটের ক্রিয়াকলাপ উপস্থাপন করে স্ট্রিংগুলির একটি তালিকা ফেরত দিতে হবে। উদাহরণস্বরূপ ["turn right","thrust"],। এ সম্পর্কে আরও বিশদ বিধি বিধানে রয়েছে।

অতিরিক্ত তথ্য

আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

LineIntersection(L1, L2)

L1 এবং L2 দ্বি-উপাদান অ্যারেগুলির দুটি-উপাদান অ্যারে। যে, L1 := [[x1,y1],[x2,y2]]এবং L2 := [[u1,v1],[u2,v2]]। এই ফাংশনটি দুই লাইন ছেদ নির্ণয় এবং এই ফেরৎ: [[x,y], [a,b]][x,y]ছেদ বিন্দুর স্থানাঙ্ক এবং [a,b]এটি এমন এক অনুপাত যা প্রকাশ করে যে প্রতিটি লাইন বরাবর ছেদ বিন্দু কতটা দূরে express হিসাবে হিসাবে, a = 0.25ছেদ বিন্দু থেকে [x1,y1]যেতে পথ চতুর্থাংশ [x2,y2], এবং তেমনিভাবে হবে bযদি কোনও ছেদ না থাকে তবে একটি খালি অ্যারে ফিরে আসে।

window["shipShapes"]

var shipShapes = {
    'full ship': [[-8,16],[0,-8],[8,16]],
    'left wing': [[-8,16],[0,-8],[4,4],[0,8],[0,16]],
    'right wing':[[-4,4],[0,-8],[8,16],[0,16],[0,8]],
    'nose only': [[-4,4],[0,-8],[4,4],[0,8]]
};

এগুলি হ'ল জাহাজের বহুভুজগুলির স্থানাঙ্ক। বর্তমান স্থানাঙ্কগুলি সহজতর করতে আপনি ব্যবহার করতে পারেন ...

getShipCoords(<color>)

getShipCoords("red")রেডের জাহাজের শীর্ষাংশের বর্তমান স্থানাঙ্কগুলি এবং একইভাবে getShipCoords("blue")এবং নীলকে ফিরিয়ে দেবে । এই স্থানাঙ্ক তাই মত একটি তালিকা আছে: [[x1,y1],[x2,y2],[x3,y3],...]। বহুভুজগুলি সুস্পষ্টভাবে বন্ধ রয়েছে, সুতরাং প্রথম এবং শেষ স্থানাঙ্ক জোড়াগুলির মধ্যে একটি লাইন রয়েছে।

আপনি গেম / ওয়েবসাইটের দ্বারা ব্যবহারযোগ্য কোনও অন্যান্য ভেরিয়েবল বা ফাংশন অ্যাক্সেস বা পরিবর্তন করতে পারবেন না। এবং অবশ্যই আপনার ফাংশনগুলির নাম একই রাখবেন না। আমি ভাবছি না যে এটি একটি সমস্যা হবে তবে আপনার বট যদি গেম কোডটি ভেঙে দেয় তবে এটিই সম্ভাবনা। কোনও লগিং বা ব্যতিক্রম ধরা নেই is

জয়লাভ

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

সর্বোপরি, মজা করুন!


লিডারবোর্ড (2016-01-08 05:15):

#   Name                       Mean      StdDev
1.  Helios                     13.625    6.852
2.  EdgeCase                    8.335    8.155
3.  OpponentDodger              8.415    8.186
4.  OrbitBot                    5.110    6.294
5.  SunAvoider                  5.276    6.772
6.  DangitBobby                 3.320    4.423
7.  SprayAndPray                3.118    4.642
8.  Engineer                    3.903    6.315
9.  RighthandedSpasms           1.805    2.477
10. AttackAndComeBack           2.521    2.921
11. PanicAttack                 2.622    3.102
12. FullSpeedAhead              2.058    3.295
13. UhhIDKWhatToCallThisBot     2.555    3.406
14. MissilesPlusScore           0.159    0.228
15. Hyper                       0.236    0.332
16. RandUmmm                    0.988    1.329
17. Kamikaze                    0.781    1.793

দ্রষ্টব্য: আমি আরও গেমস চালানোর কারণে এটি পরিবর্তন হতে পারে। এছাড়াও, 9-13 র‌্যাঙ্কের ক্রমটি আমাকে বিরক্ত করে, সুতরাং তাদের কীভাবে র‌্যাঙ্কিং করা উচিত তার অন্তর্দৃষ্টির সাথে আরও ভালভাবে মেলে আমি স্কোরিং পদ্ধতিটি টুইঙ্ক করতে পারি।

(মানে এবং স্ট্যান্ডার্ড বিচ্যুতিগুলি তিন দশমিক অঙ্ককে গোল করা হয়েছিল Also এছাড়াও, হ'ল হাইডিংয়ে গোলযোগ Hyperহওয়া উচিত HYPER: পি)


কোন স্কোর? ....
ev3 কম্যান্ডার

এটি ব্যতিক্রম ধরা লগ না?
TheNumberOne

1
আপনাকে উল্লেখ করতে হবে যে আন্তঃ LineIntersectionছেদকারী বিভাগগুলিতে কল করা একটি ফাঁকা অ্যারে দেয়।
LegionMammal978

1
আমার মনে হয় আমি এটা করেছি!
ev3commander

3
@ ক্রজিপিথন: আমি প্রথম দুটি খেলাকে মূলত একটি গেমটি অনুলিপি করে বিবেচনা করে বিতর্ক করব তবে তৃতীয়টি আমি যা চেয়েছিলাম ঠিক তা-ই। ধন্যবাদ! : ডি
এল'েন্ডিয়া স্টারম্যান

উত্তর:


12

Helios

এই বটটি মহাবিশ্বের কেন্দ্রবিন্দু, বা কমপক্ষে তিনি ভাবেন যে তিনি। তিনি প্রথম যে কাজটি করেন তা হ'ল একটি গুরুতর ত্রুটি সংশোধন করে নিজেকে স্থানাঙ্ক ব্যবস্থার কেন্দ্রে স্থাপন করা। তারপরে সে নিজের চারপাশে কিছু ঘোরে।

তিনি অন্য (নকল) সূর্য পছন্দ করেন না, তাই তিনি এ থেকে দূরে থাকার চেষ্টা করেন। তিনি অন্যান্য বটগুলিও পছন্দ করেন না, তাই তিনি শুটিংয়ের ভাল অবস্থানে থাকলে সেগুলিকে গুলি করে।

function Helios_setup(team) {
    var botVars = {};
    botVars.myPrefix = team + "_";
    botVars.enemyPrefix = team == "red" ? "blue_" : "red_";
    return botVars;
}

function Helios_getActions(gameInfo, botVars) {
    var actions = [];
    var halfPi = Math.PI / 2;
    var engageAngle = Math.PI / 8;

    var field = {};
    field.width = gameInfo.fieldWidth;
    field.height = gameInfo.fieldHeight;
    field.halfWidth = field.width / 2;
    field.halfHeight = field.height / 2;
    field.posOffsetX = field.width * 3 / 2 - gameInfo[botVars.myPrefix + "x"];
    field.posOffsetY = field.height * 3 / 2 - gameInfo[botVars.myPrefix + "y"];
    field.posAngle = (450 - gameInfo[botVars.myPrefix + "rot"]) % 360 * Math.PI / 180;
    field.posSin = Math.sin(-field.posAngle);
    field.posCos = Math.cos(-field.posAngle);
    field.movOffsetXV = -gameInfo[botVars.myPrefix + "xv"];
    field.movOffsetYV = gameInfo[botVars.myPrefix + "yv"];
    field.movAngle = Math.atan2(-field.movOffsetYV, -field.movOffsetXV);
    field.movSin = Math.sin(-field.movAngle);
    field.movCos = Math.cos(-field.movAngle);

    function zeroIfUndefined(v) {
        return v === undefined ? 0 : v;
    }

    function sqr(x) {
        return x * x
    }

    function getEntity(source, prefix) {
        var tmpX = (field.posOffsetX + zeroIfUndefined(source[prefix + "x"])) % field.width - field.halfWidth;
        var tmpY = field.halfHeight - (field.posOffsetY + zeroIfUndefined(source[prefix + "y"])) % field.height;
        var tmpXV = zeroIfUndefined(source[prefix + "xv"]);
        var tmpYV = -zeroIfUndefined(source[prefix + "yv"]);
        var e = {};
        e.posX = tmpX * field.posCos - tmpY * field.posSin;
        e.posY = tmpX * field.posSin + tmpY * field.posCos;
        e.posR = Math.sqrt(sqr(e.posX) + sqr(e.posY));
        e.posPhi = Math.atan2(e.posY, e.posX);
        e.posXV = tmpXV * field.posCos - tmpYV * field.posSin;
        e.posYV = tmpXV * field.posSin + tmpYV * field.posCos;
        e.posV = Math.sqrt(sqr(e.posXV) + sqr(e.posYV));
        e.movX = tmpX * field.movCos - tmpY * field.movSin;
        e.movY = tmpX * field.movSin + tmpY * field.movCos;
        e.movR = Math.sqrt(sqr(e.movX) + sqr(e.movY));
        e.movPhi = Math.atan2(e.movY, e.movX);
        e.movXV = (tmpXV + field.movOffsetXV) * field.movCos - (tmpYV + field.movOffsetYV) * field.movSin;
        e.movYV = (tmpXV + field.movOffsetXV) * field.movSin + (tmpYV + field.movOffsetYV) * field.movCos;
        return e;
    }

    function getShip(prefix) {
        var ship = getEntity(gameInfo, prefix);
        ship.missileStock = gameInfo[prefix + "missileStock"];
        ship.inHyperspace = gameInfo[prefix + "inHyperspace"];
        ship.exploded = gameInfo[prefix + "exploded"];
        ship.alive = gameInfo[prefix + "alive"];
        return ship;
    }

    var myShip = getShip(botVars.myPrefix);
    myShip.movAngle = (field.posAngle - field.movAngle + 3 * Math.PI) % (2 * Math.PI) - Math.PI;
    var enemyShip = getShip(botVars.enemyPrefix);
    var sun = getEntity(gameInfo, "sun_");

    enemyShip.intersectionLine = [[enemyShip.movX - enemyShip.movXV * 30, enemyShip.movY - enemyShip.movYV * 30],
            [enemyShip.movX + enemyShip.movXV * 30, enemyShip.movY + enemyShip.movYV * 30]];

    var intersection = LineIntersection([[0, 0], [Math.cos(myShip.movAngle) * 10 * 30, Math.sin(myShip.movAngle) * 10 * 30]],
            enemyShip.intersectionLine);
    if (intersection.length == 2) {
        myShip.intersection = Math.abs(intersection[1][0] / 2 + 0.5 - intersection[1][1]);
    }
    intersection = LineIntersection([[0, 0], [Math.cos(myShip.movAngle - 0.001) * 10 * 30, Math.sin(myShip.movAngle - 0.001) * 10 * 30]],
            enemyShip.intersectionLine);
    if (intersection.length == 2) {
        myShip.intersectionLeft = Math.abs(intersection[1][0] / 2 + 0.5 - intersection[1][1]);
    }
    intersection = LineIntersection([[0, 0], [Math.cos(myShip.movAngle + 0.001) * 10 * 30, Math.sin(myShip.movAngle + 0.001) * 10 * 30]],
            enemyShip.intersectionLine);
    if (intersection.length == 2) {
        myShip.intersectionRight = Math.abs(intersection[1][0] / 2 + 0.5 - intersection[1][1]);
    }

    function danger() {
        var tmp1 = sqr(sun.movXV) + sqr(sun.movYV);
        var tmp2 = tmp1 == 0 ? 0 : Math.max(0, Math.min(1, ((-sun.movX) * sun.movXV + (-sun.movY) * sun.movYV) / tmp1));
        var dis = Math.sqrt(sqr(sun.movX + tmp2 * sun.movXV) + sqr(sun.movY + tmp2 * sun.movYV));
        if (dis < 30) {
            return true;
        }
        var shipLine1 = [[-16, 8], [-16, -8]];
        var shipLine2 = [[-16, 8], [8, 0]];
        var shipLine3 = [[-16, -8], [8, 0]];
        if (gameInfo.missiles !== undefined) {
            for (var i = 0; i < gameInfo.missiles.length; i++) {
                var missile = getEntity(gameInfo.missiles[i], "");
                var missileLine = [[missile.movX + missile.movXV * 0.5, missile.movY + missile.movYV * 0.5],
                        [missile.movX + missile.movXV * 3, missile.movY + missile.movYV * 3]];
                if (LineIntersection(shipLine1, missileLine).length == 2 ||
                        LineIntersection(shipLine2, missileLine).length == 2 ||
                        LineIntersection(shipLine3, missileLine).length == 2) {
                  return true;
                }
            }
        }
        return false;
    }

    function fire() {
        return enemyShip.alive && !enemyShip.inHyperspace && myShip.intersection !== undefined &&
            myShip.intersection < 0.1 + myShip.missileStock / 200;
    }

    function evadeSun() {
        if ((sun.movPhi >= 0 && myShip.movAngle < 0) || (sun.movPhi <= 0 && myShip.movAngle > 0)) {
            actions.push("fire engine");
        }
        if (sun.movPhi > 0) {
            if (Math.abs(myShip.movAngle) < halfPi) {
                actions.push("turn right");
            } else {
                actions.push("turn left");
            }
        } else {
            if (Math.abs(myShip.movAngle) < halfPi) {
                actions.push("turn left");
            } else {
                actions.push("turn right");
            }
        }
    }

    function aim() {
        if (myShip.intersection !== undefined && myShip.intersectionLeft !== undefined && myShip.intersectionLeft < myShip.intersection) {
            actions.push("turn left");
        } else if (myShip.intersection !== undefined && myShip.intersectionRight !== undefined && myShip.intersectionRight < myShip.intersection) {
            actions.push("turn right");
        } else {
            if (enemyShip.posPhi > 0) {
                actions.push("turn left");
            } else {
                actions.push("turn right");
            }
        }
        if (myShip.posV < 2 || (enemyShip.alive && (enemyShip.movXV >= 0 || myShip.missileStock == 0))) {
            actions.push("fire engine");
        }
    }

    function brake() {
        if (myShip.movAngle > 0) {
            actions.push("turn left");
        } else {
            actions.push("turn right");
        }
        if (Math.abs(myShip.movAngle) > Math.PI * 3 / 4) {
            actions.push("fire engine");
        }
    }

    function engage() {
        if (enemyShip.missileStock > 0) {
            if ((enemyShip.posPhi > 0 && enemyShip.posPhi < engageAngle) || enemyShip.posPhi < -engageAngle) {
                actions.push("turn right");
            } else {
                actions.push("turn left");
            }
        } else {
            if (enemyShip.posPhi > 0) {
                actions.push("turn left");
            } else {
                actions.push("turn right");
            }
        }
        actions.push("fire engine");
    }

    if (myShip.alive && !myShip.inHyperspace) {
        if (danger()) {
            actions.push("hyperspace");
        }
        if (fire()) {
            actions.push("fire missile");
        }
        if (enemyShip.exploded || enemyShip.inHyperspace || sun.movR < 150 || (sun.movR < 300 && Math.abs(sun.movPhi) < Math.PI)) {
            evadeSun();
        } else if (enemyShip.posR < 300 || myShip.intersection !== undefined) {
            aim();
        } else if (myShip.posV > 10) {
            brake();
        } else {
            engage();
        }
    }

    return actions;
}

1
আমি মনে করি এটি এখন পর্যন্ত আমার প্রিয় একটি বট। এটা আশ্চর্যজনক ভাল!
এল'েন্ডিয়া স্টারম্যান

@ এল'এন্ডিয়াস্টারম্যান আমি বটটিতে কিছু আপডেট করেছি।
স্লেফার

আপনার আপডেট এখন লাইভ!
এল'ইনিয়া স্টারম্যান

এটি অরবিটবটের বিরুদ্ধে খুব ভাল কাজ করে :)
TheNumberOne

1
@ সোয়াকু আমি মনে করি এই বটটি এবং অন্যদের মধ্যে বেশিরভাগের মধ্যে প্রধান পার্থক্য হ'ল এই বটটি শুটিংয়ের আগে তার প্রতিপক্ষকে লক্ষ্য করে।
স্লেফার

9

SunAvoider

এটি কেবল সূর্য থেকে দূরে থাকার চেষ্টা করে। এটি এত সুন্দরভাবে কাজ করে ... যতক্ষণ না এটি এক বা উভয় ডানা ধ্বংস হয়ে যায়, তবে এটি পড়ার আগে সাধারণত এটি কেবল সময়ের বিষয়।

function SunAvoider_setup(team) {
    var botVars = {};

    botVars["color"] = team;

    return botVars;
}

function SunAvoider_getActions(gameInfo, botVars) {
    var actions = [];

    if (gameInfo[botVars["color"]+"_alive"]) {
        var shipx = gameInfo[botVars["color"]+"_x"];
        var shipy = gameInfo[botVars["color"]+"_y"];
        var sunx = gameInfo["sun_x"];
        var suny = gameInfo["sun_y"];
        var dx = shipx - sunx;
        var dy = shipy - suny;
        var dis = Math.sqrt(dx*dx+dy*dy);
        var fireEngineChance = (dis-100)/(gameInfo["fieldHeight"]/2);

        if (Math.random() > fireEngineChance){ actions.push("fire engine") }

        var ang1 = gameInfo[botVars["color"]+"_rot"]+90;
        var ang2 = Math.degrees( Math.atan2(dy, dx) );
        var angDiff = ang2 - ang1;
        if (angDiff < -180) { //http://stackoverflow.com/a/7869457/1473772
            angDiff += 360;
        } else if (angDiff > 180) {
            angDiff -= 360;
        }

        if (angDiff >= 0) {
            actions.push("turn left");
        } else if (angDiff < 0) {
            actions.push("turn right");
        }
    }

    return actions;
}

9

EdgeCase

সূর্য থেকে পুরো গতিতে উড়ে ম্যাপের প্রান্তের দিকে! এটি যখন নিজেকে সূর্যের দিকে ইঙ্গিত করে এটি প্রান্তে ফিরে যাওয়ার জন্য নিজেকে দূরে সরিয়ে শুটিং শুরু করবে। এটি যখন সূর্যকে আঘাত করতে চলেছে তখন হাইপারস্পেসেও প্রবেশ করে।

function EdgeCase_setup(team) {
  var botVars = {};
  botVars["color"] = team;
  return botVars;
}

function EdgeCase_getActions(gameInfo, botVars) {
  var actions = [];

  // Get our ship's position
  var rotation, x, y, opponentAlive;
  if(botVars.color == "red") {
    rotation = gameInfo.red_rot;
    x = gameInfo.red_x;
    y = gameInfo.red_y;
    opponentAlive = gameInfo.blue_alive;
  }
  else if(botVars.color == "blue") {
    rotation = gameInfo.blue_rot;
    x = gameInfo.blue_x;
    y = gameInfo.blue_y;
    opponentAlive = gameInfo.red_alive;
  }

  // Calculate our rotation compared to the sun in degrees
  var sunX = gameInfo.sun_x,
      sunY = gameInfo.sun_y,
      angle = Math.atan2(sunY - y, sunX - x) * 180 / Math.PI,
      rotationToSun = (rotation - angle + 360) % 360;

  // Check if we need to hyperspace to avoid the sun
  var rX = x - sunX,
      rY = y - sunY,
      distanceFromSun = Math.sqrt(rX * rX + rY * rY) - gameInfo.sun_r;
  if(distanceFromSun < 30) actions.push("hyperspace");
  else {

    // Turn away from the sun
    if(rotationToSun > 90 && rotationToSun < 270) {
      actions.push("turn right");
    }
    else actions.push("turn left");

    // Fire engines if we're pointing away from the sun
    if(rotationToSun > 180) {
      actions.push("fire engine");
    }

    // If we shoot while our opponent's dead we can only kill ourself
    else if(opponentAlive) actions.push("fire missile");
  }

  return actions;
}

এই বটটি এখন লাইভ! এছাড়াও, এটির বিরুদ্ধে লড়াই করা অবাক করা সহজ ছিল। সম্ভবত এটি অন্যের মতো কিছু জায়গায় স্প্যাম মিসাইল কীভাবে না ঘটায় তা করতে হবে। : পি
এল'েন্ডিয়া স্টারম্যান

7

OrbitBot

বর্তমানে কোনও লক্ষ্য বা সংঘর্ষ এড়ানো নেই । এটি সূর্যের কক্ষপথে চেষ্টা করে।

সম্পাদনা: যখন প্রভাব আসন্ন তখন হাইপারস্পেসে চলে যায়।

function OrbitBot_setup(team) {
  var botVars = {};

  botVars.color = team;
  return botVars;
}


function OrbitBot_getActions(gameInfo, botVars) {
  var actions = [];

  function getVar(name) {
    return gameInfo[botVars.color + "_" + name];
  }

  function getEnemyVar(name) {
    var eColor;
    if (botVars.color == 'blue') {
        eColor = 'red';
    } else {
        eColor = 'blue';
    }
    return gameInfo[eColor + "_" + name];
  }

  function distance(x1, y1, x2, y2) {
    return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
  }

  function toroidDistance(x1, y1, x2, y2) {
    dx = Math.abs(x1 - x2);
        while (dx > gameInfo.fieldWidth) {
        dx -= gameInfo.fieldWidth;
    }
    dx = Math.min(dx, gameInfo.fieldWidth - dx);
    dy = Math.abs(y1 - y2);
        while (dx > gameInfo.fieldHeight) {
        dx -= gameInfo.fieldHeight;
    }
    dy = Math.min(dy, gameInfo.fieldHeight - dy);
    return Math.sqrt(dx*dx+dy*dy);
  }

  function angleDistance(theta1, theta2) {
    var d = theta1 - theta2;
    while (d < 0 || d > Math.PI) {
      if (d < 0) {
        d += Math.PI * 2;
      }
      if (d > Math.PI * 2) {
        d -= Math.PI * 2;
      } else if (d > Math.PI) {
        d = Math.PI * 2 - d;
      }
    }
    return d;
  }

  function toRad(degrees) {
    return degrees / 180 * Math.PI;
  }

  function cap(x, y, limit) {
    var r = x*x+y*y;
    if (r < limit * limit) {
        r = Math.sqrt(r);
        x = x * r / limit;
      y = y * r / limit;
    }
    return [x,y];
  }

  var shape = getVar('shape');

  if (shape != 'nose only') {
    var broken = shape != 'full ship';
    var sunX = gameInfo.sun_x,
      sunY = gameInfo.sun_y,
      sunG = gameInfo.gravityStrength;

    function desirability(x, y, vx, vy) {     //Borrowed from a useless bot.
      var lowest = distance(x, y, sunX, sunY) - 5;
      var missiles = gameInfo.missiles;
      for (var i = 0; i < missiles.length; i++) {
        var mx = missiles[i].x + missiles[i].xv / 2;
        var my = missiles[i].y + missiles[i].yv / 2;
        lowest = Math.min(lowest, toroidDistance(x, y, mx, my) - distance(0, 0, missiles[i].xv, missiles[i].yv));
      }
      return lowest - 16;
    }

    var x = getVar("x"),
      y = getVar("y"),
      vx = getVar("xv"),
      vy = getVar("yv");

    function desirabilityByAcceleration(ax, ay) {//Borrowed from a useless bot.
        var x1 = x,
            y1 = y,
          vx1 = vx,
          vy1 = vy;
      var speed = distance(0,0,vx1,vy1);
      var limit = Math.max(gameInfo.speedLimit, speed);

      vx1 += ax;
      vy1 += ay;
      var temp = cap(vx1, vy1, limit);
      vx1 = temp[0];
      vy1 = temp[1];


      var dx = x1 - sunX;
      var dy = y1 - sunY;
      var dis = Math.sqrt(dx*dx+dy*dy);
      if (dis > 5){
        var force = sunG / (dis * dis);
      } else {
        var force = sunG /5;
      }
      vx1 -= force*dx/dis;
      vy1 -= force*dy/dis;

      var temp = cap(vx1, vy1, 40);
      vx1 = temp[0];
      vy1 = temp[1];

      x1 += vx1;
      y1 += vy1;

      return desirability(x1, y1, vx1, vy1);
    }

    var r = distance(sunX, sunY, x, y);
    var theta = Math.atan((y - sunY) / (x - sunX));

    var sunA = sunG/r/r,
            sunAx = -Math.cos(theta) * sunA,
        sunAy = -Math.sin(theta) * sunA;

    var dv = Math.sqrt(sunG / r);
    var dvx = -dv * Math.sin(theta);
    var dvy = dv * Math.cos(theta);
    if (distance(-dvx, -dvy, vx, vy) < distance(dvx, dvy, vx, vy)) {
      dvx = -dvx;
      dvy = -dvy;
    }

    var dax = dvx - vx;
    var day = dvy - vy;

    var dAngle = Math.atan(day / dax);
    if (dax < 0) {
        dAngle += Math.PI;
    }
    var cAngle = toRad(getVar('rot') - 90);
    var dLeft = angleDistance(cAngle - toRad(broken ? 2.5 : 5), dAngle);
    var dRight = angleDistance(cAngle + toRad(broken ? 2.5 : 5), dAngle);
    var dNeither = angleDistance(cAngle, dAngle);
    if (dLeft < dRight && dLeft < dNeither) {
      actions.push('turn left');
    } else if (dRight < dLeft && dRight < dNeither) {
      actions.push('turn right');
    }

    var cax = Math.cos(cAngle) * (broken ? .15 : .3);
    var cay = Math.sin(cAngle) * (broken ? .15 : .3);

    var ax = 0;
    var ay = 0;

    if (distance(cax, cay, dax, day) < distance(0, 0, dax, day)) {
      actions.push('fire engine');
      ax = cax;
      ay = cay;
    }

    if (desirabilityByAcceleration(ax, ay) <= 16) {
        actions.push('hyperspace');
    }

  }

  return actions;
}

আপনার বট যোগ করা হয়েছে।
কনর ও'ব্রায়েন

আপনার আপডেট এখন লাইভ!
এল'েন্ডিয়া স্টারম্যান

5

RighthandedSpasms

নামটি বেশ বর্ণনামূলক। চয়ন turn right0.5 সম্ভাব্যতা সঙ্গে, fire engine, 0.5 সম্ভাব্যতা এবং fire missile0.8 সম্ভাবনা থাকে। আশ্চর্যজনকভাবে মুশকিল, মূলত এটি সত্যই অনির্দেশ্য।

function RighthandedSpasms_setup(team) {
    var botVars = {};

    botVars["color"] = team;

    return botVars;
}

function RighthandedSpasms_getActions(gameInfo, botVars) {
    var actions = [];

    if (gameInfo[botVars["color"]+"_alive"]) {
        if (Math.random() > 0.5) { actions.push("turn right") }
        if (Math.random() > 0.5) { actions.push("fire engine") }
        if (Math.random() > 0.8) { actions.push("fire missile") }
    }

    return actions;
}

5

RandUmmm

এই চ্যালেঞ্জটির জন্য একটি এলোমেলো বট দরকার। গলফনেস জন্য বোনাস পয়েন্ট?

function RandUmmm_setup(t){
    function P(n,t,r,o,e,f,g){for(o=[e=1<<(f=n.length)];e;)for(t=e.toString(2),r=g=t.length,o[--e]=[];r;)~-t[--r]||o[e].push(n[r+f-g]);return o}var q=P(["fire missile","turn right","fire engine","turn left"]);q.pop();
    return {color:t,m:function(){return q[Math.random()*q.length|0]}};
}

function RandUmmm_getActions(g,b){
    return b.m();
}

কুল! (উপায় দ্বারা, আমার বট 13-7 জিতেছে নয়। দ্বারা অনেক, আমি 9-1 একবার হারিয়ে বিবেচনা করা, কিন্তু যে ক-এর অনেক 90 সেকেন্ড মোট পয়েন্ট 20 পয়েন্ট।!)
ev3commander

@ BlockCoder1392 এটা হল একটি র্যান্ডম বট;)
কোনোর ও'ব্রায়েন

4

প্রকৌশলী

বিপদে পড়লে হাইপারস্পেস ব্যবহার করতে পছন্দ করেন। এটি আসল শক্তি দেখতে আপনার ব্রাউজারের কনসোলটি খুলুন এবং টাইপ করুন overideHyperspace = 0;। আপনি যদি সেমিকোলনটি ভুলে যান তবে আপনি ক্রিসমাসের জন্য এএসআই পাবেন।

function Engineer_setup(t){
    return{c:t,C:"red0blue".split(0)[+(t=="red")]};
}

function Engineer_getActions(gameInfo,botVars){
    var actions = [];

    function d(x1,y1,x2,y2){return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))}
    function hS(g){return d(g.sun_x,g.sun_y,g[botVars.c+"_x"],g[botVars.c+"_y"])<50}
    function enemyDist(g){return d(g[botVars.c+"_x"],g[botVars.c+"_y"],g[botVars.C+"_x"],g[botVars.C+"_y"]);}

    function hSm(g){
        // get closest missile
        var r = (g.missiles||[{x:10000,y:10000}]).reduce(function(p,c){return Math.min(d(c.x,c.y,g[botVars.c+"_x"],g[botVars.c+"_y"]),p)},Infinity);
        return r<18;
    }
    function dF(g){
        var a = Math.degrees(Math.atan2(g[botVars.C+"_y"]-g[botVars.c+"_y"],g[botVars.C+"_x"]-g[botVars.c+"_x"]));
        var tP = (g[botVars.c+"_rot"]+360-a)%360;
        return [a,tP];
    }
    function lOr(g){
        var tP = dF(g)[1];
        return 90<tP&&tP<270?"turn left":"turn right";
    }
    function thrust(g){
        return Math.abs(dF(g)-g[botVars.c+"_rot"]);
    }

    // are we too close to the sun or a missile?
    if(hS(gameInfo)||hSm(gameInfo))actions.push("hyperspace");

    // should we fire?
    if(enemyDist(gameInfo)<200)actions.push("fire missile");

    // direction function
    actions.push(lOr(gameInfo,botVars));

    if(Math.random()<.7)actions.push("fire engine");
    return actions;
}

3

SprayAndPray

function SprayAndPray_setup(team) {
    var botVars = {};
    botVars["color"] = team;
    return botVars;
}

function SprayAndPray_getActions(gameInfo, botVars) {
    var actions = [];

    if (gameInfo[botVars["color"]+"_alive"]) {
        actions.push("turn left");
        if (Math.random() > 0.5) { actions.push("fire engine")};
       actions.push("fire missile");
    }

    return actions;
}

প্রতিটি দিকে বন্যভাবে আগুন লাগে। এটি খুব কার্যকর নয়!


এই বটটি এখন লাইভ!
এল'েন্ডিয়া স্টারম্যান

3

কামিকাযি

খুব প্রতিযোগিতামূলক নয় তবে আমি ভেবেছিলাম মজা হবে! শ্যুটিংয়ের সময় কেবল তার প্রতিপক্ষের দিকে সরাসরি উড়ে যায়।

function Kamikaze_setup(team) {
  var botVars = {};
  botVars["color"] = team;
  return botVars;
}

function Kamikaze_getActions(gameInfo, botVars) {
  var actions = [];

  // Get our ship's position
  var us, them, red = {
        rotation: gameInfo.red_rot,
        x: gameInfo.red_x,
        y: gameInfo.red_y,
        alive: gameInfo.blue_alive
      },
      blue = {
        rotation: gameInfo.blue_rot,
        x: gameInfo.blue_x,
        y: gameInfo.blue_y,
        alive: gameInfo.blue_alive
      };
  if(botVars.color == "red") {
    us = red;
    them = blue;
  }
  else if(botVars.color == "blue") {
    us = blue;
    them = red;
  }

  // Turn towards our opponent's position
  var angle = Math.degrees(Math.atan2(them.y - us.y, them.x- us.x)),
      rotationToOpponent = (us.rotation - angle + 360) % 360;
  if(rotationToOpponent > 90 && rotationToOpponent < 270) {
    actions.push("turn left");
  }
  else actions.push("turn right");

  actions.push("fire missile", "fire engine");

  return actions;
}

আপনার বট যোগ করা হয়েছে!
কনর ও'ব্রায়েন

OpponentDodger বিরুদ্ধে ভয়ানক ... PanicAttack দিয়ে বাঁধা ...
noɥʇʎԀʎzɐɹƆ

2

UhhIDKWhatToCallThisBot

শুধু এলোমেলো জিনিস।

function UhhIDKWhatToCallThisBot_setup(team) {
var botVars = {};
 botVars['t'] = 0;
botVars["color"] = team;
     return botVars;

}

function UhhIDKWhatToCallThisBot_getActions(gameInfo, botVars) {
    var actions = [];
    //when i need it: "turn left",
    //Use missiles sparingly!
    var WCID = [
    "fire engine",
     "turn right",
    "fire engine",
    "fire missile",
    "turn right",
    "fire engine"]

    if (gameInfo[botVars["color"]+"_alive"]) {
        botVars['t']++;
        actions.push(WCID[botVars[t]%(WCID.length)]);
    }
     return actions;
}

ক্রিপ্টিক গল্ফনেস কি?
noɥʇʎԀʎzɐɹƆ

2

OpponentDodger

আমার পক্ষ থেকে এখনই পান !!!

function OpponentDodger_setup(t){b={};b["c"]=t;b['o']=(t=="red")?"blue":"red";return b;}function OpponentDodger_getActions(g,b){a=[];o=b["c"];j={r:g[o+"_rot"],x:g[o+"_x"],y:g[o+"_y"]};o=b["o"];p={r:g[o+"_rot"],x:g[o+"_x"],y:g[o+"_y"]};l=Math.degrees(Math.atan2(p.y-j.y,p.x-j.x)),x=(j.r-l+360)%360;if(x > 90 && x < 270)a.push("turn right");else a.push("turn left");a.push("fire engine");return a;}  

কিছু কোডের জন্য ব্যবহারকারী 81655 কে ধন্যবাদ!


এই বটটি এখন লাইভ!
এল'েন্ডিয়া স্টারম্যান

2

গুপ্তচর

গল্পটি

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

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

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

বট

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

এটি আর্চ নেমেসিস হেলিওস। এটি মার্টিনির সাথে বিজোড় এবং দীর্ঘ আড্ডা।

এটি অন্য বট থেকে দূরে যখন একটি ক্ষেপণাস্ত্র এবং হাইপারস্পেসগুলি সূর্যের কাছাকাছি হয় তখন গুলি চালানোর 70% সুযোগ নিয়ে চলে আসে। এর মত সহজ. হাঁ।

সম্পাদনা করুন: আমি আমার বটকে নতুন কোড দিয়ে পরীক্ষা করেছি এবং এটি অন্য প্রতিটি বোটে ব্যর্থ হয়। আমি এটি ঠিক করতে কাজ করছি। আমি কেবল নিশ্চিত করেছি এটি কেবলমাত্র আমার নতুন বটের জন্য।

কোড

function Spy_setup(team) {
  // Typical setup. Nothing to see here. ;)
  var botVars = {};
  botVars["color"] = team;
  return botVars;
}


function Spy_getActions(gameInfo, botVars) {
    var actions = [];
    var us, them, red = {
            rotation: gameInfo.red_rot,
            x: gameInfo.red_x,
            y: gameInfo.red_y,
            alive: gameInfo.blue_alive
        },
        blue = {
            rotation: gameInfo.blue_rot,
            x: gameInfo.blue_x,
            y: gameInfo.blue_y,
            alive: gameInfo.blue_alive
        };
    if (botVars.color == "red") {
        us = red;
        them = blue;
    } else if (botVars.color == "blue") {
        us = blue;
        them = red;
    }

    function distance(x1, y1, x2, y2) {
        return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    }

    // Get our ship's position
    var rotation, x, y, opponentAlive;
    if (botVars.color == "red") {
        rotation = gameInfo.red_rot;
        x = gameInfo.red_x;
        y = gameInfo.red_y;
        opponentAlive = gameInfo.blue_alive;
    } else if (botVars.color == "blue") {
        rotation = gameInfo.blue_rot;
        x = gameInfo.blue_x;
        y = gameInfo.blue_y;
        opponentAlive = gameInfo.red_alive;
    }

    // Calculate our rotation compared to the sun in degrees
    var sunX = gameInfo.sun_x,
        sunY = gameInfo.sun_y,
        angle = Math.atan2(sunY - y, sunX - x) * 180 / Math.PI,
        rotationToSun = (rotation - angle + 360) % 360;

    // Check if we need to hyperspace to avoid the sun
    var rX = x - sunX,
        rY = y - sunY,
        distanceFromSun = Math.sqrt(rX * rX + rY * rY) - gameInfo.sun_r;
    if (distanceFromSun < 30) {
        actions.push("hyperspace");
        console.log("Command Module is Hyperspacing.")
    }
    if (gameInfo[botVars["color"] + "_alive"]) {
        var angle = Math.degrees(Math.atan2(them.y - us.y, them.x - us.x)),
            rotationToOpponent = (us.rotation - angle + 360) % 360;
        if (rotationToOpponent > 90 && rotationToOpponent < 270) {
            actions.push("turn right");
        } else {
            actions.push("turn left");
        };
        actions.push("fire engine");
        if (Math.random() > 0.3) {
            actions.push("fire missile")
        }

    }
    return actions;
}

বিবিধ

দ্রষ্টব্য: কোড সাফ করার সময় আমি হয়ত কিছু ভেঙে ফেলেছি কারণ কোড সাফ করার পরে আমি বট পরীক্ষা করিনি।

এটি আমার সমস্ত বটগুলির থেকেও অনেক ভাল - এটি হেলিওস (সম্পাদনা) , সেটকোর্স ফর 30 ডিগ্রি এবং অরবিটবট ব্যতীত অন্য প্রতিটি বটকে আসলে পরাজিত করে ! এটি সানআওয়েডারের সাথে সম্পর্কযুক্ত।

পার্শ্ব নোট: আমি জাভাস্ক্রিপ্টে ভয়াবহ, কেন জানি না।


@ এল'েন্দিয়া স্টারম্যান দয়া করে বটটিকে কিছুটা বিরতি দিন; আমাকে আমার বট ঠিক করতে হবে - পরিষ্কার করা সংস্করণটি অপরিষ্কার সংস্করণটির চেয়ে অনেক খারাপ।
noɥʇʎԀʎzɐɹƆ

ঠিক আছে, কখন তা স্থির হয় তা আমাকে জানান।
এল'েন্ডিয়া স্টারম্যান

@ এল'এন্ডিয়াস্টারম্যান আমি একটি কাজ করেছি এবং এটি আবার কাজ করে। ডিবাগিং, আপনি জানেন! (এখনও করা হয়নি)
no --zɐɹƆ

@ এল'এন্ডিয়াস্টারম্যান ... এবং এটি সম্পন্ন হয়েছে!
noɥʇʎԀʎzɐɹƆ

এই বটটি এখন লাইভ!
এল'েন্ডিয়া স্টারম্যান

1

AttackAndComeBack

ঘুরাঘুরির পরিবর্তে এটি শীর্ষে আসে এবং নীচে থেকে বের হয় (শীর্ষে ফিরে) খুব দ্রুত গুলি চালায়। সাধারণত সূর্য এড়ানো হয়।

function AttackAndComeBack_setup(team) {
    var botVars = {};
    botVars["color"] = team;
    return botVars;
}

function AttackAndComeBack_getActions(gameInfo, botVars) {
    var actions = [];
    actions.push("fire missile");
    if (Math.random()>0.4){actions.push("turn right");}
    else {actions.push("turn left");}
    actions.push("fire engine");
    return actions;
}

এই বটটি এখন লাইভ!
এল'েন্ডিয়া স্টারম্যান

1

পূর্ণ গতিতে এগিয়ে যাও

কখনও না ঘুরে সর্বদা ইঞ্জিন এবং ক্ষেপণাস্ত্র উভয়ই চালিত করে। কখনও কখনও রোদে আঘাত করার আগে আশ্চর্যরকম দীর্ঘস্থায়ী হয়।

function FullSpeedAhead_setup(team){
    return {color: team};
}

function FullSpeedAhead_getActions(gameInfo, botVars){
    var actions = [];

    if (gameInfo[botVars["color"]+"_alive"]) {
        actions.push("fire engine");
        actions.push("fire missile");
    }
    return actions;
}

যতটা খারাপ ভাবলাম ততটা খারাপ নয় ...
noɥʇʎԀʎzɐɹƆ

এই বটটি এখন লাইভ!
এল'েন্ডিয়া স্টারম্যান

1

PanicAttack

গুলি করার 50% সম্ভাবনা রয়েছে এবং বাম দিকে ঘুরানোর 80% সম্ভাবনা রয়েছে; তবে যদি এটি বাম দিকে না ফিরে, এটি ডানদিকে ঘুরবে। এটি ক্ষেপণাস্ত্রগুলি শেষ হয়ে যাওয়ার পরে অবশেষে সময় সূর্যের কারণে এটি বন্ধ করে দেবে।

সম্পাদনা: শত্রু বেঁচে থাকার সময় আগুন না দেওয়ার জন্য কিছু যুক্তি যুক্ত করেছে কারণ এটি তার নিজের ক্ষেপণাস্ত্র দ্বারা মারা যেতে পারে।

function PanicAttack_setup(team) {
    var botVars = {};
    botVars["color"] = team;
    return botVars;
}

function PanicAttack_getActions(gameInfo, botVars) {
    var actions = [];
    actions.push("fire engine");
    if(botVars.color == "red") {
        var opponentAlive = gameInfo.blue_alive;
    }
    else if(botVars.color == "blue") {
        var opponentAlive = gameInfo.red_alive;
    }

    if ((Math.random()>0.5)&&opponentAlive) {
        actions.push("fire missile");
    }

    if (Math.random()>0.2) {
        actions.push("turn left");
    } else {
        actions.push("turn right");
    }

    return actions;
}

এই বটটি এখন লাইভ!
এল'েন্ডিয়া স্টারম্যান

@ El'endiaStarman অনুগ্রহ করে এটি আবার আপডেট
noɥʇʎԀʎzɐɹƆ

আপনার আপডেট এখন লাইভ!
এল'েন্ডিয়া স্টারম্যান

1

DangitBobby

ববি হিল তার সম্পর্কে অন্যেরা কী ভাবছেন তা বিবেচ্য নয়-তিনি মাঠের চারপাশে অলসভাবে দুলতে বেশ কন্টেন্ট এবং "হুস্কি" কোবারার মতো আঘাতের আগে তার প্রতিপক্ষের বাষ্প থেকে বেরিয়ে যাওয়ার জন্য ধৈর্য সহকারে অপেক্ষা করেন।

function DangitBobby_setup(team) {
    var botVars = {};
    botVars["color"] = team;
    if (team == 'red'){
        botVars['them'] = "blue";
    }
    else{
        botVars['them'] = 'red';
    }
    return botVars;
}

function DangitBobby_getActions(gameInfo, botVars) {
    var actions = [];
    if (gameInfo[botVars["color"]+"_alive"]) {
        actions.push('turn right');
        actions.push('fire engine');
        if (gameInfo[botVars['them']+'_missileStock'] == 0){
                actions.push('fire missile');
        }

    }
}

"এটাই আমার পবিত্র! আমি আপনাকে জানতাম না!"


এই বটটি এখন লাইভ!
এল'েন্দিয়া স্টারম্যান

1

স্নাইপার

আমি তার শত্রুদের ছিনতাই করে এমন একটি স্নিপার বট তৈরি করার জন্য ভবিষ্যদ্বাণী নিয়ে কিছুক্ষণ খেলছি। আমার জাভাস্ক্রিপ্ট উত্তরের সাথে মানানসই আকারের তাই এখানে একটি লিঙ্ক, বট_স্নিপার


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

পরের বার, আপনি কোডের জন্য ডিজাইন করা [GitHub Gists] (gist.github.com) এর মতো একটি পরিষেবাতে এটি পোস্ট করা উচিত।
noɥʇʎԀʎzɐɹƆ

আপনার কোডটি অপ্টিমাইজ করার চেষ্টা করুন; আমি বাজি ধরছি এটি কতটা দীর্ঘ তা বিবেচনা করে এটি সত্যিই ভাল বট। আপনি কিছু পরিবর্তনশীল বা ফাংশন inling চেষ্টা করতে পারেন।
noɥʇʎԀʎzɐɹƆ

আপনার কিছু ডুপ্লিকেট কোডও রয়েছে - আমার কাছে মনে হয় আপনি আপনার বট পোস্ট করা থেকে স্ট্যাক এক্সচেঞ্জে কোড পর্যালোচনাতে পোস্ট করতে পারবেন ।
noɥʇʎԀʎzɐɹƆ

আপনি বাইরের সুযোগে অ্যাকশনগুলিতে () সন্নিবেশিত ফাংশনগুলিও সংজ্ঞায়িত করতে পারেন, সুতরাং যখন আপনি অ্যাকশনগুলি চালাবেন তখন প্রতিবেদককে এটি পুনরায় বিতরণ করতে হবে না ()। আপনার কোডটি দ্রুত করার জন্য আপনার প্রোফাইলের চেষ্টা করা উচিত।
noɥʇʎԀʎzɐɹƆ

1

SmartArrow

তীরের মতো, তবে স্মার্ট

function SmartArrow_setup(team) {
    var botVars = {};
    botVars['mpref'] = team + '_';
    botVars['epref'] = team == 'red' ? 'blue_' : 'red_';
    botVars['ecolor'] = team == 'red' ? 'blue' : 'red';
    return botVars;
}

function SmartArrow_getActions(gameInfo, botVars) {
    var actions = [];
    var x = gameInfo[botVars['mpref'] + 'x'],
        y = gameInfo[botVars['mpref'] + 'y'],
        rot = gameInfo[botVars['mpref'] + 'rot']; // SmartArrow position and rotation
    var ex = gameInfo[botVars['epref'] + 'x'],
        ey = gameInfo[botVars['epref'] + 'y']; // Enemy position
    var sunx = gameInfo.sun_x,
        suny = gameInfo.sun_y; // Sun position
    var Dsunx = Math.abs(x - sunx),
        Dsuny = Math.abs(y - suny); // Sun position delta
    var dex = Math.abs(x - ex),
        dey = Math.abs(y - ey); // Enemy position delta
    var sangle = Math.degrees(Math.atan2(suny - y, sunx - x)),
        snrot = (rot - sangle + 360) % 360;
    if (Dsunx < 40 && Dsuny < 40) // If SmartArrow is too close from sun, hyperspace !
        return ['hyperspace'];
    var missiles = gameInfo.missiles;
    for (var i = 0; i < missiles.length; i++) { // Avoid all these silly missiles
        var dx = Math.abs(x - missiles[i].x),
            dy = Math.abs(y - missiles[i].y);
        if (dx < 10 && dy < 10)
            return ['hyperspace'];
    }
    if (gameInfo[botVars['epref'] + 'alive']) { // If his enemy is alive, SmartArrow try to kill him (logic)
        var angle = Math.degrees(Math.atan2(ey - y, ex - x)),
            nrot = (rot - angle + 360) % 360;
        if (nrot > 90 && nrot < 270)
            actions.push('turn left');
        else
            actions.push('turn right');
        if (nrot > 80 && nrot < 100
         && Math.random() > 0.5) actions.push('fire missile'); // If SmartArrow is in a good spot, shot this silly oponnent
        if (Math.random() > 0.5) actions.push('fire engine');
    }
    else { // Simply (try to) act like SunAvoider if his enemy is dead
        if (snrot > 90 && snrot < 270)
            actions.push('turn right');
        else
            actions.push('turn left');
        if (Dsunx < 300 && Dsuny < 300)
            actions.push('fire engine');
        if (dex < 40 && dey < 40)
            actions.push('hyperspace'); // Dying on the corpse of his opponent is dumb.
    }
    return actions;
}

এই বটটি এখন লাইভ!
এল'েন্ডিয়া স্টারম্যান

1

Kamikaze-

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

এল'েন্দিয়া: কখনও কখনও একাধিক ব্যবহারকারীর সংযোগ বিবেচনা করা হয়;)

function KamikazePlus_setup(team) {
  // Typical setup. Nothing to see here. ;)
  var botVars = {};
  botVars["color"] = team;
  return botVars;
}


function KamikazePlus_getActions(gameInfo, botVars) {
    var actions = [];
    var us, them, red = {
            rotation: gameInfo.red_rot,
            x: gameInfo.red_x,
            y: gameInfo.red_y,
            alive: gameInfo.blue_alive
        },
        blue = {
            rotation: gameInfo.blue_rot,
            x: gameInfo.blue_x,
            y: gameInfo.blue_y,
            alive: gameInfo.blue_alive
        };
    if (botVars.color == "red") {
        us = red;
        them = blue;
    } else if (botVars.color == "blue") {
        us = blue;
        them = red;
    }

    function distance(x1, y1, x2, y2) {
        return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    }

    // Get our ship's position
    var rotation, x, y, opponentAlive;
    if (botVars.color == "red") {
        rotation = gameInfo.red_rot;
        x = gameInfo.red_x;
        y = gameInfo.red_y;
        opponentAlive = gameInfo.blue_alive;
    } else if (botVars.color == "blue") {
        rotation = gameInfo.blue_rot;
        x = gameInfo.blue_x;
        y = gameInfo.blue_y;
        opponentAlive = gameInfo.red_alive;
    }

    // Calculate our rotation compared to the sun in degrees
    var sunX = gameInfo.sun_x,
        sunY = gameInfo.sun_y,
        angle = Math.atan2(sunY - y, sunX - x) * 180 / Math.PI,
        rotationToSun = (rotation - angle + 360) % 360;

    // Check if we need to hyperspace to avoid the sun
    var rX = x - sunX,
        rY = y - sunY,
        distanceFromSun = Math.sqrt(rX * rX + rY * rY) - gameInfo.sun_r;
    if (distanceFromSun < 30) {
        actions.push("hyperspace");
        console.log("Command Module is Hyperspacing.")
    }
    if (gameInfo[botVars["color"] + "_alive"]) {
        var angle = Math.degrees(Math.atan2(them.y - us.y, them.x - us.x)),
            rotationToOpponent = (us.rotation - angle + 360) % 360;
        if (rotationToOpponent > 90 && rotationToOpponent < 270) {
            actions.push("turn left");
        } else {
            actions.push("turn right");
        };
        actions.push("fire engine");
    }
    return actions;
}

সবেমাত্র কামিকাজে + এর কোড নিয়েছে এবং ক্ষেপণাস্ত্রের গুলি চালানোর অংশ থেকে মুক্তি পেয়েছি।


আমরা ইতিমধ্যে এই বটটি যুক্ত করব না কারণ ইতিমধ্যে আমাদের কাছে আরও একটি কামিকাজে বট ছিল, এবং আমি বরং তিনটি কামিকাজে বট না পেতাম । এ ছাড়া, এই দুটি অপর দুটির চেয়ে বেশি তুচ্ছ।
এল'েন্ডিয়া স্টারম্যান

@ এল'এন্ডিয়া স্টারম্যান তখন আমি একাধিক ব্যবহারকারীর জন্য অনুরোধ করছি - দ্বিতীয়টির কোড ক্ষেত্রটি কোনও ডিফল্ট লুকানো
প্রসারণযোগ্য

0

MissilesPlusScore

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

function MissilesPlusScore__setup(team) {
var botVars = {};
botVars["color"] = team;
return botVars;
}
function MissilesPlusScore_getActions(gameInfo, botVars) {
var actions = [];
var moves=["fire missile","hyperspace","turn right","turn left","fire engine","fire missile","turn right","hyperspace","turn left","fire missile","hyperspace","turn right","turn left","hyperspace","fire engine","fire missile","turn right","turn left","hyperspace","fire missile","turn right","turn left","fire engine","hyperspace","fire missile","turn right","turn left","hyperspace"];
if(gameInfo[botVars["color"]+"_alive"]){
var num=gameInfo["redScore"]-gameInfo["blueScore"];
if(num<0){num=num*-1;}
if(num===0){actions.push(moves[Math.round(Math.random()*4)]);}
else{
actions.push(moves[num+gameInfo["numMissiles"]]);
}
}
    return actions;
}

অধি

হাইপারস্পেস শান্ত! !!!!!!!!!!!!!!!!

function HYPER_setup(team){var botVars={};botVars["color"]=team;return botVars}function HYPER_getActions(gameInfo,botVars){var actions=[];if(gameInfo[botVars["color"]+"_alive"]){actions.push(["fire engine","fire missile","hyperspace"][Math.round(Math.random()*2)])};return actions}

CoordinateInfluence

স্থানাঙ্কগুলি অবাক করা, আশ্চর্যজনকভাবে কার্যকর:

function CoordinateInfluence_setup(team) {
var botVars = {};
botVars["color"] = team;
return botVars;
}
function CoordinateInfluence_getActions(gameInfo, botVars) {
var actions = [];
if (gameInfo[botVars["color"]+"_alive"]) {
if(gameInfo["blue_x"]>gameInfo["red_x"]){
if(gameInfo["blue_y"]<gameInfo["red_y"]){actions.push("turn right");}
else{actions.push("fire engine");}
}
else if(gameInfo["blue_y"]<gameInfo["red_y"]){
if(gameInfo["blue_x"]>gameInfo["red_x"]){actions.push("turn left");}
else{actions.push("fire missile");}
}
else{actions.push("hyperspace");}
}
return actions;
}

এই দুটি বটই লাইভ।
এল'েন্ডিয়া স্টারম্যান

পরিবর্তে আপনার একাধিক উত্তর পোস্ট করা উচিত।
noɥʇʎԀʎzɐɹƆ

আপনি যদি কখনও অন্য বট যোগ করেন তবে দয়া করে আমাকে পিং করুন যাতে আমি জানি যে আপনি করেছেন। আপনার তৃতীয় বটটি এখন লাইভ।
এল'েন্ডিয়া স্টারম্যান

0

SetCourseFor30Degrees

অধিনায়ক কেন 30 ডিগ্রি কোর্সটিতে জাহাজটি স্থাপনের জন্য এতটা আগ্রাসী, তবে হেই, ন্যূনতম ইঙ্গিত হিসাবে, আপনি কে প্রশ্ন করবেন? কমপক্ষে আপনাকে রোদ এড়ানোর অনুমতি দেওয়া হয়েছে! এবং আপনাকে ক্ষেপণাস্ত্র গুলি চালানোর অনুমতি দেওয়া হয়েছে ... কেবল তাদের লক্ষ্য করার অনুমতি নেই ...

function SetCourseFor30Degrees_setup(team) 
{
  var botVars = {};
  botVars["color"] = team;
  return botVars;
}


function SetCourseFor30Degrees_getActions(gameInfo, botVars)
{
var actions = [];
var ang1 = gameInfo[botVars["color"]+"_rot"]+0;
var fireChance=0.95;
// sun avoidance
   var x = gameInfo[botVars["color"]+"_x"];
   var y = gameInfo[botVars["color"]+"_y"];
   var sunX = gameInfo["sun_x"]+0;
   var sunY = gameInfo["sun_y"]+0;
  var dx = sunX- x;
   var dy = sunY - y;
var shortRangeAvoidanceDistance = (dx * dx + dy * dy ) ;

 x = gameInfo[botVars["color"]+"_x"]+gameInfo[botVars["color"]+"_xv"]*10;
 y = gameInfo[botVars["color"]+"_y"]+gameInfo[botVars["color"]+"_yv"]*10;
 dx = sunX- x;
 dy = sunY - y;

var longRangeAvoidanceDistance = (dx * dx + dy * dy ) ;


var vel = Math.sqrt(gameInfo[botVars["color"]+"_xv"]*gameInfo[botVars["color"]+"_xv"]+
gameInfo[botVars["color"]+"_yv"]*gameInfo[botVars["color"]+"_yv"]);

var close=vel*1.5;

if (shortRangeAvoidanceDistance <= close* close)
{
  actions.push("hyperspace");
}
else
{
   if (longRangeAvoidanceDistance <= 200*200)
   {

     x = x+Math.cos((ang1-5)*Math.PI/180)*vel ;
     y = y+Math.sin((ang1-5)*Math.PI/180)*vel ;
     dx = sunX- x;
     dy = sunY - y;
     if (( dx * dx + dy * dy ) > longRangeAvoidanceDistance  )
     {
       actions.push("turn right")
     }
     else
     {
        actions.push("turn left")
     }
  }
  else
  {
    var course = botVars["color"]=="red"?30:-30;
    if (ang1>course ) {actions.push("turn left")}
    if (ang1<course ) {actions.push("turn right")}
  }
  if (Math.random() > fireChance){ actions.push("fire missile") }
  actions.push("fire engine")
}
return actions;
}

এই বটটি এখন লাইভ!
এল'েন্ডিয়া স্টারম্যান

0

তীর

যখন বিপদ ও অলস অবস্থায় থাকে তখন তার শত্রু মারা গেলে কেবল তার শত্রু, হাইপারস্পেসকে তাড়া করুন।

function Arrow_setup(team) {
    var botVars = {};
    botVars['mpref'] = team + '_';
    botVars['epref'] = team == 'red' ? 'blue_' : 'red_';
    return botVars;
}

function Arrow_getActions(gameInfo, botVars) {
    var actions = [];
    var x = gameInfo[botVars['mpref'] + 'x'],
        y = gameInfo[botVars['mpref'] + 'y'],
        rot = gameInfo[botVars['mpref'] + 'rot']; // My position and rotation
    var ex = gameInfo[botVars['epref'] + 'x'],
        ey = gameInfo[botVars['epref'] + 'y']; // Enemy position
    var Dsunx = Math.abs(x - gameInfo.sun_x);
    var Dsuny = Math.abs(y - gameInfo.sun_y);
    if (Dsunx < 30 && Dsuny < 30) // If Arrow is too close from sun, hyperspace !
        return ['hyperspace'];
    var missiles = gameInfo.missiles;
    for (var i = 0; i < missiles.length; i++) {
        var dx = Math.abs(x - missiles[i].x);
        var dy = Math.abs(y - missiles[i].y);
        if (dx < 10 && dy < 10)
            return ['hyperspace'];
    }
    if (gameInfo[botVars['epref'] + 'alive']) {
        var angle = Math.degrees(Math.atan2(ey - y, ex - x)),
            nrot = (rot - angle + 360) % 360;
        if (nrot > 90 && nrot < 270)
            actions.push('turn left');
        else
            actions.push('turn right');
        if (Math.random() > 0.5) actions.push('fire missile');
    }
    if (Math.random() > 0.5) actions.push('fire engine');
    return actions;
}

এই বটটি এখন লাইভ!
এল'েন্ডিয়া স্টারম্যান

@ এল'এন্ডিয়াস্টারম্যান আমি বট আপডেট করেছি
টাকসক্রাফটিং

আপডেটটি এখন লাইভ! যদিও একের বেশি নয়। : পি
এল'েন্ডিয়া স্টারম্যান

0

কামিকাযি + +

প্রতিযোগিতামূলক হতে ডিজাইন করা হয়নি। শুধুই মজার জন্য. প্রযুক্তিগতভাবে, এটি স্পাইয়ের বিপরীতে কাজ করে: প্লেয়ারকে তাড়া করে, হাইপারস্পেস যখন সূর্যের কাছাকাছি থাকে, আগুনের ক্ষেপণাস্ত্র 70% সময়% আমি কেবল দেখতে চাই কামিকাজেপ্লাস স্পাই এবং স্পাইয়ের তাড়া করে পাগলের মতো ছুটে চলেছে।

function KamikazePlus_setup(team) {
  // Typical setup. Nothing to see here. ;)
  var botVars = {};
  botVars["color"] = team;
  return botVars;
}


function KamikazePlus_getActions(gameInfo, botVars) {
    var actions = [];
    var us, them, red = {
            rotation: gameInfo.red_rot,
            x: gameInfo.red_x,
            y: gameInfo.red_y,
            alive: gameInfo.blue_alive
        },
        blue = {
            rotation: gameInfo.blue_rot,
            x: gameInfo.blue_x,
            y: gameInfo.blue_y,
            alive: gameInfo.blue_alive
        };
    if (botVars.color == "red") {
        us = red;
        them = blue;
    } else if (botVars.color == "blue") {
        us = blue;
        them = red;
    }

    function distance(x1, y1, x2, y2) {
        return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    }

    // Get our ship's position
    var rotation, x, y, opponentAlive;
    if (botVars.color == "red") {
        rotation = gameInfo.red_rot;
        x = gameInfo.red_x;
        y = gameInfo.red_y;
        opponentAlive = gameInfo.blue_alive;
    } else if (botVars.color == "blue") {
        rotation = gameInfo.blue_rot;
        x = gameInfo.blue_x;
        y = gameInfo.blue_y;
        opponentAlive = gameInfo.red_alive;
    }

    // Calculate our rotation compared to the sun in degrees
    var sunX = gameInfo.sun_x,
        sunY = gameInfo.sun_y,
        angle = Math.atan2(sunY - y, sunX - x) * 180 / Math.PI,
        rotationToSun = (rotation - angle + 360) % 360;

    // Check if we need to hyperspace to avoid the sun
    var rX = x - sunX,
        rY = y - sunY,
        distanceFromSun = Math.sqrt(rX * rX + rY * rY) - gameInfo.sun_r;
    if (distanceFromSun < 30) {
        actions.push("hyperspace");
        console.log("Command Module is Hyperspacing.")
    }
    if (gameInfo[botVars["color"] + "_alive"]) {
        var angle = Math.degrees(Math.atan2(them.y - us.y, them.x - us.x)),
            rotationToOpponent = (us.rotation - angle + 360) % 360;
        if (rotationToOpponent > 90 && rotationToOpponent < 270) {
            actions.push("turn left");
        } else {
            actions.push("turn right");
        };
        actions.push("fire engine");
        if (Math.random() > 0.3) {
            actions.push("fire missile")
        }

    }
    return actions;
}

মূলত সবে স্পাইয়ের কোডটি নিয়েছে এবং "বাম" এবং "ডানদিকে" উল্টে গেছে।


এই বটটি এখন লাইভ! এবং হ্যাঁ, কামিকাজেপ্লাস চ্যাট স্পাই দেখতে মজাদার। : পি
এল'েন্ডিয়া স্টারম্যান

@ এল'এন্ডিয়াস্টারম্যান আমি কামিকাজেপ্লাসকে কোনও বুলেট ছাড়াই লড়াই করে দেখলে মজা পাই overideHyperspace = 0;; যখন তারা একে অপরের দিকে যাওয়ার চেষ্টা করে তখন তারা নিখোঁজ থাকে।
noɥʇʎԀʎzɐɹƆ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.