Player 1과 Player 2의 코드가 일대일로 대결하는 방식이며, 프로그래밍 언어는 JAVASCRIPT 입니다.
게임의 규칙을 확인하시고, Player 1과 Player 2의 코드를 작성하신 후, 게임시작 버튼을 누르면 배틀이 시작됩니다.
1 Game은 7 Round로 구성되고, 1 Round는 9이닝이 모두 끝날 때까지 Turn이 반복됩니다.
각 Game, Round, Turn의 시작과 끝에서 onGameStart, onRoundStart, onTurnStart, onTurnEnd, onRoundEnd, onGameEnd 함수가 호출되며, 사용자는 각 함수에 자신의 로직을 구현하면 됩니다.
게임의 규칙에 맞게 기본 전략을 세우고, 상대의 패턴을 분석하여 onTurnStart에서 최선의 선택을 반환하는 것이 승리의 핵심요소입니다.
(상대 플레이어의 코드에 영향을 미치는 등의 부정 행위 시도 시 패배 처리 됩니다.)
게임 규칙
- 각 Turn에서, 내가 수비라면 공을 어디에 던질지, 내가 공격이라면 배트를 어디로 휘두를지를 선택합니다.
0,0 | 0,1 | 0,2 |
1,0 | 1,1 | 1,2 |
2,0 | 2,1 | 2,2 |
- 수비(투수): 위의 9개 값 중 하나, 또는 범위를 벗어난 값(예:[3,3])을 선택할 수 있습니다. 범위를 벗어난 값은 볼로 처리됩니다. 그리고 정중앙([1,1])을 제외한 나머지는 볼이 될 확률이 있습니다. 4개의 코너([0,0], [0,2], [2,0], [2,2])는 5/9의 확률로 볼이 되고, 4개의 사이드([0,1], [2,1], [1,0], [1,2])는 1/3의 확률로 볼이 됩니다.
- 공격(타자): 위의 9개 값 중 하나, 또는 범위를 벗어난 값(예:[3,3])을 선택할 수 있습니다. 범위를 벗어난 값은, 배트를 휘두르지 않은 것으로 처리됩니다.
- Turn의 결과는 4가지 중 하나입니다.
- 홈런: 투수의 선택과 타자의 선택이 일치하는 경우
- 안타: 투수의 선택의 행(row)과 타자의 선택의 행이 일치하는 경우(예: [1,0]과 [1,2]). 안타는 무조건 1루타입니다.
- 스트라이크: 투수가 스트라이크를 던졌는데 타자가 못 친 경우, 또는 투수가 볼을 던졌는데 타자가 휘두른 경우
- 볼: 홈런, 안타, 스트라이크가 아닌 경우
- 기본적인 진행 규칙은 "진짜 야구"와 유사합니다.
- 3 스트라이크면, 1 아웃입니다.
- 4 볼이면, 볼넷으로 주자가 진루합니다.
- 3 아웃이면, 공수교대입니다.
- 안타 또는 볼넷이면, 1루 진루입니다.
- 1루, 2루, 3루, 홈으로 구성되고, 주자가 1루 -> 2루 -> 3루 -> 홈으로 오면 득점합니다.
- 홈런이면, 타자 포함 모든 루상의 주자가 홈으로 들어오고, 득점이 됩니다.
- 9 이닝까지이고, 연장전은 없습니다.
class {
/**
* 코드는 JAVASCRIPT 로 작성해 주시고, 위의 첫줄과 on...() 메소드의 이름은 변경하지 말아주세요.
*/
/**
* 플레이어의 이름 또는 닉네임을 입력해 주세요.
* 그대로 두면 Player1 또는 Player2로 replace 됩니다.
* player_name은 printLog 할때 누구의 로그인지를 구분하기 위해 사용할 수 있고,
* Score Board에 표시됩니다.
*/
player_name = "_will be replaced_";
/**
* 게임이 시작되면 호출됩니다.
* 게임 중에 사용할 변수들의 초기화를 여기서 합니다.
*/
onGameStart() {
// printLog(string)는 플레이 영역 하단의 게임 로그 영역에 텍스트를 출력하는 함수입니다.
printLog(this.player_name+": onGameStart!");
}
/**
* 라운드가 시작되면 호출됩니다.
* 1번의 게임은 7번의 라운드를 실행합니다.
* 1라운드는 야구 한 경기(9이닝)를 의미합니다.
*/
onRoundStart() {
printLog(this.player_name+": onRoundStart!");
}
/**
* 턴이 시작되면 현재 상태(data)와 함께 호출되며,
* 이번 턴에서 나의 선택이 무엇인지를 리턴해야 합니다.
* 한번의 라운드에 대해 9이닝이 끝날때까지 턴이 반복됩니다.
*
* @param data
* data.inning: 현재 이닝. 1~9
* data.is_offence: 공격/수비 여부. true:공격, false:수비
* data.ball_count: 볼카운트. {s:0, b:0, o:0}
* data.score: 현재 점수. {me:0, op:0}
* data.runner: 주자의 수. 0~3
*
* @return [row, col]
* row: 0 or 1 or 2
* col: 0 or 1 or 2
* 범위에서 벗어나는 좌표 또는 null 을 입력하면,
* 수비(투수)인 경우, 볼(ball)을 선택한 것으로,
* 공격(타자)인 경우, 스윙하지 않은 것으로 간주합니다.
*/
onTurnStart(data) {
// row: 0 or 1 or 2 or 3 중 랜덤 선택. 3은 범위 밖의 선택.
let row = Math.floor(Math.random() * 4);
// col: 0 or 1 or 2 or 3 중 랜덤 선택. 3은 범위 밖의 선택.
let col = Math.floor(Math.random() * 4);
printLog(this.player_name+": onTurnStart! is_offence:"+data.is_offence+", choice:["+row+", "+col+"]");
return [row, col];
}
/**
* 턴이 끝나면 호출되며, 턴의 결과를 받아봅니다.
*
* @param result
* result.is_offence: true(offence), false(defence)
* result.choice: {me:[0,0], op:[0,0]}
* 범위를 벗어난 값이었다면 null로 옵니다.
* result.result: 0 or 1 or 2 or 3
* 0: 스트라이크
* 1: 볼
* 2: 안타
* 3: 홈런
* result.ball_count: 볼카운트. {s:0, b:0, o:0}
* o가 3이면 공수가 교대되어, 다음 onTurnStart() 호출시 리셋된 볼카운트 데이터가 전달됩니다.
* result.score: 현재 점수. {me:0, op:0}
* result.runner: 주자의 수. 0~3
*/
onTurnEnd(result) {
printLog(this.player_name+": onTurnEnd! is_offence:"+result.is_offence+", choice:"+JSON.stringify(result.choice)+", result:"+result.result);
}
/**
* 라운드가 끝나면 호출되며, 라운드의 결과를 받아봅니다.
* @param result
* result.win: -1(졌을때) or 0(비겼을때) or 1(이겼을때)
* result.score: 현재 점수. {me:0, op:0}
* result.wincnt: 이긴 횟수
* result.losecnt: 진 횟수
*/
onRoundEnd(result) {
printLog(this.player_name+": onRoundEnd! win:"+result.win+", score:"+JSON.stringify(result.score));
}
/**
* 게임이 끝나면 호출되며, 게임의 결과를 받아봅니다.
* @param result
* result.win: -1(졌을때) or 0(비겼을때) or 1(이겼을때)
*/
onGameEnd(result) {
printLog(this.player_name+": onGameEnd! win:"+result.win);
}
}