삼삼처럼 보여도 금수가 아닌 자리 — 용코바코 오목이 렌주 금수를 가려내는 방법과 AI 다섯 단계
용코바코 오목은 흑에게만 금수가 있는 렌주 규칙으로 둡니다. 흑 차례마다 금수 자리를 어떻게 셈하는지, 셋처럼 보여도 셋이 아닌 «거짓 셋»을 어떻게 가리는지, 바깥 심판 없이 무작위 판 1,500개로 판정을 어떻게 맞춰 봤는지, AI 다섯 단계가 무엇으로 갈리는지를 숫자 그대로 적었습니다.
용코바코 오목은 「용코바코 전통 전략 시리즈」의 넷째 게임입니다. 15줄 판에 흑과 백이 번갈아 돌을 놓아 다섯을 먼저 잇는 놀이인데, 국제 대회 규칙인 렌주를 따르기로 하면서 일이 하나 늘었습니다. 먼저 두는 흑에게만 둘 수 없는 자리가 있어서, 흑의 차례가 올 때마다 판 전체에서 그 자리를 찾아 ✕ 로 표시해야 했습니다. 아래는 그 판정을 어떻게 만들었고 무엇으로 믿을 만하다고 판단했는지, 그 위에서 AI가 어떻게 수를 고르는지에 대한 메모입니다. 판과 모드마다의 안내는 용코바코 오목 게임 소개에서 볼 수 있습니다.
흑에게만 막힌 세 가지 모양
맨 오목은 먼저 두는 쪽이 지나치게 유리하다고 알려져 있습니다. 렌주는 그 균형을 흑에게 세 가지를 금지하는 것으로 맞춥니다.
- 삼삼 — 돌 하나로 열린 셋이 두 줄 동시에 생기는 자리
- 사사 — 돌 하나로 넷이 두 개 생기는 자리. 두 넷이 같은 줄에 있어도 셉니다. 흑 셋 · 빈칸 셋 · 흑 셋이 한 줄로 늘어섰을 때 한가운데 빈칸이 그런 예입니다 — 거기 두면 양옆 빈칸 어느 쪽을 채워도 다섯이 됩니다
- 장목 — 흑이 여섯 개 넘게 이어지는 자리. 흑은 꼭 다섯이어야 이깁니다
단, 그 수로 다섯이 완성되면 금수 모양이 같이 생겨도 다섯이 우선합니다. 백은 이 셋에서 모두 자유롭고, 여섯 넘게 이어도 이깁니다.
규칙을 옮기면서 따로 정한 것도 있습니다. 대회 렌주에서는 흑이 금수에 두면 그 자리에서 지지만, 화면에서 누른 한 번의 실수로 판이 끝나는 것은 지나치다고 봤습니다. 그래서 금수 자리에는 돌이 아예 놓이지 않고, ✕ 를 누르면 왜 막혔는지를 한 줄로 알려 줍니다. 첫 몇 수의 자리를 제한하는 대회용 시작 규칙(스왑 등)은 넣지 않았습니다. 판이 꽉 차거나, 흑의 차례인데 남은 빈칸이 모조리 금수인 경우는 비김으로 칩니다.
판정은 이어진 돌의 양 끝만 봅니다

