पश्चिम की सबसे तेज़ बंदूक, पहाड़ी चुनौती का राजा


22

यह एक राउंड रॉबिन में एक राजा की चुनौती है। यह पश्चिम के सर्वश्रेष्ठ बंदूकधारी को खोजने की लड़ाई है!

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

विशेषता समारोह

function () {

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

विशेषता फ़ंक्शन में 5 चर शामिल हैं जिन्हें आपको कुछ नियमों के अनुसार सेट करना होगा (इसके अलावा nameकोई भी स्ट्रिंग हो सकती है)। आपको अपने गनमैन पर कुल 15 बिंदु खर्च करने होंगे - गनमैन जो सभी 15 बिंदुओं पर खर्च नहीं करते हैं वे पात्र नहीं हैं। यहां बताया गया है कि विशेषताएँ कैसे काम करती हैं:

  • numbOfBullets - परिभाषित करता है कि आपकी बंदूक कितनी गोलियों को रखती है।

    का प्रारंभिक और न्यूनतम मूल्य numbOfBulletsहै 1. प्रत्येक अतिरिक्त गोली की कीमत 1 बिंदु है जिसमें अधिकतम 15 गोलियों के साथ 16 गोलियां खर्च होती हैं।

  • reloadSpeed - यह निर्धारित करता है कि गोलियों से भागने के बाद आपके बंदूकधारी को अपनी बंदूक को कितनी बार मोड़ना है।

    आधार और अधिकतम मूल्य न्यूनतम 4 के साथ 4 है। इस विशेषता को 1 लागत 2 अंक कम करना।

  • shotsPerTurn - परिभाषित करता है कि आपका गनमैन कितनी बार एक बारी में शूटिंग कर सकता है।

    आधार और न्यूनतम मूल्य 1 है। प्रत्येक 1 अंक में 3 अंकों की वृद्धि होती है, इसलिए आप 15 अंकों के साथ अधिकतम 6 शॉट प्रति चक्कर लगा सकते हैं। इस विशेषता को ऊपर उठाना numbOfBulletsकाउंटर उत्पादक है क्योंकि आप अधिक गोलियां नहीं मार सकते हैं तो आपकी बंदूक पकड़ सकती है।

  • moveSpeed - परिभाषित करता है कि आपका गनमैन एक बारी में कितने स्थान चला सकता है।

    आधार और न्यूनतम मूल्य 1 है। प्रत्येक 1 की वृद्धि पर 3 अंकों की लागत आती है, जिसमें अधिकतम 6 गति होती है, जिसमें 15 अंक खर्च होते हैं। बंदूकधारी अपनी चाल की अधिकतम गति तक हर मोड़ पर बाएं या दाएं भाग सकता है। वह अभी भी खड़ा हो सकता है जो उसे एक बोनस देता है (इस पर बाद में)।

ऊपर दिए गए उदाहरण समारोह में गोलियों पर 6 अंक खर्च होते हैं, 6 अंक पुनः लोड गति पर खर्च होते हैं और 3 अंक आंदोलन पर खर्च होते हैं।

मुख्य कार्य

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

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

पैरामीटर:

  • bulletsLeftआपकी बंदूक में छोड़ी गई गोलियों की संख्या
  • yourShots, यह उन सभी पिछले पदों के सरणियों का एक सरणी है, जिस पर आपके बंदूकधारी ने गोलीबारी की है।

    एक बंदूकधारी के लिए उदाहरण जो 1 राउंड प्रति गोली मार सकता है:

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

    एक बंदूकधारी के लिए उदाहरण, जो प्रति राउंड 3 गोलियां मार सकता है:

    [[12,13,14],[11,15,16],[9,14],...]
    
  • enemyShots - ऊपर के समान लेकिन अपने दुश्मन के लिए

  • yourMovement - अपने सभी पिछले आंदोलन की स्थिति की एक सरणी
  • enemyMovement, ऊपर के रूप में, लेकिन अपने दुश्मन के लिए

आपको लौटने की क्या आवश्यकता है:

आपको एक वैरिएबल लौटाना होगा जिसमें 3 विशेषताएँ हों:

  • shots - संख्याओं की एक सरणी जो निर्धारित करती है कि आपके गनमैन किस स्थान पर शूटिंग करेंगे
  • move - एक एकल संख्या जो यह निर्धारित करती है कि आपका गनमैन किस स्थान पर जाने की कोशिश करेगा
  • reload - एक सही / गलत मूल्य जिसके साथ आप अपने गनमैन को फिर से लोड कर सकते हैं

द्वंद्व

प्रतियोगिता एक राउंड रॉबिन 1 बनाम 1 प्रणाली का अनुसरण करती है। प्रत्येक बंदूकधारी के पास हर दूसरे बंदूकधारी के खिलाफ 50 राउंड होते हैं। एक गोल तब तक रहता है जब तक कि कोई व्यक्ति गोली से नहीं मारा जाता है या जब तक 66 मोड़ नहीं हो जाते हैं (एक मोड़ तब होता है जब दोनों खिलाड़ियों ने गोली मार दी हो)।

बंदूकधारी अपने प्रतिद्वंद्वी को मारकर 2 अंक अर्जित कर सकता है, 1 अंक यदि वे दोनों एक ही मोड़ में मर जाते हैं या 0 अंक तक पहुंचते हैं अगर वे 66 मोड़ सीमा तक पहुंचते हैं। शूटिंग क्षेत्र 24 रिक्त स्थान की चौड़ाई (1-24 समावेशी) है। एक खिलाड़ी को मारने के लिए और एक राउंड जीतने के लिए आपको उसी स्थान पर शूट करने की आवश्यकता होती है, जैसा कि वह वर्तमान में खड़ा है।

द्वंद्व कैसे काम करता है, इस बारे में यहां एक स्टेप बाय स्टेप गाइड है। इसमें सभी अमान्य आदेश और विशेष नियम शामिल हैं:

  • प्रत्येक द्वंद्व के प्रारंभ में दोनों खिलाड़ियों को अंतरिक्ष में रखा जाता है और उनके रिवाल्वर पूरी तरह से लोड होते हैं
  • मुख्य कार्य कहा जाता है और बंदूकधारी अपनी पहली चाल कमान बनाते हैं और चुनते हैं कि वे कहाँ शूट करना चाहते हैं
  • पहले बंदूकधारी अपने नए स्थान पर चले जाते हैं। यदि चाल कमांड पर कोई भी अवैध इनपुट किया जाता है (तब निम्न या उच्चतर 24 स्थितियां या वे अधिक स्थान ले जाते हैं तो उन्हें भी अनुमति दी जाती है) वे उसी स्थिति में रहते हैं।
  • अगला पुनः लोड करने की जाँच की जाती है, यदि आप पिछली बारी में गोलियों से भागे हैं या आपने खुद को फिर से लोड करने के लिए कहा है तो आपका गनमैन पुनः लोड चक्र में चला जाता है। जब तक आप अपना reloadSpeedमूल्य निर्धारित करते हैं, तब तक वह कई मोड़ ले रहा होता है । यदि आपने अभी भी खड़े होने का फैसला किया है (उसी स्थान पूर्णांक को वापस लौटाया जाए जहां आप पहले खड़े थे या केवल एक अमान्य मान लौटा रहे हैं) तो आप पुनः लोड करते हैं काउंटर एक के बजाय 2 मोड़ के लिए नीचे जाता है।
  • अब आपके शूटिंग मूल्यों की जाँच करने की बात आती है, हर मोड़ पर आप जितने शूटिंग स्थान दर्ज कर सकते हैं, वे हमेशा की तरह वास्तविक वैध राशि से कट जाएंगे, जो निर्धारित होता है: प्रति मोड़ शॉट्स की संख्या और आपके रिवॉल्वर में गोलियों की संख्या ( जो भी कम हो)। shotsPerTurnयदि आप अभी भी इस मोड़ पर खड़े होने का निर्णय लेते हैं तो आपका मूल्य 1 से बढ़ जाता है, इसलिए यदि आप अभी भी खड़े होने का निर्णय लेते हैं तो आप एक अतिरिक्त शॉट लगा सकते हैं। यदि आप पुनः लोड चक्र में हैं तो आपके पास 0 शॉट्स हैं।
  • अब वास्तविक शूटिंग की बात आती है, 2 तरीके हैं जिससे यह नीचे जा सकता है। यदि दोनों बंदूकधारी के पास एक ही चल प्रतिमा है तो वे दोनों एक ही समय में शूट करते हैं और दोनों एक ही समय में एक दूसरे को मार सकते हैं। इस मामले में कि उनके पास अलग-अलग Movespeed आँकड़े हैं, उच्च Movespeed स्टेट के साथ बॉट पहले शूटिंग शुरू करता है और यदि वह अपने प्रतिद्वंद्वी को मारता है तो वह इस राउंड को जीतता है। यदि बंदूकधारी एक राउंड में एक या एक से अधिक गोलियां चला सकता है तो यह ऊपर दिए गए नियमों का पालन करता है, उदाहरण के लिए अधिक चक्रों को छोड़कर: Lets का कहना है कि bot1 में 3 गोलियां हैं और तेज है और bot 2 में 2 गोलियां हैं, तो यह इस तरह से चलेगी :

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

यह वही दिखाई देगा जब उनके पास एक ही चल-चलन होगा कि यदि अब उसी चक्र में बॉट 1 ने बॉट 2 को मारा तो बॉट 2 भी बॉट 1 को मार सकता है और यह एक टाई होगा।

नियम

पहले मैं केल्विन के शौक के प्रवेश से कुछ नियम कॉपी कर रहा हूं जो यहां भी लागू होते हैं।

एक नया जावास्क्रिप्ट चर घोषित करते समय, आपको var कीवर्ड का उपयोग करना चाहिए। ऐसा इसलिए है क्योंकि बिना वेरिएंट के घोषित किया गया वैरिएबल लोकल के बजाय ग्लोबल हो जाता है, इसलिए कंट्रोलर के साथ गलती से (या जानबूझकर) गड़बड़ हो जाए या दूसरे प्लेयर्स के साथ खुलकर कम्यूनिकेट करना आसान हो जाए। यह स्पष्ट करना होगा कि आप धोखा देने की कोशिश नहीं कर रहे हैं।

फ़ंक्शंस की घोषणा करते समय var कीवर्ड का उपयोग करना सबसे अच्छा होता है, यानी मैं var f = function(...) {...}इसके बजाय का उपयोग कर function f(...) {...}.रहा हूं क्योंकि मुझे पूरी तरह से यकीन नहीं है कि, लेकिन कभी-कभी यह एक अंतर बनाने के लिए प्रकट होता है।

आपके कोड में आप नहीं हो सकते हैं ...

  • नियंत्रक या अन्य खिलाड़ी के कोड को एक्सेस या संशोधित करने का प्रयास।
  • जावास्क्रिप्ट में निर्मित कुछ भी संशोधित करने का प्रयास।
  • वेब सवाल करें।
  • अन्यथा दुर्भावनापूर्ण बातें करें।

मेरे अतिरिक्त नियम:

  • उपयोगकर्ता जितने चाहें उतने बंदूकधारी बना सकते हैं और किसी भी समय के लिए अपने कार्यों को बदल सकते हैं
  • मैं खेल से किसी भी प्रविष्टि को हटा दूंगा जो या तो अधिक समय लेता है या किसी भी तरह से धोखा देने की कोशिश करता है जो मुझे फिट दिखता है
  • आपके फ़ंक्शन को जिन विशेषताओं को वापस करने की आवश्यकता है उनके नाम उसी संरचना के साथ उदाहरणों में होने चाहिए!

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

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

और यहाँ नियंत्रक है: खेल नियंत्रण । बस लिंक खोलें और बॉट्स को लोड करने के लिए प्रतीक्षा करें, फिर वह चुनें जिसे आप लड़ाई में चाहते हैं (शायद सभी) और प्रारंभ बटन दबाएं।

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


मैं इस समय दोनों बॉट को एक-दूसरे से लड़ता हुआ नहीं पा रहा हूं- अगर मैं उन दोनों को चुनता हूं, तो प्रेस शुरू करना कुछ भी नहीं लगता है और मुझे यकीन नहीं है कि यह मेरी गलत है या गलत है कंट्रोलर को एक लंबा समय लग रहा है
euanjt

हाँ जैसा कि मैंने अपने प्रश्न के अंत में समझाया था जब आपने अपना उत्तर संपादित किया था तो उसने इसे अभी तक स्टेक्सएक्सचेंज कोड जनरेटर में संपादित नहीं किया था क्योंकि यह ध्यान नहीं देता था कि कोई परिवर्तन था, यदि आप अपने उत्तर के अंत में कुछ पाठ जोड़ते हैं तो यह काम करना चाहिए
वजुरा

1
मुझे लगता है कि (उँगलियों को पार कर) मैंने उन त्रुटियों को ठीक कर दिया है- त्रुटियों को ढूंढना कठिन है यदि नियंत्रक मुझे नहीं बताता है कि मैंने सही आउटपुट नहीं दिया है और चुपचाप कुछ भी नहीं करता है
euanjt

8
आप <!---->"अदृश्य रूप से" (बिना !) अलग कोडब्लॉक का उपयोग कर सकते हैं ।
केरेन

1
त्रुटि पाई गई। "Play1 = maskedEval (खिलाड़ी [a .code, params)" को "play1 = maskedEval (प्ले-प्लेयर्स [a .code, params)" में बदलें
QuadrExAnd

जवाबों:


6

Pandarus

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

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

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

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

        enemyMoveSum += Math.abs(MoveSinceLast);
    }

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

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

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

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

