ปืนที่เร็วที่สุดของทิศตะวันตกราชาแห่งการท้าทาย


22

นี่คือความท้าทาย King of the Hill ในการแข่งรอบ มันเป็นการต่อสู้เพื่อค้นหามือปืนที่เก่งที่สุดของตะวันตก!

เพื่อให้สามารถแข่งขันในการแข่งขันครั้งนี้คุณต้องทำสองฟังก์ชั่น คนแรกกำหนดคุณลักษณะของมือปืนของคุณและที่สองคือฟังก์ชั่นลอจิกหลักสำหรับมือปืน

ฟังก์ชั่นแอตทริบิวต์

function () {

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

ฟังก์ชันแอททริบิวต์ประกอบด้วยตัวแปร 5 ตัวที่คุณจะต้องตั้งค่าตามกฎบางอย่าง (ยกเว้นnameว่าจะเป็นสตริงใดก็ได้) คุณต้องใช้คะแนนรวม 15 แต้มกับมือปืนของคุณ - มือปืนที่ไม่ได้ใช้คะแนนเต็ม 15 คะแนนจะไม่มีสิทธิ์ นี่คือการทำงานของคุณลักษณะ:

  • numbOfBullets - กำหนดจำนวนกระสุนปืนของคุณ

    ค่าเริ่มต้นและต่ำสุดnumbOfBulletsคือ 1 แต่ละสัญลักษณ์แสดงหัวข้อย่อยค่าใช้จ่ายเพิ่มเติม 1 จุดที่มีสูงสุดเป็น 16 กระสุนที่มี 15 คะแนนการใช้จ่าย

  • reloadSpeed - กำหนดจำนวนนักแม่นปืนของคุณที่จะต้องบรรจุปืนใหม่หลังจากที่กระสุนหมด

    ฐานและค่าสูงสุดคือ 4 โดยมีค่าต่ำสุดคือ 1 การลดคุณสมบัตินี้ 1 ค่าใช้จ่าย 2 คะแนน

  • shotsPerTurn - กำหนดว่ามือปืนของคุณสามารถยิงได้กี่ครั้งในคราวเดียว

    ฐานและค่าต่ำสุดคือ 1 แต่ละครั้งเพิ่มขึ้น 1 ค่าใช้จ่าย 3 คะแนนเพื่อให้คุณได้สูงสุด 6 นัดต่อรอบโดยใช้ 15 คะแนน การเพิ่มแอททริบิวต์ด้านบน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 ช่อง) ในการตีผู้เล่นและชนะรอบคุณต้องยิงที่พื้นที่เดียวกับที่เขากำลังยืนอยู่

