Súng nhanh nhất của phương tây, vua của thử thách đồi


22

Đây là một thử thách King of the Hill trong một vòng tròn. Đó là một trận chiến để tìm ra tay súng giỏi nhất của phương tây!

Để có thể cạnh tranh trong cuộc thi này, bạn cần thực hiện hai chức năng. Cái đầu tiên đặt các thuộc tính của tay súng của bạn và cái thứ hai là chức năng logic chính cho tay súng.

Chức năng thuộc tính

function () {

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

Hàm thuộc tính bao gồm 5 biến mà bạn sẽ cần đặt theo một số quy tắc (ngoại trừ nameđó là bất kỳ chuỗi nào). Bạn phải dành tổng cộng chính xác 15 điểm cho tay súng của mình - những tay súng không dành đủ 15 điểm sẽ không đủ điều kiện. Đây là cách các thuộc tính hoạt động:

  • numbOfBullets - xác định khẩu súng của bạn chứa bao nhiêu viên đạn.

    Giá trị ban đầu và tối thiểu numbOfBulletslà 1. Mỗi viên đạn bổ sung có giá 1 điểm với tối đa là 16 viên đạn với 15 điểm đã bỏ ra.

  • reloadSpeed - xác định số lần quay mà tay súng của bạn cần nạp lại súng sau khi hết đạn.

    Giá trị cơ bản và tối đa là 4 với mức tối thiểu là 1. Giảm thuộc tính này đi 1 điểm 2 điểm.

  • shotsPerTurn - xác định số lần tay súng của bạn có thể bắn trong một lượt.

    Giá trị cơ bản và tối thiểu là 1. Mỗi lần tăng thêm 1 điểm, bạn có thể có tối đa 6 bức ảnh mỗi vòng với 15 điểm chi tiêu. Tăng thuộc tính này ở trên numbOfBulletslà phản tác dụng vì bạn không thể bắn nhiều viên đạn hơn thì súng của bạn có thể giữ được.

  • moveSpeed - xác định có bao nhiêu khoảng trống mà tay súng của bạn có thể chạy trong một lượt.

    Giá trị cơ bản và tối thiểu là 1. Mỗi lần tăng thêm 1 chi phí 3 điểm với tối đa 6 tốc độ với 15 điểm chi tiêu. Tay súng có thể chạy sang trái hoặc phải mỗi lượt tối đa tốc độ di chuyển của mình. Anh ta cũng có thể đứng yên mà cho anh ta một phần thưởng (nhiều hơn về điều này sau).

Hàm ví dụ ở trên có 6 điểm chi cho đạn, 6 điểm dành cho tốc độ tải lại và 3 điểm dành cho chuyển động.

Chức năng chính

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

Thông số:

  • bulletsLeft, số lượng đạn còn lại trong súng của bạn
  • yourShots, đây là một loạt các mảng của tất cả các vị trí trong quá khứ mà tay súng của bạn đã bắn vào.

    Ví dụ cho một tay súng có thể bắn 1 viên đạn mỗi vòng:

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

    Ví dụ cho một tay súng có thể bắn 3 viên đạn mỗi vòng:

    [[12,13,14],[11,15,16],[9,14],...]
    
  • enemyShots - giống như trên nhưng đối với kẻ thù của bạn

  • yourMovement - một mảng của tất cả các vị trí chuyển động trong quá khứ của bạn
  • enemyMovement, giống như trên nhưng đối với kẻ thù của bạn

Những gì bạn cần trả lại:

Bạn được yêu cầu trả về một biến có 3 thuộc tính:

  • shots - một dãy số xác định không gian / s mà tay súng của bạn sẽ bắn vào
  • move - một số duy nhất xác định không gian mà tay súng của bạn sẽ cố gắng di chuyển đến
  • reload - một giá trị đúng / sai mà bạn có thể khiến tay súng của mình tải lại

Các cuộc đấu tay đôi

Cuộc thi diễn ra sau vòng 1 so với 1 hệ thống. Mỗi tay súng có 50 viên đạn chống lại mọi tay súng khác. Một vòng đấu kéo dài cho đến khi ai đó bị trúng đạn hoặc cho đến khi 66 lượt đi qua (một lượt là khi cả hai người chơi đã bắn).

Tay súng có thể kiếm được 2 điểm bằng cách giết chết đối thủ của mình, 1 điểm nếu cả hai đều chết trong cùng một lượt hoặc 0 điểm nếu đạt đến giới hạn 66 lượt. Trường chụp có chiều rộng 24 không gian (bao gồm 1-24). Để đánh một người chơi và giành chiến thắng trong một vòng, bạn cần phải bắn vào cùng một không gian như anh ta hiện đang đứng.

Dưới đây là hướng dẫn từng bước về cách thức đấu tay đôi. Điều này cũng bao gồm tất cả các lệnh không hợp lệ và các quy tắc đặc biệt:

  • Khi bắt đầu mỗi trận đấu, cả hai người chơi được đưa lên vũ trụ 12 và súng lục ổ quay của họ được nạp đầy đủ
  • Chức năng chính được gọi và tay súng thực hiện lệnh di chuyển đầu tiên của họ và chọn nơi họ muốn bắn
  • Đầu tiên các tay súng di chuyển đến vị trí mới của họ. Nếu bất kỳ đầu vào không hợp lệ nào được thực hiện tại lệnh di chuyển (vị trí thấp hơn 1 hoặc cao hơn 24 hoặc chúng di chuyển nhiều khoảng trống hơn thì chúng cũng được phép) chúng vẫn ở cùng một vị trí.
  • Lần tải lại tiếp theo được kiểm tra, nếu bạn hết đạn trong lượt trước hoặc bạn gọi là tự tải lại thì tay súng của bạn sẽ đi vào chu kỳ tải lại. Anh ta đang tải lại nhiều lượt như bạn đặt reloadSpeedgiá trị của mình . Nếu bạn quyết định đứng yên (trả lại số nguyên không gian giống như bạn đứng trước hoặc chỉ trả về giá trị không hợp lệ), bạn tải lại bộ đếm đi xuống trong 2 lượt thay vì một.
  • Bây giờ hãy kiểm tra giá trị bắn của bạn, mỗi lượt bạn có thể nhập bao nhiêu vị trí bắn tùy thích, chúng sẽ luôn bị cắt theo số lượng hợp lệ thực tế được xác định bởi: Số lần bắn mỗi lượt và số lượng đạn trong khẩu súng lục ổ quay của bạn ( cái nào thấp hơn). shotsPerTurnGiá trị của bạn tăng thêm 1 nếu bạn quyết định đứng yên trong lượt này, vì vậy bạn có thể thực hiện thêm một cú đánh nếu bạn quyết định đứng yên. Nếu bạn đang trong chu kỳ tải lại, bạn có 0 bức ảnh.
  • Bây giờ đến chụp thực tế, có 2 cách này có thể đi xuống. Nếu cả hai tay súng có cùng một chỉ số di chuyển thì cả hai đều bắn cùng một lúc và cả hai có thể giết nhau cùng một lúc. Trong trường hợp chúng có các chỉ số di chuyển khác nhau, bot có chỉ số di chuyển cao hơn sẽ bắt đầu bắn trước và nếu anh ta giết được đối thủ của mình, anh ta sẽ thắng vòng này. Nếu tay súng có thể bắn một hoặc nhiều viên đạn trong một vòng thì nó sẽ tuân theo các quy tắc như trên ngoại trừ trong nhiều chu kỳ như một ví dụ: Hãy nói rằng bot1 có 3 viên đạn và nhanh hơn và bot 2 có 2 viên đạn thì nó sẽ như thế này :

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

Điều này sẽ trông giống nhau nếu chúng có cùng tốc độ di chuyển mà nếu bây giờ Bot1 tấn công Bot2 trong cùng chu kỳ thì Bot2 cũng có thể tấn công Bot1 và đó sẽ là một trận hòa.

QUY TẮC

Đầu tiên tôi đang sao chép một số quy tắc từ mục Sở thích của Calvin cũng áp dụng ở đây.

Khi khai báo một biến JavaScript mới, bạn phải sử dụng từ khóa var. Điều này là do một biến được khai báo không có var trở thành toàn cục thay vì cục bộ, do đó sẽ dễ dàng vô tình (hoặc cố ý) gây rối với bộ điều khiển hoặc giao tiếp tự do với những người chơi khác. Rõ ràng là bạn không cố gắng gian lận.

Khi khai báo các hàm, tốt nhất là sử dụng từ khóa var, nghĩa là sử dụng var f = function(...) {...}thay vì function f(...) {...}.tôi không hoàn toàn chắc chắn tại sao, nhưng đôi khi nó xuất hiện để tạo sự khác biệt.

Trong mã của bạn, bạn không thể ...

  • cố gắng truy cập hoặc sửa đổi bộ điều khiển hoặc mã của người chơi khác.
  • cố gắng sửa đổi bất cứ điều gì được tích hợp vào JavaScript.
  • thực hiện các truy vấn web.
  • làm những việc độc hại khác.

Quy tắc bổ sung của tôi:

  • Người dùng có thể tạo nhiều tay súng như họ muốn và thay đổi chức năng của họ trong bất kỳ khoảng thời gian nào
  • Tôi sẽ xóa bất kỳ mục nào khỏi trò chơi mất quá nhiều thời gian hoặc cố gắng gian lận theo bất kỳ cách nào tôi thấy phù hợp
  • Tên của các thuộc tính mà hàm của bạn cần trả về phải giống như trong các ví dụ có cùng cấu trúc!

Câu trả lời của bạn phải ở định dạng này, hàm đầu tiên là hàm thuộc tính và hàm thứ hai là hàm logic. Lưu ý rằng tôi đã sử dụng dấu chấm than bởi vì nếu bạn chỉ tạo các dòng mới giữa các khối mã, trình phân tích cú pháp sẽ không thấy hai khối mã khác nhau, do đó bạn phải sử dụng bất kỳ ký hiệu nào (chỉ sử dụng dấu chấm than) để phân tách chúng:

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

Và đây là bộ điều khiển: ĐIỀU KHIỂN TRÒ CHƠI . Chỉ cần mở liên kết và đợi các bot tải, sau đó chọn cái nào bạn muốn trong cuộc chiến (có thể là tất cả) và nhấn nút bắt đầu.

Tôi cũng đưa vào một testbot như câu trả lời của mình sẽ cạnh tranh, nó cũng là một ví dụ về cách cấu trúc của câu trả lời sẽ như thế nào. Lưu ý, nếu bạn mắc một lỗi nhỏ và chỉnh sửa câu trả lời, thuật toán stackexchanges của bạn có thể không nhận được ngay và trang web mà bộ điều khiển sử dụng được tạo bởi stackexchange sẽ không được cập nhật (nhưng sau này hoặc nếu bạn thực hiện các thay đổi lớn hơn mà tôi đề xuất làm, chỉ cần thêm một số văn bản ở cuối). Đây là trang web: codelink


Tôi dường như không thể khiến hai bot chiến đấu với nhau vào lúc này - nếu tôi chọn cả hai, nhấn bắt đầu dường như không làm gì cả và tôi không chắc liệu bot của tôi có sai hay không bộ điều khiển mất nhiều thời gian
euanjt

Đúng như tôi đã giải thích ở cuối câu hỏi của tôi khi bạn chỉnh sửa câu trả lời của mình, nó chưa chỉnh sửa nó trong trình tạo mã stackexchange bởi vì nó không nhận thấy rằng có một sự thay đổi, nếu bạn thêm một số văn bản vào cuối câu trả lời của bạn thì nó sẽ hoạt động
Kim Cương

1
Tôi nghĩ (ngón tay đan chéo) Tôi đã sửa những lỗi đó - thật khó để tìm ra lỗi nếu bộ điều khiển không nói với tôi rằng tôi không cung cấp đầu ra chính xác và chỉ im lặng không làm gì cả
euanjt

8
Bạn có thể sử dụng <!---->để phân tách các codeblocks "vô hình" (không có !).
KRyan

1
Tìm thấy lỗi. Thay đổi "play1 = maskedEval (người chơi [a] .code, params)" thành "play1 = maskedEval (playPlayers [a] .code, params)" - tương tự cho play2
QuadrExAtt

Câu trả lời:


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 dựa vào tốc độ của mình để tránh đường đạn và sử dụng những chuyển động trước đó của kẻ thù để đoán xem chúng sẽ đi đâu.


Phải xin lỗi, đã có một lỗi trong việc ghi điểm bây giờ mọi thứ hoạt động chính xác. Điều rất kỳ lạ với tôi là bot của tôi đã chiến thắng lol
Vajura

Ồ và bài dự thi của bạn có một điều kỳ lạ khác, những con số cho lệnh di chuyển của bạn trong đó số thập phân vì vậy tôi đã thêm làm tròn vào bộ điều khiển
Vajura

Tôi thực sự không biết tại sao nó lại xuất ra số thập phân :-) Tôi sẽ thử và cải thiện nó vào ngày mai
euanjt