play.move = MyMove;

return play;

पंडारस गोलियों के रास्ते से बाहर निकलने के लिए अपनी गति पर निर्भर करता है, और दुश्मनों के पिछले आंदोलनों का उपयोग करके अनुमान लगाता है कि वे कहाँ जाने वाले हैं।


माफी मांगनी है, स्कोरिंग में एक बग था अब सब कुछ सही ढंग से काम करता है। मेरे लिए यह बहुत अजीब था कि मेरा बॉट
लोल

ओह और आपके सबमिशन में एक और अजीब बात थी, आपके मूव कमांड के लिए नंबर जहां
डिकिमल्स हैं

मैं वास्तव में नहीं जानता कि यह क्यों दशमलव का उत्पादन कर रहा था :-) मैं कोशिश करूँगा और इसे कल
सुधारूंगा

मैंने
कंसोल

हाँ क्षमा करें, वैसे भी मैंने (आखिरकार) इसे काम कर लिया है (और अपने टेस्ट बॉट की पिटाई) अब :)
euanjt

5

एक साधारण आदमी

कुछ भी सही नहीं है, लेकिन कम शक्ति के माध्यम से सब कुछ काफी अच्छा है।

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

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

सिंटैक्स हाइलाइटिंग जोड़ने के लिए @ProgramFOX को धन्यवाद दें, लेकिन इससे प्रोग्राम टूट गया।
मार्कस ब्लट्टरमैन

