이것은 라운드 로빈에서 언덕의 왕 도전입니다. 서부의 최고의 총잡이를 찾는 것은 전투입니다!
이 콘테스트에서 경쟁하려면 두 가지 기능을 수행해야합니다. 첫 번째는 총잡이의 특성을 설정하고 두 번째는 총잡이의 주요 논리 기능입니다.
속성 기능
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
<!---->
블록을 "보이지 않고"보이지 않게 분리 하는 데 사용할 수 있습니다 !
.