पहाड़ी के राजा - स्पेसवार!


64

यदि आप कभी Spacewar खेला है ! , तुम्हें पता है कि यह एक मजेदार खेल था। यदि आप नहीं जानते हैं, तो यह पता है: यह (और है) बहुत पहले और सबसे महत्वपूर्ण कंप्यूटर गेम में से एक है। और यह अभी भी मजेदार है! मैं जिस क्लोन पर बड़ा हुआ हूं वह यह एक है , जो कि जाहिरा तौर पर और दुर्भाग्य से, केवल विंडोज है। तो मैंने इसे फिर से बनाया!

कोट को यहां होस्ट किया गया है: पीपीसीजी - स्पेसवार! पहाड़ी का राजामैं आपको एक इंसान के रूप में खेलने के लिए प्रोत्साहित करता हूं कि कम से कम एक अन्य बॉट के खिलाफ खेल कैसे काम करता है।

खेल

  • एक फ्रेम 30 मिलीसेकंड है (इस प्रकार, लगभग 33 फ्रेम प्रति सेकंड)।
  • यह क्षेत्र 800 पिक्सेल चौड़ा और 600 पिक्सेल लंबा है।
  • क्षेत्र टॉरॉयडल है, जिसका अर्थ है कि स्पेसशिप और मिसाइल जो मैदान के बाहर जाती हैं, विपरीत दिशा में फिर से दिखाई देती हैं।
  • लाल और नीले दो स्पेसशिप हैं।
    • Red को x = 50 पर और यादृच्छिक y को 50, (फ़ील्ड ऊँचाई - 50) पिक्सेल के बीच स्थित किया गया है।
    • ब्लू को x = (फ़ील्ड की चौड़ाई - 50) और यादृच्छिक y के बीच 50, (फ़ील्ड की ऊँचाई - 50) पिक्सेल पर स्थित किया जाता है।
    • दोनों का सामना x = (क्षेत्र की चौड़ाई) / 2 है।
  • उपलब्ध नियंत्रण हैं:
    • बाएं मुड़ें - फ्रेम प्रति वामावर्त 5 डिग्री।
    • दाएँ मुड़ें - फ्रेम प्रति 5 डिग्री दक्षिणावर्त।
    • अग्नि मिसाइल - जहाज के वेग के अलावा प्रति फ्रेम अतिरिक्त 10 पिक्सल पर यात्रा करती है, जिस दिशा में जहाज इशारा कर रहा था।
    • फायर इंजन - जिस स्पेसशिप की ओर इशारा किया जा रहा है उस दिशा में प्रति फ्रेम 0.30 पिक्सल पर स्पेसशिप को तेज करता है।
    • हाइपरस्पेस कूद - क्षेत्र में कुछ यादृच्छिक निर्देशांक को टेलीपोर्ट करता है, जिसमें विस्फोट का 25% मौका होता है। ये यादृच्छिक निर्देशांक सूरज के ऊपर हो सकते हैं।
  • गुरुत्वाकर्षण शक्ति को बढ़ाने पर जहाजों की अधिकतम गति इंजन शक्ति के तहत प्रति फ्रेम 15 पिक्सेल और फ्रेम प्रति 40 पिक्सेल है।
    • प्रति फ्रेम 15 पिक्सेल से अधिक तेज़ गति से यात्रा करने पर इंजन जोर केवल दिशा बदल सकता है या धीमा हो सकता है।
  • मिसाइलों के बारे में:
    • मिसाइल एक सीधी रेखा में यात्रा करते हैं।
    • मिसाइलों को अधिकतम प्रति 1 सेकंड 0.1 सेकंड में दागा जा सकता है।
    • मिसाइलों का जीवनकाल 2.25 सेकंड है।
    • जहाजों में प्रत्येक में अधिकतम 20 मिसाइलें होती हैं।
    • मिसाइल आंतरिक रूप से बिंदु कण हैं।
  • बहुत केंद्र में एक सूरज है जो आपके जहाज के लिए बेहद खतरनाक है। थोड़ी सी भी संपर्क घातक है। यह सूरज मिसाइलों को भी नष्ट कर देता है।
  • सूर्य में गुरुत्वाकर्षण है। परिणामी त्वरण 5000 / (दूरी ^ 2) पिक्सेल / फ्रेम ^ 2 है, जहां दूरी पिक्सल में है। स्पेसशिप और मिसाइल प्रभावित होते हैं।
  • दोनों जहाजों में तीन स्ट्राइक जोन होते हैं: नाक, बाईं विंग और राइट विंग।
    • नाक पर एक चोट तत्काल मृत्यु है।
    • दोनों तरफ से एक हिट स्पेसशिप की टर्न रेट और इंजन त्वरण को आधे से कम कर देता है।
    • यदि दोनों पंखों को नष्ट कर दिया जाता है, तो अंतरिक्ष यान को पैंतरेबाज़ी नहीं की जा सकती है और केवल अग्नि मिसाइलें ही दागी जा सकती हैं।
  • जहाज आपस में टकरा सकते हैं।
    • नाक-नाक का प्रभाव दोनों जहाजों के लिए घातक है।
    • एक नाक-विंग प्रभाव विंग को नष्ट कर देता है।
    • विंग-विंग प्रभाव दोनों पंखों को नष्ट कर देता है।
  • मृत जहाज ठोस और जमे हुए हैं जब तक कि वे 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)। इसके अलावा पेज नीचे, वहाँ के लिए textareas मौजूद userbot है, जो आप अपने कोड का परीक्षण करने के लिए संपादित कर सकते हैं।