वह अजीब है। वाक्य रचना हाइलाइटिंग जोड़ना केवल एक HTML टिप्पणी है और इस कार्यक्रम को तोड़ना नहीं चाहिए।
प्रोग्रामफॉक्स

पता नहीं, लेकिन प्रोग्राम ने मेरा कोड अब लोड नहीं किया, अब फिर से ठीक है।
मार्कस ब्लैटरमैन

आह, मैं देख रहा हूं, शायद पार्सर HTML टिप्पणी के साथ प्रारूप को समझ नहीं पाया, इसलिए इसने कार्यक्रम को वास्तव में तोड़ दिया। मेरी गलती!
प्रोग्रामफॉक्स

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

टेस्ट बॉट, यह एक नियंत्रण परीक्षण के रूप में जोड़ा गया। अगर किसी को यह खो देता है तो आपको शर्म आनी चाहिए :)। फिक्स्ड बॉट बिहेवियर, कॉपी गलत टेस्ट बॉट चिपकाया (यह हमेशा फील्ड 12 पर रहा)


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

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

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

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

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

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

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

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

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

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

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

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

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

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

return play;

तो अगर दुश्मन कभी भी खड़ा नहीं होता तो स्नाइपर कभी गोली नहीं चलाता? : डी
वजुरा

3

