서쪽에서 가장 빠른 총, 언덕의 왕 도전


22

이것은 라운드 로빈에서 언덕의 왕 도전입니다. 서부의 최고의 총잡이를 찾는 것은 전투입니다!

이 콘테스트에서 경쟁하려면 두 가지 기능을 수행해야합니다. 첫 번째는 총잡이의 특성을 설정하고 두 번째는 총잡이의 주요 논리 기능입니다.

속성 기능

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 포인트가 소비되므로 15 포인트를 소비하여 라운드 당 최대 6 발의 샷을 얻을 수 있습니다. 이 속성을 올리면 numbOfBullets총이 보유 할 수있는 총알보다 더 많은 총알을 쏠 수 없으므로 생산성 이 떨어 집니다.

  • moveSpeed -총잡이 한 번에 얼마나 많은 공간을 달릴 수 있는지 정의합니다.

    기본 및 최소값은 1입니다. 1 씩 증가 할 때마다 15 포인트를 사용하여 최대 6 개의 속도로 3 포인트가 소비됩니다. 총잡이는 자신의 최대 이동 속도까지 매번 왼쪽이나 오른쪽으로 달릴 수 있습니다. 그는 또한 여전히 서서 보너스를줍니다 (나중에 자세히 설명).

위의 예제 함수에는 총알에 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 점, 66 턴 한계에 도달하면 0 점을 획득 할 수 있습니다. 촬영 필드의 너비는 24 칸입니다 (1-24 포함). 플레이어를 때리고 한 라운드를이기려면 현재 서있는 곳과 같은 공간에서 쏴야합니다.

다음은 결투의 작동 방식에 대한 단계별 가이드입니다. 여기에는 모든 유효하지 않은 명령과 특수 규칙이 포함됩니다.

  • 각 결투가 시작될 때 두 선수 모두 12 칸에 배치되며 리볼버는 완전히 적재됩니다
  • 주요 기능이 호출되고 총잡이가 첫 번째 이동 명령을 내리고 촬영 위치를 선택하십시오.
  • 먼저 총잡이가 새로운 위치로 이동합니다. 이동 명령에 유효하지 않은 입력이있는 경우 (1보다 낮거나 24보다 높거나 24보다 더 많은 공간을 이동했거나 허용 된 경우) 동일한 위치를 유지합니다.
  • 이전 턴에 총알이 없거나 재 장전을 요청한 경우 총잡이 재 장전주기에 들어갑니다. 그는 당신이 설정 한만큼 많은 차례 동안 다시로드reloadSpeed 가치 . 정지하기로 결정한 경우 (이전에 서 있거나 유효하지 않은 값을 반환 할 때와 동일한 공간 정수를 반환) 리로드 카운터는 1이 아닌 2 턴 동안 감소합니다.
  • 이제 촬영 값을 확인할 수 있습니다. 매 턴마다 원하는만큼의 촬영 위치를 입력 할 수 있습니다. 매번 턴당 총 발사 횟수와 총알 수에 의해 결정되는 실제 유효량으로 차단됩니다. 더 낮은 것). 너의shotsPerTurn이 턴을 계속하기로 결정하면 당신 가치는 1 씩 증가합니다. 그래서 당신이 멈춰 있으면 여분의 샷을 만들 수 있습니다. 당신이 재 장전 사이클에 있다면 당신은 0 발의 샷을가집니다.
  • 이제 실제 촬영이 진행됩니다. 두 가지 방법이 있습니다. 두 총잡이 같은 이동 속도 통계를 가지면 둘 다 동시에 쏴서 서로를 동시에 죽일 수 있습니다. 이동 속도 통계가 다른 경우 이동 속도 통계가 높은 봇이 먼저 슈팅을 시작하고 상대를 죽이면이 라운드에서 승리합니다. 총잡이가 한 라운드에서 하나 이상의 총알을 쏠 수 있다면 예를 들어 더 많은주기를 제외하고는 위와 동일한 규칙을 따릅니다. bot1에는 총알이 3 개 있고 더 빠르며 봇 2에는 총알이 2 개 있다고합니다. :

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

만약 같은 사이클에서 Bot1이 Bot2를 쳤다면 Bot2도 Bot1을 쳤을 때만 동점 일 것입니다.

규칙

먼저 Calvin의 Hobbies 항목에서 여기에 적용되는 몇 가지 규칙을 복사합니다.

새 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

그리고 여기 컨트롤러가 있습니다 : GAME CONTROLLER 입니다. 링크를 열고 봇이로드 될 때까지 기다린 다음 전투에서 원하는 것을 선택하고 (아마 모두) 시작 버튼을 누릅니다.