นี่คือคำแนะนำทีละขั้นตอนเกี่ยวกับการดวล นอกจากนี้ยังครอบคลุมถึงคำสั่งที่ไม่ถูกต้องและกฎพิเศษ:

  • ในตอนเริ่มต้นของการดวลแต่ละครั้งผู้เล่นทั้งสองจะถูกวางในอวกาศ 12 และปืนพกของพวกเขานั้นเต็ม
  • มีการเรียกฟังก์ชั่นหลักและมือปืนทำการสั่งย้ายครั้งแรกและเลือกตำแหน่งที่ต้องการถ่าย
  • ครั้งแรกที่มือปืนย้ายไปที่ตำแหน่งใหม่ หากมีการป้อนข้อมูลที่ไม่ถูกต้องที่คำสั่งย้าย (ตำแหน่งต่ำกว่า 1 หรือสูงกว่าจากนั้น 24 หรือย้ายช่องว่างมากขึ้นพวกเขาจะได้รับอนุญาตด้วย) พวกเขาอยู่ในตำแหน่งเดียวกัน
  • มีการตรวจสอบการโหลดครั้งถัดไปถ้าคุณหมดกระสุนก่อนหน้านี้หรือคุณเรียกว่าการรีโหลดด้วยตัวเองมือปืนของคุณจะเข้าสู่รอบการโหลดใหม่ เขาได้รับการบรรจุใหม่สำหรับผลัดกันมากที่สุดเท่าที่คุณตั้งค่าของคุณreloadSpeedคุ้มค่า หากคุณตัดสินใจที่จะหยุดนิ่ง (คืนค่าจำนวนเต็มพื้นที่เดียวกับที่คุณยืนอยู่ก่อนหน้าหรือเพียงแค่คืนค่าที่ไม่ถูกต้อง) คุณโหลดตัวนับซ้ำลงไป 2 รอบแทนที่จะเป็นหนึ่ง
  • ตอนนี้มาตรวจสอบค่าการยิงของคุณทุกครั้งที่คุณสามารถเข้าไปยังสถานที่ถ่ายภาพได้มากเท่าที่คุณต้องการจะถูกตัดออกไปตามจำนวนที่ถูกต้องตามจริงซึ่งพิจารณาจาก: จำนวนนัดต่อรอบและจำนวนกระสุนในปืนพกของคุณ แล้วแต่จำนวนใดจะต่ำกว่า) shotsPerTurnมูลค่าของคุณจะเพิ่มขึ้น 1 หากคุณตัดสินใจที่จะหยุดนิ่งในเทิร์นนี้ดังนั้นคุณสามารถสร้างช็อตพิเศษหากคุณตัดสินใจที่จะหยุดนิ่ง หากคุณอยู่ในรอบการรีโหลดคุณมี 0 นัด
  • ตอนนี้การถ่ายภาพจริงมาถึงแล้วมี 2 วิธีที่สิ่งนี้สามารถลดลงได้ หากมือปืนทั้งสองมีสถิติ movespeed เดียวกันจากนั้นพวกเขาทั้งสองยิงในเวลาเดียวกันและสามารถฆ่าซึ่งกันและกันในเวลาเดียวกันได้ ในกรณีที่พวกเขามีสถิติ movespeed ที่แตกต่างกันบอทที่มีค่า movespeed ที่สูงขึ้นจะเริ่มยิงก่อนและถ้าเขาฆ่าคู่ต่อสู้ของเขาเขาจะชนะในรอบนี้ หากมือปืนสามารถยิงกระสุนหนึ่งนัดหรือมากกว่าในรอบเดียวมันจะเป็นไปตามกฎเดียวกันกับข้างบนยกเว้นในรอบที่มากขึ้นตัวอย่างเช่นสมมติว่า bot1 มี 3 กระสุนและเร็วกว่าและบอ 2 มี 2 กระสุนมันจะเป็นเช่นนี้ :

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

นี่จะดูเหมือนกันถ้าพวกเขามี movespeed เหมือนกันเท่านั้นว่าถ้าตอนนี้ Bot1 กด Bot2 ในรอบเดียวกัน Bot2 ก็สามารถกด Bot1 ได้และมันจะเป็นเน็คไท

กฎ

ก่อนอื่นฉันกำลังคัดลอกกฎบางอย่างจากรายการงานอดิเรกของ Calvin ที่ใช้ที่นี่ด้วย

เมื่อประกาศตัวแปร JavaScript ใหม่คุณต้องใช้คำหลัก var นี่เป็นเพราะตัวแปรที่ประกาศโดยไม่มี var กลายเป็นโกลบอลแทนที่จะเป็นโลคัลดังนั้นจึงเป็นเรื่องง่ายที่จะเกิดความสับสน (หรือจงใจ) โดยไม่ตั้งใจกับคอนโทรลเลอร์หรือสื่อสารกับผู้เล่นอื่นอย่างอิสระ ต้องชัดเจนว่าคุณไม่ได้พยายามโกง

เมื่อประกาศฟังก์ชั่นมันเป็นการดีที่สุดที่จะใช้คำหลัก var เช่นกันเช่นใช้var f = function(...) {...}แทนfunction f(...) {...}.ฉันไม่แน่ใจว่าทำไม แต่บางครั้งมันก็สร้างความแตกต่าง

ในรหัสของคุณคุณอาจไม่ ...

  • พยายามเข้าถึงหรือแก้ไขคอนโทรลเลอร์หรือรหัสของผู้เล่นอื่น
  • พยายามแก้ไขสิ่งที่มีอยู่ใน JavaScript
  • ทำแบบสอบถามเว็บ
  • ทำสิ่งที่เป็นอันตรายเป็นอย่างอื่น