tôi đã gỡ bỏ console.log vì nó đã phá vỡ bộ điều khiển
Vajura

Vâng xin lỗi, dù sao tôi cũng (cuối cùng) đã làm cho nó hoạt động (và đánh bại bot thử nghiệm của bạn) ngay bây giờ :)
euanjt

5

Một người đàn ông đơn giản

Không hoàn hảo ở bất cứ điều gì, nhưng khá tốt ở mọi thứ thông qua sức mạnh của ít hơn là nhiều hơn.

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

Cảm ơn @ProgramFOX đã thêm đánh dấu cú pháp, nhưng điều này đã phá vỡ chương trình.
Marcus Blättermann

Lạ nhỉ. Thêm đánh dấu cú pháp chỉ là một nhận xét HTML và không nên phá vỡ chương trình.
Chương trìnhFOX

Không biết, nhưng chương trình đã không tải mã của tôi nữa, bây giờ nó lại hoạt động tốt.
Marcus Blättermann

À, tôi hiểu rồi, có lẽ trình phân tích cú pháp đã không hiểu định dạng với nhận xét HTML, vì vậy nó thực sự đã phá vỡ chương trình. Lỗi của tôi!
Chương trìnhFOX

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

Kiểm tra bot, điều này được thêm vào như một thử nghiệm kiểm soát. Nếu bất cứ ai thua điều này, bạn nên xấu hổ :). Đã sửa lỗi hành vi bot, sao chép dán bot thử nghiệm sai (nó luôn ở trên trường 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;

Vậy nếu kẻ thù không bao giờ đứng yên thì xạ thủ không bao giờ bắn? : D
Vajura

3

Thợ dệt

Quan tâm nhiều hơn đến việc sống sót hơn là giết chóc, anh ta dệt qua lại, tăng khoảng cách mỗi lần. Chọn một điểm ngẫu nhiên trong phạm vi được chứng minh của kẻ thù để bắn vào.

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;có tương đương với move = 11 + moveSpeed;không? Nếu không thì nó trông giống như một con bot tốt;)
vỗ tay vào

