가위바위보 게임
코드배틀
In English, please.
게임의 규칙을 확인하시고, 아래 함수들을 채운 후, 대결상대를 선택하고, 게임시작 버튼을 누르면 배틀이 시작됩니다.
가위는 1, 바위는 2, 보는 3
가위는 보를 이기고, 바위는 가위를 이기고, 보는 바위를 이깁니다.
가위로 이기면 1점, 바위로 이기면 2점, 보로 이기면 3점 획득

나의 코드 (JavaScript)

대결상대

온라인 대전은 로그인한 회원끼리 진행합니다. 로그인하면 참여할 수 있습니다.
나 또는 상대방의 화면이 Visible 상태가 아니면 통신 속도가 느려집니다.
TURN
WIN
0
LOSE
0
ROUND
WIN
0
LOSE
0
GAME
WIN
0
LOSE
0

게임 로그

최근 로그가 위에 표시됩니다.

코드 아레나

저장한 코드를 출전시키면 다른 회원이 도전합니다. 내가 없는 동안에도 전적이 쌓입니다.
출전과 도전은 로그인한 회원만 할 수 있습니다. 목록과 코드는 로그인 없이 볼 수 있습니다.
출전 목록 보기

이 게임의 전략은 어디서 시작하나

가위바위보는 운이라고들 합니다. 그런데 이 게임은 이긴 손에 따라 점수가 다르고 한 라운드가 100턴입니다. 100턴이면 운이 평균으로 수렴하고, 남는 것은 점수 규칙과 상대의 습관입니다. 아래는 전략 셋과 각각이 실제로 낸 성적입니다.

1. 이기는 것보다 무엇으로 이기는지가 중요하다

가위로 이기면 1점, 바위로 이기면 2점, 보로 이기면 3점입니다. 그래서 승률이 같아도 점수가 같지 않습니다. 내가 낸 손과 상대가 낸 손을 놓고 점수 차이를 적어 보면 이렇습니다.

내 점수 − 상대 점수
내 손 \ 상대 손 가위 바위
가위 0-2+1
바위 +20-3
-1+30

보의 줄을 보세요. 바위를 잡으면 3점을 얻고 가위에게 잡히면 1점만 잃습니다. 상대가 세 손을 고르게 낸다면 보의 기대값은 턴당 +0.67이고 가위와 바위는 둘 다 −0.33입니다. 그래서 이 한 줄이 무작위 상대를 이깁니다.

function onTurnStart() {
	return 3;              // 늘 보
}

function onTurnEnd(result) {}

RANDOM 전승 LEVEL 1·2·3 전패

2. 습관은 읽힌다. 내 습관도

보만 내는 것은 습관입니다. 상대가 내 빈도를 세기 시작하면 가위로 갈아탑니다. 반대로 상대의 습관을 읽는 쪽으로 가 봅니다. 상대가 방금 낸 손을 이기는 손을 다음 턴에 냅니다.

var next = 2;

function onTurnStart() {
	return next;
}

function onTurnEnd(result) {
	next = result.opponentchoice % 3 + 1;
}

LEVEL 1 전승 LEVEL 2·3 전패

LEVEL 1은 내 직전 수를 보지 않으므로 이 규칙에 그대로 걸립니다. 그런데 LEVEL 2는 내 최근 50턴의 분포를 세고, 그 분포에 대해 점수까지 계산해서 확률적으로 응답합니다. 고정된 규칙은 분포를 남기고, 분포는 읽힙니다.

3. 읽을 것이 없는 분포

그럼 읽을 것을 주지 않으면 됩니다. 어떤 손을 얼마나 낼 때 상대가 무엇으로 대응해도 이득을 못 보는 비율이 하나 있습니다. 위 표에서 세 손의 기대값을 모두 0으로 만드는 비율을 풀면 가위 2분의 1, 바위 6분의 1, 보 3분의 1이 나옵니다.

function onTurnStart() {
	var r = Math.random();

	if (r < 1 / 2) { return 1; }       // 가위 50%
	if (r < 1 / 2 + 1 / 6) { return 2; }  // 바위 16.7%
	return 3;                          // 보 33.3%
}

function onTurnEnd(result) {}

RANDOM · LEVEL 1·2·3 반반

가장 점수가 낮은 가위를 절반이나 냅니다. 보가 3점이라 매력적인 만큼, 그 보를 잡는 가위도 그만큼 필요하기 때문입니다. 이 비율을 지키면 상대가 무엇을 하든 기대값이 0입니다. 다른 전략이 LEVEL 2·3에 전패하는 자리에서 이것만 반반으로 버팁니다. 대신 약한 상대도 이기지 못합니다.

4. 여기서부터는 당신 차례

균형은 지지 않는 방법이고 이기는 방법은 아닙니다. 이기려면 상대의 치우침을 파고들어야 하는데, 파고드는 순간 내 분포도 치우쳐서 상대에게 읽힙니다. 실제로 균형을 지키다가 상대가 치우쳐 보일 때만 이탈하는 코드를 만들어 보면 RANDOM과 LEVEL 1을 압도하지만 LEVEL 2·3에는 전패합니다. 언제 파고들고 언제 균형으로 돌아올지, 상대가 나를 읽고 있다는 것을 무엇으로 알아챌지가 남은 문제입니다. 위 코드를 에디터에 붙여 넣고 여기서부터 고쳐 보세요.

대전은 이렇게 돕니다

  • 코드배틀은 내가 작성한 코드와 상대가 작성한 코드가 일대일로 대결하는 방식이며, 언어는 JAVASCRIPT 입니다.
  • 코드를 작성하고, 대결상대를 RANDOM, LEVEL1, LEVEL2, LEVEL3, 온라인 상대 중에서 선택한 후 게임시작 버튼을 누르면 대결이 시작됩니다.
  • 대결은 game이며, 1 game은 5 round로 구성되고, 1 round는 100 turn으로 구성됩니다.

위 코드는 onTurnStart와 onTurnEnd만 담고 있습니다. 나머지 네 훅(onGameStart, onRoundStart, onRoundEnd, onGameEnd)은 비워 두면 됩니다. 여섯 개가 모두 있어야 실행됩니다.

성적은 상대별로 60판(라운드 300번)을 돌려 측정했고 저장소의 테스트가 실제 규칙 엔진으로 매번 다시 확인합니다. LEVEL 1을 뺀 상대에는 무작위가 섞여 있어 판마다 달라지므로, 전승·전패는 60판에서 95% 이상을 뜻합니다.