กฎเพิ่มเติมของฉัน:

  • ผู้ใช้สามารถสร้างมือปืนได้มากเท่าที่ต้องการและเปลี่ยนฟังก์ชั่นในช่วงเวลาใดก็ได้
  • ฉันจะลบรายการใด ๆ ออกจากเกมที่อาจใช้เวลานานเกินไปหรือพยายามโกงในลักษณะที่ฉันเห็นว่าเหมาะสม
  • ชื่อของคุณสมบัติที่ฟังก์ชั่นของคุณจำเป็นต้องกลับมาจะต้องเหมือนกันในตัวอย่างที่มีโครงสร้างเดียวกัน!

คำตอบของคุณควรอยู่ในรูปแบบนี้ฟังก์ชันแรกคือฟังก์ชันแอ็ตทริบิวต์และอันดับที่สองเป็นฟังก์ชันตรรกะ โปรดสังเกตว่าฉันใช้เครื่องหมายอัศเจรีย์เพราะถ้าคุณสร้างบรรทัดใหม่ระหว่างโค้ดบล็อกตัวแยกวิเคราะห์จะไม่เห็นบล็อคโค้ดสองแบบดังนั้นคุณต้องใช้สัญลักษณ์ใด ๆ (แค่ใช้เครื่องหมายอัศเจรีย์) เพื่อแยกพวกเขา:

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

และนี่คือการควบคุม: การควบคุมเกม เพียงแค่เปิดลิงค์และรอให้บอทโหลดจากนั้นเลือกอันที่คุณต้องการในการต่อสู้ (อาจเป็นทั้งหมด) แล้วกดปุ่มเริ่ม

ฉันใส่ testbot เป็นคำตอบที่จะแข่งขันมันยังทำหน้าที่เป็นตัวอย่างว่าโครงสร้างของคำตอบควรเป็นอย่างไร โปรดทราบว่าหากคุณทำผิดพลาดเล็กน้อยและแก้ไขอัลกอริทึมสแต็กคำตอบของคุณอาจไม่สามารถรับได้ทันทีและไซต์ที่คอนโทรลเลอร์ใช้ซึ่งสร้างโดย Stackexchange นั้นไม่ได้รับการอัพเดต (แต่จะใหม่กว่าหรือหากคุณทำการเปลี่ยนแปลงครั้งใหญ่กว่า ทำเพียงเพิ่มข้อความที่ส่วนท้าย) นี่คือเว็บไซต์: codelink


ฉันดูเหมือนจะไม่สามารถรับบอทสองตัวต่อสู้กันในขณะนี้ - ถ้าฉันเลือกทั้งคู่การกดเริ่มดูเหมือนจะไม่ทำอะไรเลยและฉันไม่แน่ใจว่าบอทของฉันผิดหรือ คอนโทรลเลอร์ใช้เวลานาน
euanjt

ใช่อย่างที่ฉันอธิบายตอนท้ายของคำถามของฉันเมื่อคุณแก้ไขคำตอบของคุณมันไม่ได้แก้ไขในตัวสร้างโค้ด stackexchange เพราะมันไม่ได้สังเกตว่ามีการเปลี่ยนแปลงถ้าคุณเพิ่มข้อความที่ท้ายคำตอบของคุณมันควรจะทำงาน
Vajura

1
ฉันคิดว่า (นิ้วไขว้) ฉันแก้ไขข้อผิดพลาดเหล่านั้น - มันยากที่จะหาข้อผิดพลาดถ้าคอนโทรลเลอร์ไม่บอกฉันว่าฉันไม่ได้ให้ผลลัพธ์ที่ถูกต้องและไม่ทำสิ่งใดอย่างเงียบ ๆ เลย
euanjt

8
คุณสามารถใช้<!---->เพื่อแยก codeblocks "ล่องหน" (โดยไม่ต้อง!)
KRyan

1
พบข้อผิดพลาด เปลี่ยน "play1 = maskedEval (ผู้เล่น [a] .code, params)" เป็น "play1 = maskedEval (playingPlayers [a] .code, params)" - เดียวกันสำหรับ play2
QuadrExAtt

คำตอบ:


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;

Pandarus อาศัยความเร็วของเขาในการออกไปทางกระสุนและใช้การเคลื่อนไหวก่อนหน้าของศัตรูเพื่อคาดเดาว่าพวกเขาจะไปที่ไหน