<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]अनुपातों की एक जोड़ी है जो व्यक्त करते हैं कि प्रत्येक रेखा चौराहे बिंदु के साथ कितनी दूर है। जैसा कि, 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],...]। बहुभुज स्पष्ट रूप से बंद हैं, इसलिए पहले और अंतिम समन्वय जोड़े के बीच एक रेखा है।

आप गेम / वेबसाइट द्वारा उपयोग किए जाने वाले किसी भी अन्य चर या फ़ंक्शन को एक्सेस या बदल नहीं सकते हैं। और निश्चित रूप से अपने कार्यों को एक ही नाम न दें। मैं नहीं सोचता कि यह एक समस्या होगी, लेकिन यदि आपका बॉट गेम कोड को तोड़ता है, तो यह एक संभावना है। अपवादों की कोई लॉगिंग या पकड़ नहीं है।

जीतना

  • बॉट की प्रत्येक जोड़ी को कम से कम 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 मुझे परेशान करता है, इसलिए मैं स्कोरिंग पद्धति को बेहतर तरीके से जोड़ सकता हूं कि वे कैसे रैंक की जानी चाहिए।

(माध्य और मानक विचलन को तीन दशमलव अंकों के लिए गोल किया गया था। इसके अलावा, Hyperहोना चाहिए HYPERलेकिन यह हाइलाइटिंग को गड़बड़ करता है।:)


कोई भी स्कोर? ....
ev3commander

क्या यह अपवादों को पकड़ लेता है?
TheNumberOne

1
आपको यह निर्दिष्ट करना चाहिए कि LineIntersectionगैर-अंतर-खंड खंडों पर कॉल करना एक खाली सरणी देता है।
लेजियन मम्मल 978

1
मुझे लगता है कि मैंने यह किया!
ev3commander

3
@CrazyPython: मैं पहले दो विवादों पर विचार करूंगा कि मैंने मूल रूप से एक गेम की नकल की है, लेकिन तीसरा वही है जो मैं चाहता था। धन्यवाद! : डी
एल'एंडिया स्ट्रैटन

जवाबों:


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
मुझे लगता है कि यह मेरे अब तक के पसंदीदा बॉट में से एक है। यह आश्चर्यजनक रूप से अच्छा है!
एल'एंडिया स्ट्रोमैन

@ El'endiaStarman मैंने बॉट के लिए कुछ अपडेट किए।
स्लिफ़र

आपका अपडेट अब लाइव है!
एल'एंडिया स्ट्रैटन

यह OrbitBot के खिलाफ बहुत अच्छी तरह से काम करता है :)
TheNumberOne

1
@Soaku मुझे लगता है कि इस बॉट और दूसरों के बीच मुख्य अंतर यह है, कि यह बॉट शूटिंग से पहले अपने प्रतिद्वंद्वी को निशाना बनाता है।
स्लेफ़र

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 missileसाथ और 0.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