@ConfuseMr_C Haha vâng, cũng vậy, tôi đoán tôi chỉ chọn cái đầu tiên để dễ đọc, làm rõ hơn rằng nó di chuyển ít hơn một lần di chuyển tối đa từ điểm bắt đầu. Cũng giúp dễ dàng thay thế tất cả 12 bằng 15 nếu kích thước của bản đồ thay đổi hoặc bất cứ điều gì
Cain

2
Ờ được rồi. Tất cả chúng ta đều là lập trình viên ở đây nên tôi rất ngạc nhiên khi không có ai khác nhắc đến nó: P
vỗ tay vào

3

Alexander Hamilton

Nếu anh ta không thắng trong vòng đầu tiên, có thể sẽ chết

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

Aaron Burr

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;

Cầu thủ chạy cánh bắn ra một sự lây lan giới hạn phạm vi kẻ thù. Anh ta cũng chạy về phía kẻ thù.

Chỉ cần để lại đây để đẩy thiết lập lại.


2

SMG

Súng của anh ấy là vỏ bọc của anh ấy. Thật không may, nó dường như chặn tầm nhìn của anh ấy. Anh ấy cũng rất giỏi trong việc tận dụng việc đứng yên để tải lại nhanh hơn và có được những cú đánh thêm.

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