또한 테스트 봇을 내 대답으로 경쟁에 넣을 수 있으며 답의 구조가 어떻게 보이는지에 대한 예를 제공합니다. 참고로, 작은 실수를하고 답변을 편집하면 stackexchanges 알고리즘이 그것을 즉시 선택하지 않을 수 있으며 stackexchange에 의해 생성 된 컨트롤러가 사용하는 사이트가 업데이트되지 않습니다 (그러나 나중에 또는 더 큰 변경을 제안하는 경우 제안합니다) 끝 부분에 텍스트를 추가하십시오). 여기 사이트가 있습니다 : codelink


나는 두 봇이 서로 싸우는 순간에 둘 다 선택할 수없는 것 같습니다. 둘 다 선택하면 시작을 눌러도 아무것도하지 않는 것 같습니다. 내 봇이 잘못되었는지 아닌지 확실하지 않습니다. 컨트롤러 시간이 오래
— 걸림

답변을 편집 할 때 내 질문의 끝에서 설명했듯이 stackexchange 코드 생성기에서 아직 편집하지 않았습니다. 왜냐하면 변경 사항이 있음을 알지 못했기 때문에 답변 끝에 텍스트를 추가하면 작동합니다
— Vajura

1
나는 (손가락을 엇갈리게) 그 오류를 수정했다고 생각합니다. 컨트롤러가 정확한 출력을 제공하지 않고 아무 것도 조용히하지 않는다고 알려주지 않으면 오류를 찾기가 어렵습니다
— euanjt

8
코드 <!---->블록을 "보이지 않고"보이지 않게 분리 하는 데 사용할 수 있습니다 !.
— KRyan

1
오류를 발견했습니다. "play1 = maskedEval (players [a] .code, params)"를 "play1 = maskedEval (playingPlayers [a] .code, params)"로 변경-play2와 동일
— QuadrExAtt

답변:


6

판다 루스

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;

판다 루스는 속도에 의존하여 총알의 길을 벗어나고, 이전의 적을 움직여 어디로 갈지 추측합니다.


확인해야합니다. 이제 점수에 버그가있어 모든 것이 올바르게 작동합니다. 내 로봇이 LOL을 이겼다는 것은 매우 이상했습니다.
— Vajura

아, 그리고 당신의 제출은 또 다른 이상한 일을했습니다. 소수점 이하로 제어기에 반올림을 추가 한 이동 명령의 숫자
— Vajura

나는 왜 그것이 십진수를 출력했는지 모르겠다 :-) 내일 그것을 개선하려고 노력할 것이다
— euanjt

나는 컨트롤러를
— 깨뜨 렸기

그래, 미안, 어쨌든 나는 (마침내) 지금 작동하고 (테스트 봇을 때리는) :)
— 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 2016 년

이상 하네. 구문 강조를 추가하는 것은 HTML 주석 일 뿐이며 프로그램을 중단해서는 안됩니다.
— ProgramFOX

몰라,하지만 프로그램은 더 이상 내 코드를로드하지 않았습니다.
— Marcus Blättermann 2016 년

아, 아마 파서가 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 2016

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;아니오 와 동일 합니까? 그렇지 않으면 이것은 좋은 봇처럼 보입니다.)
— clap

@ConfusedMr_C Haha 예, 동일합니다. 가독성을 위해 첫 번째 것을 선택했다고 생각합니다. 시작점에서 최대 moveSpeed보다 1만큼 적게 움직입니다. 또한지도의 크기가 바뀌거나 다른 것이 있으면 12를 15로 바꾸는 것이 더 쉬워집니다.
— Cain

2
오 알았어 우리는 모두 여기 프로그래머이므로 다른 사람이 언급하지 않은 것에 놀랐습니다. P
— clap

3

알렉산더 해밀턴

그가 1 라운드에서 이기지 못하면 아마 죽을 것입니다

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 2016 년

@QuadrExAtt : 샷이 부족하면 다시로드가 자동으로 수행됩니다.
— MegaTom 2016 년

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는"오, LOL 더 좋았을 것이다 그것에 대해 생각하고 배열에게 그것의 단 하나의 숫자를 밤은 이동하는 것이
— Vajura

1

다이 포 버스

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 발을 발사하고, 얼마나 빨리 움직일 지에 따라 적의 위치를 ​​추측합니다. 오류가 있으면 용서하십시오 .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 토너먼트 러너를 리팩토링하는 이유는 다음과 같습니다. 예, 구현 세부 사항).
— eaglgenes101

또한 for 루프의 모양이 이상합니다. 여섯 번째 줄에는 세미콜론이 있어야합니다.
— eaglgenes101
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.