स्प्रे और प्रार्थना

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;
}

आपका बॉट जोड़ दिया गया है!
कॉनर ओ'ब्रायन

ओपोनिटोडर्गर के खिलाफ भयानक ... आतंकियों से बंधे ...
noɐɹƆz Opp

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;}  

कुछ कोड के लिए user81655 का धन्यवाद!


यह बॉट अब लाइव है!
एल'एंडिया स्ट्रोमैन

2

जासूस

कहानी

इस बॉट का प्रोटोटाइप एक बॉट था जिसमें दो मोड थे: पागल मोड और सामान्य मोड। जब यह पागल मोड में था, तो यह लगातार टिक की संख्या के लिए वहां रहा। पागल मोड में प्रवेश करने की एक संभावित संभावना थी। जब यह सूर्य के करीब था, तब यह सम्मोहित भी हुआ। पागल मोड में, इसने दूसरे बॉट को निशाना बनाया और लगातार फायर किया। सामान्य मोड में, यह फायरिंग नहीं, अन्य बॉट से दूर उड़ गया।

मैंने उस प्रोटोटाइप को ट्विक किया ताकि यह पागल मोड में होगा अगर और केवल अगर दुश्मन काफी करीब था। तब मेरे पास एक पागल विचार था: क्या होगा यदि यह केवल पागल मोड में रहता है? कुछ प्रयोग के बाद (मैंने बॉट की आग को बेतरतीब ढंग से बनाते हुए जोड़ दिया जब यह सामान्य मोड में था) मैंने पाया कि मुझे हर बॉट, लेकिन हेलियोस में नई बीट मिली। यह इस प्रक्रिया के अंत में मेरी कोड है, लेकिन सफाई से पहले।

मैंने अपना पूरा बॉट KotH textarea या JS ब्यूटिफायर में लिखा था। (मैंने सफाई करते समय एटम संपादक का संक्षिप्त उपयोग किया था - लेकिन कोड की दो पंक्तियों की तरह)

बॉट

इस बॉट में अन्य बॉट्स से लिया गया बहुत सारा कोड है। यह कोडिकेके से कोड को दूसरे बॉट से भागने के बजाय दूसरे बॉट से भागता है और जब यह सूर्य के करीब होता है तो हाइपरस्पेसिंग के लिए एजकैसे से कोड लेता है।

यह आर्क नेमसिस हेलिओस है। यह एक अजीब और एक मार्टिनी के साथ लंबी चैट हो रही है।

यह सूर्य के करीब होने पर एक मिसाइल और हाइपरस्पेस को फायर करने के 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 डेज्री और ऑर्बिटबॉट को छोड़कर हर दूसरे बॉट को हरा देता है! यह SunAvoider के साथ संबंध रखता है।

साइड नोट: मैं जावास्क्रिप्ट में भयानक हूँ, पता नहीं क्यों।


@ El'endiaStarman कृपया बॉट को लाइव ठहराव पर रखें; मुझे अपने बॉट को ठीक करने की आवश्यकता है - साफ किया गया संस्करण अशुद्ध संस्करण की तुलना में बहुत खराब है।
no --z।

ठीक है, मुझे पता है जब यह तय हो गया है।
एलेंडिया स्ट्राटन जुआन

@ El'endiaStarman मैंने एक काम किया और फिर इसने फिर से काम किया। डिबगिंग, तुम्हें पता है! (अभी तक नहीं किया गया)
noɥʇʎԀʎzɐɹƆ

@ El'endiaStarman ... और यह हो गया!
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 bad

यह बॉट अब लाइव है!
एलेंडिया स्ट्रोमैन

1

आतंकी हमले

गोलीबारी का 50% मौका है, और बाएं मुड़ने का 80% मौका है; लेकिन अगर यह बाएं नहीं मुड़ता है, तो यह दाईं ओर मुड़ जाएगा। यह मिसाइलों से बाहर निकलने के बाद, समय अंततः सूरज के कारण इसे रोक देगा।

EDIT: दुश्मन के जीवित होने पर फायर न करने के लिए कुछ तर्क जोड़े क्योंकि यह अपनी ही मिसाइलों से मार सकता है।

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

