게임의 규칙을 확인하시고, 아래 함수들을 채운 후, 대결상대를 선택하고, 게임시작 버튼을 누르면 배틀이 시작됩니다.
상대와 내가 각각 자신의 숫자(서로다른 3개의 숫자로 이뤄진 3자리수)를 정하고, 먼저 상대의 숫자를 맞추면 승리하는 게임입니다. 단, 동시에 맞춘 경우에는 더 큰 숫자를 가진 쪽이 승리합니다.
round가 시작될 때 자신의 숫자를 정해서 리턴하고, 매 turn이 시작될 때 상대의 숫자를 예측한 숫자를 리턴하면, turn이 종료될 때 예측한 숫자와 상대의 숫자를 비교한 결과값을 전달받게 됩니다.
3자리 숫자 각각에 대하여, 숫자와 자리가 모두 일치하면 strike, 숫자는 일치하는데 자리가 다르면 ball입니다.
코드배틀은 내가 작성한 코드와 상대가 작성한 코드가 일대일로 대결하는 방식이며, 언어는 JAVASCRIPT 입니다.
코드를 작성하고, 대결상대를 RANDOM, LEVEL1, LEVEL2, LEVEL3, 온라인 상대 중에서 선택한 후 게임시작 버튼을 누르면 대결이 시작됩니다.
대결은 game이며, 1 game은 31 round로 구성되고, 1 round는 숫자야구 한판을 의미하는데 누군가 상대 숫자를 맞추면 해당 round가 종료되고, 30번의 turn을 도는 동안 끝나지 않으면 더 큰 수를 가진 쪽이 승리하게 됩니다.
각 game, round, turn의 시작과 끝에서 onGameStart, onRoundStart, onTurnStart, onTurnEnd, onRoundEnd, onGameEnd 함수가 호출되며, 사용자는 각 함수에 자신의 로직을 구현하면 됩니다.
게임의 규칙에 맞게 기본 전략을 세우고, 상대의 패턴을 분석하여 onTurnStart에서 최선의 선택을 반환하는 것이 승리의 핵심요소입니다.
/**
* 코드는 JAVASCRIPT 로 작성해 주세요.
*/
var turnNumsSet = new Set();
/**
* 게임이 시작되면 호출됩니다.
* 게임 중에 사용할 변수들의 초기화를 여기서 합니다.
*/
function onGameStart() {
// printLog(string)는 플레이 영역 하단의 게임 로그 영역에 텍스트를 출력하는 함수입니다.
printLog("onGameStart!");
}
/**
* 서로다른 세자리 숫자 만들어서 리턴
*/
function getRandom3Digit() {
var num_pool = [0,1,2,3,4,5,6,7,8,9];
var nums = "";
for (var i=0; i<3; i++) {
var idx = Math.floor(Math.random() * num_pool.length);
nums += num_pool.splice(idx, 1);
}
return nums;
}
/**
* 라운드가 시작되면 호출됩니다.
* 1번의 게임은 11번의 라운드를 실행합니다. 1번의 라운드는 숫자야구게임 한판을 의미합니다.
* 라운드가 시작될때, 나의 숫자를 정해서 리턴해야 합니다.
* @return 나의 숫자(같은 숫자가 반복되지 않는 세자리 숫자)
*/
function onRoundStart() {
turnNumsSet.clear();
var ret = getRandom3Digit();
printLog("onRoundStart! my number is "+ret);
return ret;
}
/**
* 턴이 시작되면 호출됩니다.
* 1번의 라운드는 숫자야구게임 한판을 의미하며, 100번째 턴까지 승패가 안나면 무승부가 됩니다.
* @return 상대의 숫자를 맞추기 위해 이번 턴에 내가 예측한 숫자(같은 숫자가 반복되지 않는 세자리 숫자. string 타입으로.)
*/
function onTurnStart() {
var nums = getRandom3Digit();
for (var i=0; i<10; i++) {
if (turnNumsSet.has(nums)) {
nums = getRandom3Digit();
} else {
turnNumsSet.add(nums);
break;
}
}
printLog("onTurnStart! my choice is "+nums);
return nums;
}
/**
* 턴이 끝나면 호출되며, 턴의 결과를 받아봅니다.
* @param result
* result.result: [strike수, ball수]
* result.opponentchoice: 상대가 이번턴에 나의 숫자를 맞추기 위해 예측한 숫자
*/
function onTurnEnd(result) {
printLog("onTurnEnd! [strikes, balls]:"+result.result+", opponent's choice:"+result.opponentchoice);
}
/**
* 라운드가 끝나면 호출되며, 라운드의 결과를 받아봅니다.
* @param result
* result.win: -1(졌을때) or 0(비겼을때) or 1(이겼을때)
* result.wincnt: 이번 게임에서 몇번의 라운드를 이겼는가
* result.losecnt: 이번 게임에서 몇번의 라운드를 졌는가
* result.opponent_number: 라운드 시작할때 상대가 정한 숫자(내가 맞추려고 한 수)
*/
function onRoundEnd(result) {
printLog("onRoundEnd! win:"+result.win+", wincnt:"+result.wincnt+", losecnt:"+result.losecnt+", opponent's number:"+result.opponent_number);
}
/**
* 게임이 끝나면 호출되며, 게임의 결과를 받아봅니다.
* @param result
* result.win: -1(졌을때) or 0(비겼을때) or 1(이겼을때)
*/
function onGameEnd(result) {
printLog("onGameEnd! win:"+result.win);
printLog("----------------------------");
}