어느 빈칸이 금수인지 셈하는 방법은 이렇습니다. 그 칸에 흑을 가정으로 놓고, 가로 · 세로 · 두 대각선 네 방향마다 «흑이 몇 개 이어졌나»와 «그 줄의 양 끝 바로 바깥 칸이 비었나»만 봅니다.
- 어느 방향이든 정확히 다섯이 되면 금수가 아닙니다.
- 여섯 이상이 되면 장목입니다.
- 양 끝 칸 가운데 하나를 채워 정확히 다섯이 된다면 그 줄에 넷이 있는 것입니다. 넷이 두 개 이상이면 사사입니다.
- 넷이 없는 줄에서, 끝 칸을 채웠을 때 양쪽이 다 열린 넷이 된다면 그 줄은 열린 셋입니다. 이런 줄이 두 개 이상이면 삼삼 후보가 됩니다.
이 판정은 파일 하나에 담겨, 세 곳이 그대로 불러다 씁니다. 판에 ✕ 를 그리는 화면, 따로 떨어져 생각하는 AI, 그리고 1:1 대결에서 수를 받아 주는 서버입니다. 1:1에서 누군가 금수에 두려고 해도 서버가 같은 셈으로 거절합니다. 서버(Cloudflare Worker)에서도 도는 자바스크립트 렌주 규칙 라이브러리는 찾지 못해서, 이 부분은 처음부터 직접 짰습니다.
거짓 셋 — 셋인데 셋으로 세지 않는 경우
4번에는 함정이 하나 있습니다. 열린 셋이란 «한 수 더 두면 열린 넷이 되는 셋»입니다. 그런데 그 한 수를 둘 자리가 하필 흑의 금수라면, 그 셋은 영영 열린 넷이 될 수 없습니다. 렌주에서는 이런 셋을 셋으로 세지 않습니다. 흔히 거짓 셋이라고 부릅니다.
시험에 넣어 둔 예가 이렇습니다. 흑 i8 · j8 옆의 h8 에 두면 가로로 h8 · i8 · j8 셋이 생기는데, 왼쪽 f8 은 백이 막고 있어서 이 셋이 열린 넷이 되려면 오른쪽 k8 에 둬야 합니다. 그런데 k 줄에 흑이 위로 셋, 아래로 둘 서 있어서 k8 에 두면 흑 여섯이 이어지는 장목입니다. 그래서 가로 셋은 거짓 셋이고, 세로로 셋이 하나 더 생기더라도 h8 은 삼삼이 아닙니다. 판에 ✕ 도 뜨지 않습니다.
이것을 가리려면 4번에서 «그 한 수를 둘 자리가 흑의 금수인지»를 같은 판정으로 한 번 더 셈해야 합니다. 그 자리의 셈이 또 다른 자리를 물어볼 수 있으니 판정이 자기 자신을 거듭 부르게 되는데, 실제 판에서는 서너 겹을 넘는 일이 없었습니다. 만일을 위해 열두 겹에서 멈추게 해 두었습니다.
바깥 심판이 없어서 느린 셈을 하나 더 짰습니다
판정이 맞는지는 어떻게 확인할까요. 서버가 아니라 짜는 동안만 돌려 보는 용도라도 쓸 만한 렌주 판정기가 있었다면 그것과 대 보면 됐겠지만, 찾지 못했습니다. 대신 짜임이 전혀 다른 두 번째 판정을 일부러 느리게 만들었습니다. 이 셈은 양 끝만 보는 지름길을 쓰지 않고, 줄 위의 빈칸을 하나씩 다 채워 보면서 «정확히 다섯이 되는가»라는 정의 그대로만 따집니다. 두 셈이 같은 실수를 같은 자리에서 저지를 가능성은 낮습니다.
- 손으로 고른 26곳 — 붙은 셋 · 한 칸 띈 셋 · 대각선 삼삼 · 한쪽이 막힌 셋 · 두 줄 사사와 한 줄 사사 · 여섯 · 일곱 · 다섯과 겹친 금수 · 4-3 · 거짓 셋 두 종류 · 판 가장자리
- 무작위 판 1,500개 — 판 가운데 9×9 칸에 흑을 촘촘히 뿌린 판에서 빈칸 18만여 곳을 두 셈에 똑같이 물었습니다. 어긋난 곳은 한 곳도 없었습니다.
무작위 판에서 나온 금수는 삼삼 3,152곳 · 사사 2,978곳 · 장목 1,366곳이었습니다. 셋이 두 줄 생기는 모양인데도 거짓 셋 덕분에 흑이 둘 수 있었던 자리가 1,442곳이었고, 그 가운데 841곳은 판정을 두 겹 넘게 거슬러 올라가야 답이 나왔습니다. 거짓 셋을 대충 넘겼다면 이만큼의 자리에 ✕ 가 잘못 떴을 것입니다.
AI는 «다섯 칸 창»으로 판을 봅니다
렌주를 두는 웹 엔진도 찾아봤지만, 크기가 크거나 신경망 파일을 받아야 하거나 여러 줄로 돌아서 사이트 설정을 바꿔야 하는 것들이었습니다. 화면과 함께 가볍게 뜨는 쪽이 낫다고 보고 AI도 새로 짰습니다.
AI가 판을 읽는 단위는 가로 · 세로 · 대각선으로 이어진 다섯 칸, 판 전체에 572개 있는 «창»입니다. 한 창 안에 한쪽 돌만 있으면 그 돌이 하나면 4점, 둘이면 40점, 셋이면 400점, 넷이면 4,000점을 그쪽에 주고, 양쪽 돌이 섞인 창은 0점입니다. 흑의 창은 바로 바깥에 흑이 또 있으면 0점으로 칩니다. 채우면 다섯이 아니라 장목이 되기 때문입니다. 돌 하나를 놓을 때마다 그 돌이 걸친 창 스무 개와 바로 옆의 창 여덟 개만 다시 셉니다.
수를 고를 때는 가능한 자리를 다 보지 않고, 내 창을 키우거나 상대 창을 깨는 정도가 큰 자리 몇 곳만 골라 몇 수 앞까지 따라갑니다. 상대에게 다섯이 될 자리가 있으면 그곳만 보고, 그런 자리가 둘이면 진 판으로 봅니다. 상급부터는 넷만 연달아 만들어 이기는 길(연속 넷)을 따로 찾고, 자기가 고른 수 뒤에 상대에게 그런 길이 열리지 않는지도 살핍니다.
금수는 AI에게 무기가 되기도 합니다. 흑이 막아야 할 자리가 흑의 금수라면 흑은 거기를 막을 수 없습니다. AI는 이것까지 셈하므로, 백을 잡으면 흑이 막을 자리를 금수로 만드는 수를 찾아 둡니다. 반대로 AI가 흑일 때는 금수에 두지 않습니다. 둘 다 시험이 매번 확인하는 항목입니다.
다섯 단계를 가르는 값
| 단계 | 내다보는 수 | 생각 시간 상한 | 연속 넷 찾기 |
|---|---|---|---|
| 입문 | 1수 | 0.4초 | 안 함 |
| 초급 | 2수 | 0.7초 | 안 함 |
| 중급 | 3수 | 1초 | 안 함 |
| 상급 | 6수 | 1.6초 | 넷 10번까지 |
| 최상급 | 9수 | 3초 | 넷 16번까지 |
입문과 초급은 여기에 두 가지 버릇이 붙습니다. 자리 점수를 무작위로 흔들어 가끔 엉뚱한 곳을 고르고(입문 25% · 초급 5%는 아예 후보 중 아무 데나 둡니다), 막아야 할 넷을 못 본 채 지나갑니다(입문 35% · 초급 10%). 이 «못 보기»는 처음 만들었을 때 거의 듣지 않았습니다. 못 본 척하기로 한 뒤에도 수를 읽게 두었더니, 읽는 과정에서 넷이 다시 눈에 띄어 결국 막아 버렸던 것입니다. 입문이 막을 넷을 40번 중 3번밖에 놓치지 않았습니다. 지금은 못 보기로 한 수에서는 아예 읽지 않고 후보 가운데 하나를 둡니다.
AI가 손을 떼자마자 두면 무엇이 바뀌었는지 볼 틈이 없어서, 아래 단계는 입문 0.55초 · 초급 0.45초 · 중급 0.35초 · 상급 0.25초를 채운 뒤에 돌을 놓습니다. 개발 컴퓨터에서 최상급이 한 수에 쓰는 시간은 평균 0.3초, 길어야 2.6초쯤이었습니다.