Vì điều này không bao giờ tải lại, sẽ tốt hơn nếu bạn không lãng phí bất kỳ điểm nào về tốc độ tải lại và thay vào đó mua thêm đạn.
QuadrExAtt

@QuadrExAtt: Tải lại là tự động khi bạn hết ảnh.
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
Này "yourShots" của nó không phải là myShots của tôi, bây giờ tôi nghĩ về nó "myShots" sẽ tốt hơn lol, ồ và di chuyển không phải là một mảng chỉ là một số duy nhất
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 tin vào những viên đạn không thương tiếc ở khắp mọi nơi mà anh ta nghĩ rằng kẻ thù của mình có thể, nhưng anh ta hơi chậm.


1

ASCIIGunInWest

Bắn 2 phát một lượt và đoán xem kẻ địch có thể đi đâu dựa trên tốc độ anh ta di chuyển. Hãy tha thứ cho tôi nếu có bất kỳ lỗi nào, tôi đã không mã hóa nhiều bằng 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
}

EDIT: Rõ ràng bot của tôi (chỉ của tôi) không thể được sử dụng trong JSFiddle. Có ai biết tại sao điều này? Tôi đang sử dụng tất cả các điểm của mình cho tay súng của mình, vì vậy tôi không nghĩ rằng mình đã bị loại.


Điều này có lẽ sẽ hữu ích hơn rất nhiều 3 năm trước, nhưng khi tái cấu trúc một người chạy giải đấu KotH, tôi nghĩ rằng tại sao: Bạn đã khai báo một hàm main (), trong phạm vi mà một hàm chính đã được tạo bởi người chạy giải đấu ( yeah, chi tiết thực hiện).
eaglgenes101

Ngoài ra, vòng lặp for của bạn có hình dạng kỳ lạ. Dòng thứ sáu nên có dấu chấm phẩy trong đó.
eaglgenes101
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.