용코바코 게임즈 노트

개발 노트용코바코 체스고친 날

입문 AI는 열 수에 서너 번 아무 데나 둔다 — 용코바코 체스 AI 다섯 단계와 1:1 대결에서 정한 것

용코바코 체스의 AI 다섯 단계가 실제로 어떤 숫자로 갈리는지 코드에 적힌 그대로 옮겼습니다. 1:1 대결에서 방 만들기를 없애고 바로 짝을 지어 주게 된 까닭, 시계를 다른 무엇보다 먼저 붙인 까닭, 구경과 짧은 말을 그렇게 정한 까닭도 함께 적었습니다.

용코바코 체스는 「용코바코 전통 전략 시리즈」의 첫 게임입니다. 연습 · AI 대결 · 1:1 대결 세 모드가 있고, 설치나 가입 없이 브라우저에서 바로 둡니다. 이 글은 그 가운데 AI가 단계마다 어떻게 약해지는지와 낯선 사람끼리 두는 1:1 대결의 규칙을 왜 그렇게 정했는지를 적은 개발 기록입니다. 두는 법과 모드별 안내는 용코바코 체스 게임 소개에 정리해 두었습니다.

상대는 브라우저 안의 Stockfish입니다

AI 대결의 상대는 오픈소스 체스 엔진 Stockfish(Stockfish.js 10.0.2)입니다. 수를 서버로 보내 계산해 오지 않고, 엔진 파일이 통째로 브라우저에 내려와 화면과 따로 도는 작업자(Web Worker) 안에서 생각합니다. 그래서 엔진이 생각하는 동안에도 판이 멈추지 않고, 같은 시간에 몇 명이 AI와 두든 서버가 바빠지지 않습니다. 이 엔진은 한 줄로만 도는(단일 스레드) asm.js 판이라, 여러 줄로 도는 빌드처럼 사이트 전체에 보안 머리글을 따로 켤 필요도 없습니다.

엔진 파일을 끝내 받아 오지 못할 때를 위한 길도 하나 있습니다. 45초가 지나도 엔진이 준비되지 않으면, 둘 수 있는 수 가운데 체크메이트가 있으면 그것을, 없으면 가장 비싼 기물을 잡는 수를, 그것도 없으면 아무 수나 고르는 아주 단순한 손으로 대신 둡니다. 엔진이 없다고 판이 멈춰 서지 않게 하려는 장치입니다.

단계는 손잡이 둘로 나눴습니다

Stockfish에는 0부터 20까지의 실력 단계(Skill Level)가 있습니다. 낮출수록 엔진이 최선이 아닌 수를 일부러 섞어 고릅니다. 여기에 얼마나 멀리 읽는가를 같이 줄이고, 아래 두 단계에는 엔진에 묻지 않고 아무 수나 두는 확률을 하나 더 얹었습니다. 코드에 적힌 숫자 그대로입니다.

단계실력 단계읽는 만큼아무 수
입문01수 앞35%
초급33수 앞8%
중급86수 앞없음
상급150.8초 동안없음
최상급201.5초 동안없음

손잡이를 하나만 쓰면 사람과 두는 느낌이 나지 않습니다. 읽는 깊이만 줄이면 약해지긴 해도 수 고르는 버릇이 한결같아서 한 번 찾은 덫에 매번 똑같이 빠지고, 아무 수만 섞으면 앞뒤가 맞지 않는 수가 뒤죽박죽 나옵니다. 입문이 열 수 가운데 서너 수를 아무 데나 두는 것은 규칙을 막 익힌 사람도 이길 수 있게 맞춘 숫자입니다. 상급부터는 깊이 대신 생각하는 시간으로 묶었습니다 — 상급은 0.8초, 최상급은 1.5초 동안 읽을 수 있는 만큼 읽고 둡니다.

너무 빨리 두지 않게 기다립니다

입문 · 초급은 엔진이 몇 밀리초 만에 답을 냅니다. 그대로 두면 내가 손을 떼자마자 상대 기물이 움직여서, 무엇이 바뀌었는지 볼 틈이 없습니다. 그래서 생각한 시간을 합쳐 입문은 0.65초, 초급 0.6초, 중급 0.5초, 상급 0.2초를 채운 뒤에 둡니다. 최상급은 이미 1.5초를 생각하니 따로 기다리지 않습니다.

힌트는 단계와 상관없이 가장 센 엔진입니다

연습 대국에서 힌트 단추를 누르자 판 위에 e4 쪽으로 초록 화살표가 그어진 장면
힌트는 엔진이 1초 동안 읽고 고른 수를 초록 화살표로 가리킵니다