निशानची

मैं थोड़ा सा एक स्नाइपर बॉट बनाने के लिए भविष्यवाणी के साथ खेल रहा हूं जो अपने दुश्मनों को मारता है। मेरी जावास्क्रिप्ट बहुत बड़ी है कि एक उत्तर में फिट होने के लिए यहाँ एक लिंक है, bot_Sniper


अंत में यह बॉट परीक्षण करने के लिए चारों ओर हो गया, और दुर्भाग्य से, यह वास्तव में खेल को धीमा कर देता है। यह काफी तड़का हुआ है, इसलिए आपको अपने कोड को किसी तरह तेज करने की आवश्यकता है।
एल'एंडिया स्ट्रोमैन

अगली बार, आपको इसे [GitHub Gists] (gist.github.com) की सेवा में पोस्ट करना चाहिए जिसे कोड के लिए डिज़ाइन किया गया है।
no --zɐɹƆ

अपने कोड को अनुकूलित करने का प्रयास करें; मुझे यकीन है कि यह वास्तव में अच्छा बॉट है, यह देखते हुए कि यह कितना लंबा है। आप कुछ चर या कार्यों को ट्राई कर सकते हैं।
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-

इसके अलावा प्रतिस्पर्धी नहीं बनाया गया है। सिर्फ मनोरंजन के लिए। यह सूर्य के करीब होने पर हाइपरस्पेस करता है और गोलियां चलाए बिना खिलाड़ी का पीछा करता है। इस बॉट को जासूसी के एक निहत्थे संस्करण का पीछा करते हुए देखना मजेदार है, लेकिन दुर्भाग्य से आपके पास एक से अधिक उपयोगकर्ता नाम नहीं हो सकते।

El'endia: कभी एक से अधिक उपयोगकर्ता नाम जोड़ने पर विचार किया;)

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;
}

बस कामिकेज़ + का कोड ले लिया और मिसाइल फायरिंग वाले हिस्से से छुटकारा पा लिया।


मैं शायद इस बॉट को नहीं जोड़ूंगा क्योंकि हमारे पास पहले से ही एक और कामिकैज़ बॉट था, और मेरे पास तीन कामीकेज़ बॉट नहीं थे। इसके अलावा, यह एक अन्य दो की तुलना में अधिक तुच्छ है।
एल'एंडिया स्ट्रोमैन

@ El'endiaStarman तो मैं कई यूजरबॉट्स से निवेदन कर रहा हूं - दूसरे का कोड फील्ड डिफॉल्ट छिपा हुआ एक्सपेंडेबल हो सकता है
no 18z

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;
}

हाइपर

HYPERSPACE क्या COOL है !!!!!!!!!!!!!!!!

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;
}

यह बॉट अब लाइव है!
एलेंडिया स्ट्राटन

@ El'endiaStarman मैंने बॉट को अपडेट किया है
TuxCrafting

अपडेट अब लाइव है! हालांकि एक बहुत नहीं। : पी
एल'एंडिया स्ट्रोमैन

0

आत्मघाती +

प्रतिस्पर्धी नहीं बनाया गया है। सिर्फ मनोरंजन के लिए। तकनीकी रूप से, यह स्पाई के विपरीत काम करता है: खिलाड़ी, हाइपरस्पेस का पीछा करते हैं, जब सूर्य के करीब, अग्नि मिसाइल 70%। मुझे लगता है कि मैं सिर्फ KamikazePlus जासूस और जासूस पागल की तरह भागते हुए देखना चाहता हूँ।

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;
}

मूल रूप से बस स्पाई कोड लिया और "लेफ्ट" और "राइट" फ़्लिप किया।


यह बॉट अब लाइव है! और हाँ, यह KamikazePlus जासूस का पीछा करने के लिए मजेदार है। : पी
एल'एंडिया स्ट्रैटन

@ El'endiaStarman मुझे लगता है कि कामिकेज़प्लस को बिना गोलियों से लड़ते हुए देखना मज़ेदार है और overideHyperspace = 0;; जब वे एक-दूसरे पर जाने की कोशिश करते हैं तो वे गायब रहते हैं।
no --z।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.