게임의 규칙을 확인하시고, 아래 함수들을 채운 후, 대결상대를 선택하고, 게임시작 버튼을 누르면 배틀이 시작됩니다.
상대와 내가 각각 2장의 카드(화투)를 받게 되고, 2장의 카드의 조합으로 승패를 결정합니다.
카드는 총 20장이고, 1부터 10까지의 숫자를 의미하는 카드가 2쌍인데, 숫자만으로 구분할 수 있도록 1부터 10, 그리고 11부터 20까지의 숫자로 구성된다고 전제합니다. 예를 들어, 15는 5를 의미하는 두번째 카드입니다.
game이 시작될때 money를 받고, round가 시작될 때 내 카드 2장과 상대 카드 1장을 받고, 각 turn에서 raise 또는 call 또는 die를 선택해야 합니다.
raise는 table money를 올리는 action이고, call은 상대방이 raise한 money만큼만 받고 round를 끝내고 승패를 확인하겠다는 action이며, die는 상대방의 카드 확인을 포기하고 기본 money만큼만 지불한 후 round를 포기하는 action입니다.
코드배틀은 내가 작성한 코드와 상대가 작성한 코드가 일대일로 대결하는 방식이며, 언어는 JAVASCRIPT 입니다.
코드를 작성하고, 대결상대를 LEVEL1, LEVEL2, LEVEL3, 온라인 상대 중에서 선택한 후 게임시작 버튼을 누르면 대결이 시작됩니다.
대결은 game이며, 1 game은 최대 200번의 round로 구성되는데 round가 반복되는 동안 나 또는 상대의 money가 모두 떨어지면 game이 끝납니다. 그리고, 1 round는 몇번의 turn으로 구성되는데 각각의 턴에서, raise를 하여 table money를 올리고 상대의 turn으로 넘기거나, call 또는 die를 하여 round를 끝낼 수 있습니다.
game의 시작과 끝에서 onGameStart, onGameEnd 함수가 호출되고, 각 round의 시작과 끝에서 onRoundStart, onRoundEnd 함수가 호출되며, 각 turn에서 onTurnStart 함수가 호출됩니다. onGameStart => onRoundStart => onTurnStart => onRoundEnd => onGameEnd. 사용자는 각 함수에 자신의 로직을 구현하면 됩니다.
게임의 규칙에 맞게 기본 전략을 세우고, 상대의 패턴을 분석하여 onTurnStart에서 최선의 선택을 반환하는 것이 승리의 핵심요소입니다.
11
12
13
14
15
16
17
18
19
20
서열 | 종류 | 이름 | 설명 |
1위 | 광땡 | 38광땡 | 카드 2장이 3과 8일때, 섯다 최강의 조합 |
2위 | 광땡 | 18광땡 | 카드 2장이 1과 8일때 |
3위 | 광땡 | 13광땡 | 카드 2장이 1과 3일때 |
4위 | 땡 | 장땡 | 카드 2장이 10과 20일때 |
5위 | 땡 | 9땡 | 카드 2장이 9와 19일때 |
6위 | 땡 | 8땡 | 카드 2장이 8와 18일때 |
7위 | 땡 | 7땡 | 카드 2장이 7와 17일때 |
8위 | 땡 | 6땡 | 카드 2장이 6와 16일때 |
9위 | 땡 | 5땡 | 카드 2장이 5와 15일때 |
10위 | 땡 | 4땡 | 카드 2장이 4와 14일때 |
11위 | 땡 | 3땡 | 카드 2장이 3와 13일때 |
12위 | 땡 | 2땡 | 카드 2장이 2와 12일때 |
13위 | 땡 | 1땡 | 카드 2장이 1와 11일때 |
14위 | 끗 | 9끗 | 카드 2장의 합의 일의 자리가 9인 경우. (예: 5와 14, 또는 3과 6 등). 끗이 같으면 큰수가 더 큰쪽이 승리. |
15위 | 끗 | 8끗 | 카드 2장의 합의 일의 자리가 8인 경우. (예: 5와 13, 또는 6과 2 등) |
16위 | 끗 | 7끗 | 카드 2장의 합의 일의 자리가 7인 경우. (예: 2와 15, 또는 3과 4 등) |
17위 | 끗 | 6끗 | 카드 2장의 합의 일의 자리가 6인 경우. (예: 5와 11, 또는 1과 5 등) |
18위 | 끗 | 5끗 | 카드 2장의 합의 일의 자리가 5인 경우. (예: 2와 13, 또는 3과 2 등) |
19위 | 끗 | 4끗 | 카드 2장의 합의 일의 자리가 4인 경우. (예: 4와 10, 또는 1과 3 등) |
20위 | 끗 | 3끗 | 카드 2장의 합의 일의 자리가 3인 경우. (예: 1과 12, 또는 2와 1 등) |
21위 | 끗 | 2끗 | 카드 2장의 합의 일의 자리가 2인 경우. (예: 2와 10, 또는 3과 9 등) |
22위 | 끗 | 1끗 | 카드 2장의 합의 일의 자리가 1인 경우. (예: 1과 10, 또는 5와 6 등) |
23위 | 끗 | 망통 | 카드 2장의 합의 일의 자리가 0인 경우. (예: 1과 9, 또는 3과 7 등) |
/**
* 코드는 JAVASCRIPT 로 작성해 주세요.
*/
var who_first = "";
/**
* 게임이 시작되면 호출됩니다.
* 게임 중에 사용할 변수들의 초기화를 여기서 합니다.
* @param data
* data.my_money: 나의 보유금액
* data.op_money: 상대방의 보유금액
*/
function onGameStart(data) {
// print(string)는 플레이 영역 하단의 게임 로그 영역에 텍스트를 출력하는 함수입니다.
print("onGameStart!");
}
/**
* 라운드가 시작되면 호출됩니다.
* 한번의 라운드는 섯다 한판을 의미하며, 섯다 한판을 위해 필요한 정보들을 받습니다.
* @param data
* data.my_money: 나의 보유금액
* data.op_money: 상대방의 보유금액
* data.my_cards: 나의 패 2장의 번호. [첫번째패 번호, 두번째패 번호]
* data.op_card: 상대방의 패 1장의 번호.
* data.who_first: 누가 선인가. "me"이면 나, "op"이면 상대방.
*/
function onRoundStart(data) {
print(
"onRoundStart!"
+" my_money:"+data.my_money+", op_money:"+data.op_money
+", my_cards:["+data.my_cards[0]+","+data.my_cards[1]+"]"
+", op_card:"+data.op_card+", who_first:"+data.who_first
);
who_first = data.who_first;
}
/**
* 턴이 시작되면 호출됩니다.
* 한번의 턴은 raise or call or die 를 선택하는 상황을 의미합니다.
* @param data
* data.my_cards: 나의 패 2장의 번호. [첫번째패 번호, 두번째패 번호]
* data.op_card: 상대방의 패 1장의 번호.
* data.op_turn_result: 상대방 턴의 결과. 상대방 코드의 onTurnStart()의 리턴값.
* @return {
* "action": "raise" or "call" or "die". op_turn_result가 null일때는 raise 또는 die만 가능.
* "money": raise일때 상대 베팅 받고 내가 베팅할 금액의 합, call일때 상대가 베팅한 금액, die일때 기본금액 1
* }
*/
function onTurnStart(data) {
// 아래의 샘플코드는, 내가 선이고 첫턴일때만 raise하고, 그외에는 모두 call만 하도록 간단하게 작성되어 있습니다.
// 더 나은 알고리즘을 작성하여 action과 money를 결정해 주세요.
var result = {};
if (who_first == "me" && data.op_turn_result == null) {
result["action"] = "raise";
result["money"] = 1;
} else { // who_first == "op"
result["action"] = "call";
result["money"] = data.op_turn_result.money;
}
// 로그 출력
var op_turn_str;
if (data.op_turn_result == null) {
op_turn_str = "op_turn{ null }";
} else {
op_turn_str = "op_turn{ action:"+data.op_turn_result.action+", money:"+data.op_turn_result.money+" }";
}
print("onTurnStart! "+op_turn_str+", my_return: { action:"+result.action+", money:"+result.money+" }");
return result;
}
/**
* 라운드가 끝나면 호출되며, 라운드의 결과를 받아봅니다.
* 나 또는 상대방의 턴 결과가 raise가 아닐때(call or die) 라운드가 종료되며 누군가는 돈을 법니다.
* @param data
* data.win: -1(졌을때) or 1(이겼을때)
* data.last_turn_result: 마지막 턴의 결과
* data.who_last: 마지막 턴이 누구의 턴이었나. me or op
* data.my_money: 나의 보유금액
* data.op_money: 상대방의 보유금액
* data.my_cards: 나의 패 2장의 번호. [첫번째패 번호, 두번째패 번호]
* data.op_cards: 상대방의 패 2장의 번호. [첫번째패 번호, 두번째패 번호(상대 또는 내가 die일 경우는 0)]
*/
function onRoundEnd(data) {
print(
"onRoundEnd! win:"+data.win
+", last_turn { action:"+data.last_turn_result.action+", money:"+data.last_turn_result.money+", who:"+data.who_last+" }"
+", my_money:"+data.my_money+", op_money:"+data.op_money
+", my_cards:["+data.my_cards[0]+","+data.my_cards[1]+"]"
+", op_cards:["+data.op_cards[0]+","+data.op_cards[1]+"]"
);
}
/**
* 게임이 끝나면 호출되며, 게임의 결과를 받아봅니다.
* @param data
* data.win: -1(졌을때) or 0(비겼을때) or 1(이겼을때)
* data.my_money: 나의 보유금액
* data.op_money: 상대방의 보유금액
*/
function onGameEnd(data) {
print("onGameEnd! win:"+data.win+", my_money:"+data.my_money+", op_money:"+data.op_money);
print("----------------------------");
}