Player 1과 Player 2의 코드가 일대일로 대결하는 방식이며, 프로그래밍 언어는 JAVASCRIPT 입니다.
게임의 규칙을 확인하시고, Player 1과 Player 2의 코드를 작성하신 후, 게임시작 버튼을 누르면 배틀이 시작됩니다.
1 Game은 최대 99 Set로 구성되고, 1 Set는 코인이 다 소모될 때까지 Round가 반복됩니다. 1 Round는 한 판을 의미하며, 두 플레이어의 베팅 코인이 같아지거나 한쪽이 포기할 때까지 Turn이 반복됩니다.
1 Game은 20초의 제한시간이 있습니다. Set가 끝났을 때 20초를 넘었다면 Set를 더 진행하지 않고 게임을 종료하며, 그 때 더 많은 라운드를 승리한 플레이어가 게임에서 승리하게 됩니다.
각 Game, Set, Round, Turn의 시작과 끝에서 onGameStart, onSetStart, onRoundStart, onTurnStart, onRoundEnd, onSetEnd, onGameEnd 함수가 호출되며, 사용자는 각 함수에 자신의 로직을 구현하면 됩니다.(onTurnEnd는 없습니다.)
게임의 규칙에 맞게 기본 전략을 세우고, 상대의 패턴을 분석하여 onTurnStart에서 최선의 선택을 반환하는 것이 승리의 핵심요소입니다.
(상대 플레이어의 코드에 영향을 미치거나 시간을 지연하는 등의 부정 행위 시도 시 패배 처리 됩니다.)
게임 규칙
- 각 Set가 시작될 때, 1000 코인이 지급됩니다.
- 각 Round가 시작될 때, 두 플레이어 모두가 기본적으로 10 코인을 베팅합니다.
- 각 Turn에서, 내 카드 2장과 상대 카드 1장, 그리고 상대의 베팅 코인 수가 주어지고, 나의 베팅 코인 수를 리턴해야 합니다.
- 상대의 베팅 코인 수 이상이고, 내가 보유한 총 코인의 수 이하의 값을 리턴해야 합니다.
- 위 조건에 만족하지 않는 수를 리턴하거나, -1을 리턴하면, Round를 포기하게 되며 그때까지 베팅한 코인들이 상대에게 넘어갑니다.
- 상대의 베팅 코인 수보다 큰 값을 리턴하면, 판을 키우는 행위, 즉 raise를 한 것과 같습니다.
- 상대의 베팅 코인 수와 같은 값을 리턴하면, call을 한 것과 같습니다.
- 상대와 나의 베팅 코인 수가 같아지면, 아래에 나열된 카드 서열에 따라 승패가 결정되며, 승리한 쪽이 베팅 코인들을 모두 가져갑니다.
- 숫자 카드는 1부터 20까지의 수로 구성되며, 상대와 내 카드의 서열은 아래와 같습니다.(내림차순 정렬)
- 카드 2장이 10과 20일 때
- 카드 2장이 9과 19일 때
- 카드 2장이 8과 18일 때
- 카드 2장이 7과 17일 때
- 카드 2장이 6과 16일 때
- 카드 2장이 5과 15일 때
- 카드 2장이 4과 14일 때
- 카드 2장이 3과 13일 때
- 카드 2장이 2과 12일 때
- 카드 2장이 1과 11일 때
- 카드 2장의 합의 일의 자리가 9일 때. (예: 5와 14, 또는 3과 6 등). 해당 값이 같을 경우, 큰 수가 더 큰 쪽이 승리. (예: ['5' 와 4] < [3 과 '6'])
- 카드 2장의 합의 일의 자리가 8일 때
- 카드 2장의 합의 일의 자리가 7일 때
- 카드 2장의 합의 일의 자리가 6일 때
- 카드 2장의 합의 일의 자리가 5일 때
- 카드 2장의 합의 일의 자리가 4일 때
- 카드 2장의 합의 일의 자리가 3일 때
- 카드 2장의 합의 일의 자리가 2일 때
- 카드 2장의 합의 일의 자리가 1일 때
- 카드 2장의 합의 일의 자리가 0일 때
class {
/**
* 코드는 JAVASCRIPT 로 작성해 주시고, 위의 첫줄과 on...() 메소드의 이름은 변경하지 말아주세요.
*/
/**
* 플레이어의 이름 또는 닉네임을 입력해 주세요.
* 그대로 두면 Player1 또는 Player2로 replace 됩니다.
* player_name은 printLog 할때 누구의 로그인지를 구분하기 위해 사용할 수 있고,
* TURN / ROUND / SET(GAME) 현황판에 표시됩니다.
*/
player_name = "_will be replaced_";
/**
* 게임이 시작되면 호출됩니다.
* 게임 중에 사용할 변수들의 초기화를 여기서 합니다.
*/
onGameStart() {
// printLog(string)는 플레이 영역 하단의 게임 로그 영역에 텍스트를 출력하는 함수입니다.
printLog(this.player_name+": onGameStart!");
}
/**
* 세트가 시작되면 호출됩니다.
* 1번의 게임은 최대 99번의 세트를 실행합니다.
*
* @param data
* data.my_coins: 나의 코인 보유 수량
*/
onSetStart(data) {
printLog(
this.player_name+": onSetStart! my_coins:"+data.my_coins
);
}
/**
* 라운드가 시작되면 호출됩니다.
* 한번의 라운드는 한판을 의미하며, 그 한판을 위해 필요한 정보들을 받습니다.
*
* @param data
* data.my_coins: 나의 코인 보유 수량.
* data.op_coins: 상대방의 코인 보유 수량.
* data.my_cards: 나의 카드 2장의 번호. [첫번째 번호, 두번째 번호]
* data.op_card: 상대방의 카드 1장의 번호.
* data.first_turn: 내가 첫 턴인지 여부. true/false
* data.remain_round_count:
* 이번 세트의 남은 라운드 수. 0이면 이번 세트의 마지막 라운드임을 의미하고,
* 라운드가 끝난 후 남은 코인 수가 많은 플레이어가 세트의 승자가 됩니다.
*/
onRoundStart(data) {
printLog(
this.player_name+": onRoundStart!"
+" my_coins:"+data.my_coins+", op_coins:"+data.op_coins
+", my_cards:["+data.my_cards[0]+","+data.my_cards[1]+"]"
+", op_card:"+data.op_card+", first_turn:"+data.first_turn
+", remain_round_count:"+data.remain_round_count
);
}
/**
* 턴이 시작되면 호출됩니다.
* 상대가 베팅한 코인의 수를 보고 내가 얼마를 베팅할 것인지를 정하여 리턴합니다.
*
* @param data
* data.my_coins: 나의 현재 코인 보유 수량.
* data.op_coins: 상대방의 현재 코인 보유 수량.
* data.my_bet_coins: 내가 베팅한 코인 수.(내가 아직 베팅하지 않았으면 10)
* data.op_bet_coins: 상대가 베팅한 코인 수.(상대가 아직 베팅하지 않았으면 10)
*
* @result -1 또는 이번 라운드에 베팅할 코인의 수
* data.op_bet_coins 이상 data.my_coins 이하의 수를 리턴할 수 있습니다.
* -1 이거나, 위 조건에 맞지 않는 값을 리턴할 경우, 이번 라운드를 포기하게 되고, data.my_bet_coins만큼이 상대에게 넘어갑니다.
*/
onTurnStart(data) {
// 아래의 샘플코드는, 가능한 범위 안에서 랜덤하게 베팅할 코인수를 결정하는데,
// 약 20% 확률로 라운드를 포기하고, 약 30% 확률로 call을 하도록 간단하게 작성되어 있습니다.
// 더 나은 알고리즘을 작성해 주세요.
let min = data.op_bet_coins;
let max = data.my_coins;
let rand = Math.random();
let result = Math.floor(rand * (max - min + 1)) + min;
if (rand < 0.2) result = -1;
else if (rand < 0.5) result = min;
printLog(
this.player_name+": onTurnStart! "
+"my_coins: "+data.my_coins+", op_coins: "+data.op_coins
+", my_bet_coins: "+data.my_bet_coins+", op_bet_coins: "+data.op_bet_coins
+", result: "+result
);
return result;
}
/**
* 라운드가 끝나면 호출되며, 라운드의 결과를 받아봅니다.
* 두 플레이어의 베팅 코인 수가 같아지거나, 한쪽이 베팅을 포기하면, 라운드가 종료되며 누군가는 코인을 획득합니다.
*
* @param result
* result.win: -1(졌을때) or 0(비겼을때) or 1(이겼을때)
* result.my_coins: 나의 코인 보유 수량.
* result.op_coins: 상대방의 코인 보유 수량.
* result.op_cards: 상대방의 카드 2장의 번호. [첫번째 번호, 두번째 번호(상대 또는 내가 라운드를 포기한 경우는 0)]
*/
onRoundEnd(result) {
printLog(
this.player_name+": onRoundEnd! win:"+result.win
+", my_coins:"+result.my_coins+", op_coins:"+result.op_coins
+", op_cards:["+result.op_cards[0]+","+result.op_cards[1]+"]"
);
}
/**
* 세트가 끝나면 호출되며, 세트의 결과를 받아봅니다.
* 나 또는 상대방의 코인이 모두 소진되거나, 200 라운드가 실행된 경우에, 세트가 끝납니다.
*
* @param result
* result.win: -1(졌을때) or 0(비겼을때) or 1(이겼을때)
* result.my_coins: 나의 코인 보유 수량.
* result.op_coins: 상대방의 코인 보유 수량.
*/
onSetEnd(result) {
printLog(
this.player_name+": onSetEnd! win:"+result.win
+", my_coins:"+result.my_coins+", op_coins:"+result.op_coins
);
}
/**
* 게임이 끝나면 호출되며, 게임의 결과를 받아봅니다.
*
* @param result
* result.win: -1(졌을때) or 0(비겼을때) or 1(이겼을때)
*/
onGameEnd(result) {
printLog(this.player_name+": onGameEnd! win:"+result.win);
}
}