연습에서 「힌트」를 누르면 지금 상대가 입문이든 최상급이든 실력 단계 20으로 1초 동안 읽은 수를 보여 줍니다. 가장 강하게 읽은 수라서, 길이 안 보일 때 눌러 보면 내가 지나친 수가 무엇이었는지 드러납니다. 쓴 횟수는 판 아래에 기록되고, AI 대결에서는 힌트와 무르기를 쓸 수 없습니다. 무르기는 내 수와 그에 대한 AI의 답을 함께 물려서 다시 내 차례로 돌아옵니다.

1:1 대결 — 방을 없애고 바로 짝을 지었습니다

1:1 대결은 처음에 방을 만들고 코드나 링크를 보내 친구를 부르는 꼴로 만들었습니다. 만든 날 밤에 방향을 바꿨습니다. 「시작하기를 누른 사람끼리」 바로 이어 주는 쪽이 낫다는 판단이었고, 방 만들기 · 코드로 들어가기 · 링크 보내기 단추를 모두 걷어냈습니다.

지금은 「1:1 대결」을 누르면 서버의 상대 찾기 줄에 섭니다. 둘이 모이면 그 자리에서 대국방을 하나 만들어 두 사람을 앉히고, 흑백은 서버가 동전 던지기로 정합니다. 둔 수는 그 대국방이 같은 규칙으로 한 번 더 확인하기 때문에, 차례가 아니거나 둘 수 없는 수는 들어가지 않고 두 사람의 판이 갈라질 일이 없습니다.

시계를 가장 먼저 붙였습니다

방을 없애고 나서 1:1을 다듬을 일이 셋 남았습니다 — 시계 · 구경 · 짧은 말. 그중 시계를 맨 앞에 뒀습니다. 낯선 사람과 짝이 지어지면, 상대가 두지 않고 버티거나 창을 닫고 나가 버렸을 때 기권 말고는 판을 끝낼 길이 없었기 때문입니다.

  • 시간은 한 가지뿐입니다 — 10분, 한 수에 5초씩 더. 3분 · 10분 · 30분처럼 줄을 시간별로 나누면 사람이 적은 시간대에 어느 줄에서도 짝이 지어지지 않습니다.
  • 첫 수는 30초 안에. 짝이 지어진 뒤 자리를 비운 사람 때문에 10분을 기다리지 않게, 첫 수를 30초 안에 두지 않으면 그 판은 무효가 되고 전적에도 남지 않습니다. 첫 수끼리는 시계가 가지 않습니다.
  • 시간이 다 되면 지지만, 이길 수 없는 쪽에게 승리를 주지는 않습니다. 시간이 다 된 쪽의 상대에게 킹만 남았거나 킹에 비숍 · 나이트 하나만 남았다면 체크메이트를 할 수 없으니 무승부입니다.
  • 나간 사람은 30초 뒤에 끝낼 수 있습니다. 시계만으로는 나간 사람의 남은 시간을 최대 10분 가까이 다 기다려야 합니다. 상대가 30초 넘게 돌아오지 않으면 남은 사람이 「승리 선언」으로 판을 끝냅니다. 돌아오기만 하면 두던 자리에 그대로 앉고, 시계는 서버가 잽니다.

구경은 숫자만, 말은 여덟 개만

메뉴 아래 「지금 두는 판」에는 진행 중인 1:1이 최근 여덟 판까지 뜨고, 누르면 자리 없이 판이 움직이는 것만 봅니다. 한 판은 쉰 명까지 구경할 수 있습니다. 두는 사람에게는 몇 명이 보고 있는지만 가고, 구경하는 쪽은 닉네임도 보내지 않습니다.

두는 동안 주고받는 말은 「안녕하세요」 · 「좋은 수예요!」 · 「한 판 더 해요」처럼 정해 둔 여덟 개뿐입니다. 랜덤으로 만난 사이인데 신고나 차단 기능이 없어서 자유롭게 쓰는 칸은 넣지 않았습니다. 서버는 말의 번호만 받아 그 방에 돌리고 저장하지 않으며, 한 사람이 2.5초보다 자주 보내면 흘려 버립니다. 상대가 보낸 말은 숨길 수 있습니다.

전적은 이 브라우저에 쌓입니다

계정이 없고 닉네임만 있어서 서버에 「나」를 둘 자리가 없습니다. 그래서 AI 대결 전적(난이도마다)도, 1:1 전적도 지금 쓰는 브라우저에만 쌓입니다. 같은 판의 결과가 새로고침이나 다시 연결로 두 번 들어와도 한 번만 세고, 무효가 된 판과 구경한 판은 세지 않습니다. 브라우저 데이터를 지우면 전적도 같이 사라진다는 점은 알아 두시는 편이 좋습니다.

같은 짜임으로 9줄 바둑 · 장기 · 오목도 나왔습니다. 바둑은 용코바코 바둑 게임 소개에, 장기는 용코바코 장기 게임 소개에, 렌주 규칙으로 두는 오목은 용코바코 오목 게임 소개에 있습니다.

다른 노트

← 노트 목록