जुलाहा

हत्या की तुलना में जीवित रहने से अधिक चिंतित, वह हर बार अपनी दूरी बढ़ाते हुए, आगे और पीछे बुनाई करता है। दुश्मनों की सीमा के भीतर एक यादृच्छिक स्थान पर गोली मारता है।

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

var play = {};
var moveSpeed = 2;

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

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

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





var move = 12;

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


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

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



return play;

move = 12 + moveSpeed - 1;के बराबर है move = 11 + moveSpeed;, नहीं? अन्यथा यह एक अच्छा बॉट की तरह दिखता है;)
ताली

@ConfusedMr_C Haha हाँ, यह वही है, मुझे लगता है कि मैंने सिर्फ पठनीयता के लिए पहला चुना है, यह अधिक स्पष्ट करता है कि यह प्रारंभ बिंदु से अधिकतम चाल की गति से एक कम चलता है। मानचित्र के आकार में परिवर्तन या कुछ भी होने पर सभी 12 को 15 के साथ बदलना आसान बनाता है
कैन

2
ओह ठीक है। हम यहां सभी प्रोग्रामर हैं इसलिए मुझे आश्चर्य हुआ कि किसी और ने इसका उल्लेख नहीं किया था: पी
क्लैप

3

अलेक्जेंडर हैमिल्टन

