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


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.