ต้องขอโทษด้วยมีข้อผิดพลาดในการให้คะแนนตอนนี้ทุกอย่างทำงานได้อย่างถูกต้อง มันแปลกมากสำหรับฉันที่บอตของฉันชนะฮ่า ๆ
Vajura

โอ้และการส่งของคุณมีสิ่งแปลก ๆ อีกอย่างตัวเลขสำหรับคำสั่งการย้ายของคุณซึ่งเป็นทศนิยมดังนั้นฉันจึงเพิ่มการปัดเศษลงในคอนโทรลเลอร์
Vajura

ฉันไม่รู้จริงๆว่าทำไมมันถึงได้ส่งทศนิยม :-) ฉันจะพยายามปรับปรุงพรุ่งนี้
euanjt

ฉันลบ console.log ออกเนื่องจากมันทำให้ตัวควบคุม
เสียหาย

ใช่ขอโทษฉันได้ (ในที่สุด) ทำให้มันใช้งานได้ (และเอาชนะ bot ทดสอบของคุณ) ตอนนี้ :)
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 สำหรับการเพิ่มการเน้นไวยากรณ์ แต่โปรแกรมนี้ขัดข้อง
Marcus Blättermann

แปลก. การเพิ่มการเน้นไวยากรณ์เป็นเพียงความคิดเห็น HTML และไม่ควรทำให้โปรแกรมแตก
ProgramFOX

ไม่ทราบ แต่โปรแกรมไม่โหลดโค้ดของฉันอีกต่อไปตอนนี้ก็ใช้ได้อีก
Marcus Blättermann

อ่าฉันเข้าใจแล้วตัวแยกวิเคราะห์อาจไม่เข้าใจรูปแบบที่มีความคิดเห็น HTML ดังนั้นจึงทำให้โปรแกรมแตกได้แน่นอน ความผิดฉันเอง!
ProgramFOX

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;

ดังนั้นถ้าศัตรูไม่หยุดนิ่ง : D
Vajura

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 ฮ่าฮ่าใช่มันเหมือนกันฉันเดาว่าฉันเพิ่งเลือกอันแรกสำหรับความสามารถในการอ่านทำให้ชัดเจนยิ่งขึ้นว่ามันเคลื่อนที่น้อยกว่าหนึ่งความเร็วสูงสุดจากจุดเริ่มต้น นอกจากนี้ยังทำให้ง่ายต่อการแทนที่ทั้ง 12 ด้วย 15 ถ้าขนาดของแผนที่เปลี่ยนไปหรืออะไรก็ตาม
ดัมและอีฟ

2
ตกลง. เราเป็นโปรแกรมเมอร์ทั้งหมดที่นี่ดังนั้นฉันจึงประหลาดใจที่ไม่มีใครพูดถึงมัน: P
ตบมือ

3

Alexander Hamilton

หากเขาไม่ชนะในรอบแรกอาจจะตาย

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: โหลดซ้ำอัตโนมัติเมื่อคุณไม่มีภาพ
MegaTom

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
เฮ้ "yourShots" ไม่ใช่ myShots ของฉันตอนนี้ฉันคิดว่า "myShots" น่าจะดีกว่าฮ่า ๆ โอ้และย้ายไปไม่ได้เรียงแถวหมายเลขเดียว
Vajura

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;

Diephobus เชื่อมั่นในการยิงกระสุนอย่างไร้ความปราณีทุกที่ที่เขาคิดว่าศัตรูของเขาอาจจะเป็น แต่เขาก็ค่อนข้างช้า


1

ASCIIGunInTheWest

ยิงเทิร์นละ 2 นัดและเดาว่าศัตรูจะไปทางไหนโดยขึ้นอยู่กับความเร็วในการเคลื่อนที่ของเขา ยกโทษให้ฉันหากมีข้อผิดพลาดใด ๆ ฉันไม่ได้เข้ารหัสมากใน JavaScript

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 ฉันคิดว่าทำไม: คุณประกาศฟังก์ชั่น main () ในขอบเขตที่ฟังก์ชั่นหลักถูกสร้างขึ้นโดยนักวิ่งทัวร์นาเมนต์แล้ว ใช่รายละเอียดการใช้งาน)
eaglgenes101

นอกจากนี้สำหรับห่วงของคุณมีรูปร่างแปลก บรรทัดที่หกควรมีเครื่องหมายอัฒภาคอยู่
eaglgenes101
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.