अगर वह पहले राउंड में नहीं जीतता है, तो शायद मर जाएगा

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

!

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

3

हारून बूर

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

!

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

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

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


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

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

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

}

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

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



return play;

विंगर एक फैलता है जो दुश्मनों की सीमा को काटता है। वह दुश्मनों के शाट की ओर भी दौड़ता था।

बस रीसेट को पुश करने के लिए यहां छोड़ दें।


2

SMG

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

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

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

चूंकि यह कभी भी लोड नहीं हो रहा है, इसलिए बेहतर होगा कि आप पुनः लोड गति पर कोई बिंदु बर्बाद न करें और इसके बजाय अधिक बुलेट खरीदें।
QuadrExAtt

जब आप शॉट्स से बाहर निकलते हैं तो @QuadrExAtt: रीलोड स्वचालित है।
मेगाटॉम

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

1
अरे इसके "आपके स्क्रीनशॉट्स" मेरे मायशॉट्स नहीं हैं, अब मुझे लगता है कि इसके बारे में "मायशॉट्स" बेहतर रहा होगा, ओह और इस कदम से एक मात्र एक संख्या नहीं है
वजुरा

1

Diephobus

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

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

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

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

                currBest = i;
            }
        }

        messedUpOrder[order] = currBest;
    }

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

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

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

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

निर्दयता से गोलियों की बौछार में डाइफोबस मधुमक्खियों को हर जगह लगता है कि वह अपने दुश्मन हो सकता है, लेकिन वह थोड़ा धीमा है।


1

ASCIIGunInTheWest

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

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

!

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

संपादित करें: जाहिरा तौर पर मेरा बॉट (सिर्फ मेरा) JSFiddle में इस्तेमाल नहीं किया जा सकता है। क्या किसी को पता है कि यह क्यों है? मैं अपने गनमैन के लिए अपने सभी बिंदुओं का उपयोग कर रहा हूं, इसलिए मुझे नहीं लगता कि मुझे अयोग्य घोषित किया गया है।


यह शायद 3 साल पहले एक बहुत अधिक उपयोगी हो सकता था, लेकिन एक KotH टूर्नामेंट धावक को फिर से तैयार करने में, मुझे लगता है कि क्यों पता है: आपने एक मुख्य () फ़ंक्शन की घोषणा की, जिसमें एक मुख्य समारोह पहले से ही टूर्नामेंट धावक द्वारा बनाया गया था ( हाँ, कार्यान्वयन विवरण)।
eaglgenes101

इसके अलावा, अपने पाश के लिए अजीब आकार का है। छठी पंक्ति में अर्धविराम होना चाहिए।
eaglgenes101
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.