연습의 힌트는 최상급과 같은 방식으로 1.5초 동안 읽고 고른 자리를 동그라미로 짚어 줍니다.
단계끼리 맞붙여 본 결과
이웃한 두 단계를 흑 · 백을 바꿔 가며 네 판씩 두게 했습니다.
| 대결 | 위 단계 승 (4판 중) |
|---|---|
| 초급 · 입문 | 4 |
| 중급 · 초급 | 3 |
| 상급 · 중급 | 4 |
| 최상급 · 상급 | 2 |
이웃하지 않은 단계끼리는 모두 위 단계가 네 판을 다 이겼습니다. 눈에 띄는 것은 맨 위 두 단계입니다. 상급과 최상급은 2 대 2였는데, 두 쪽 모두 흑을 잡았을 때만 이겼습니다. 이 정도로 잘 두는 사이에서는 렌주로 깎아 놓은 흑의 이점이 한 단계 차이보다 아직 큰 셈입니다. 최상급을 더 세게 만들 여지는 남아 있고, 단계가 사람에게 맞는지는 실제로 둔 판이 쌓여야 알 수 있습니다.
전통 전략 시리즈의 다른 게임도 같은 방식으로 설치 없이 둘 수 있습니다 — 체스 · 9줄 바둑 · 장기 · 리버시.