기본 난이도를 승률에게 결정하게 했다
탐라의 1인 봇전 기본 난이도는 중이었습니다. 그 중이 타당하다는 근거를 저는 갖고 있지 않았습니다. 기본값이란 아무것도 하지 않으면 그대로 놓여 있는 값이고, 그대로 놓여 있었다는 사실은 그것이 맞다는 증거가 되지 않습니다. 이날 운영 데이터를 한 번 제대로 세어 보고 그 기본값을 손댔습니다. 바꾼 것은 중 난이도 봇의 세기가 아닙니다. "아무것도 고르지 않은 사람에게 어떤 난이도를 건넬 것인가"뿐입니다. 숫자를 보고 정한 것, 일부러 건드리지 않은 것, 그리고 건드리지 않은 탓에 남는 부작용을 차례로 적어 둡니다.
작성일: 2026-08-01
기본값은 아무것도 고르지 않은 사람이 만나는 상대다
탐라에서 난이도가 정해지는 입구는 둘입니다. 방을 만들어 봇 자리마다 고르는 화면, 그리고 아무 설정 없이 바로 시작하는 빠른 시작입니다. 앞쪽에서도 자리를 건드리지 않으면 값이 비므로, 결국 두 입구 모두 "고르지 않았을 때 쓸 값"이 필요합니다. 그게 기본값입니다.
기본값은 설정 항목 하나처럼 보이지만, 저는 이것을 가장 많은 대국을 조용히 결정하는 값이라고 봅니다. 설정을 열어 직접 고르는 사람은 그 시점에 이미 자기 취향을 압니다. 기본값이 걸리는 쪽은 아직 아무것도 모르는 사람이거나, 고르는 수고를 들이고 싶지 않은 사람입니다. 다시 말해 기본값이란 제가 말없이 배정하는 상대이고, 거기에 잘못이 있어도 상대 쪽에서는 "이 게임은 원래 이렇구나"로만 보입니다. 그래서 기본값의 타당성은 제가 확인하지 않으면 아무도 확인하지 않는다고 봤습니다.
여기서 걸리는 건 그 타당성을 제 손맛으로는 잴 수 없다는 점입니다. 만든 사람은 봇이 무엇을 보고 무엇을 보지 않는지 알고 있고, 그 지식은 대국 중에도 사라지지 않습니다. 제가 중 난이도 봇을 상대로 어떻게 느끼는지는 처음 들어온 사람이 어떻게 느끼는지의 증거가 되지 않습니다. 기본값만큼은 감각이 아닌 것으로 정해야 했습니다.
손맛이 아니라 승률을 봤다
운영 데이터를 감사해서 사람 1명·봇 3명 구성의 대국만 따로 뽑았습니다. 거기서 사람 쪽 승률은 54%였습니다. 넷이 실력으로 균형을 이룬다면 1인당 승률은 25%로 수렴해야 합니다. 54%는 그 두 배를 넘습니다. 상대 셋을 동시에 제치고 두 판에 한 판 이상 이기고 있다는 뜻입니다.
이 숫자가 말해 주는 것은 분명했습니다. 기본값인 중 난이도 봇은 몰입해서 두는 사람의 상대로는 확연히 약합니다. 기본값이 중에 놓여 있었다는 것과 중이 그 자리에 어울린다는 것은 서로 다른 이야기였던 셈입니다. 25%와 54% 사이의 간격은 인상으로 메울 수 있는 폭이 아닙니다.
동시에 이 숫자가 만능이 아니라는 것도 적어 둡니다. 54%는 평균이고, 평균은 개인차를 지웁니다. 이제 막 시작해 한 번도 못 이긴 사람과 중을 가볍게 넘어서는 사람이 같은 숫자 하나에 녹아 있습니다. 그래서 이 숫자가 지시하는 것은 "기본값을 한 단계 올려라"가 아니라 "모두에게 같은 기본값을 건네는 것을 그만두라" 쪽이라고 읽었습니다. 기본값을 고정된 한 값이 아니라 그 사람의 지금까지 결과에서 고르는 값으로 바꾼다 — 택한 방침은 이것입니다. 경계는 제가 보기에 낮다 싶은 자리에 뒀습니다. 혼자 치른 봇전에서의 승리 두 번입니다. 거기까지는 중, 그다음부터는 상을 기본으로 두었습니다.
난이도 상수는 건드리지 않았다
손이 가장 덜 가는 수정은 중 난이도 봇의 판단을 똑똑하게 만드는 것이었습니다. 저는 그 길을 택하지 않았고, 봇의 사고를 정하는 상수에는 한 줄도 손대지 않았습니다. 중을 날카롭게 하면 숫자가 어느 쪽으로든 움직이기는 하리라고 짐작하지만, 얼마나 움직이는지는 시험해 보지 않아 모릅니다. 손대지 않은 이유는 그 효과의 크기와는 다른 자리에 있습니다.
이유는 그 상수가 곧 난이도의 의미이기 때문입니다. 중을 세게 만들면 스스로 중을 고른 사람의 상대까지 함께 달라집니다. 그 사람은 "중이 좋다"고 말한 것이지 "중이라는 이름이 붙은, 조금 센 무언가"를 주문한 게 아닙니다. 하·중·상이라는 세 이름은 두는 쪽에게는 약속입니다. 이름을 그대로 둔 채 내용물을 옮기면 세 단계 사이의 간격도, 그 사람이 지난 판에서 익힌 감각도 조용히 무너집니다.
그래서 난이도 자체가 아니라 배정 규칙만 바꿨습니다. 중은 중대로, 상은 상대로 둡니다. 달라진 것은 "아무것도 고르지 않은 이 사람에게 둘 중 어느 쪽을 건넬 것인가"뿐입니다. 이렇게 갈라 두면 실무에서도 이점이 있습니다. 이번 판단이 틀렸다면 되돌릴 곳은 배정 쪽 한 군데뿐이고, 이미 난이도를 직접 골라 온 사람들의 대국은 처음부터 아무 영향을 받지 않습니다. 기본값을 손보는 변경은 기본값 밖으로 새어 나가지 않게 가둬 두는 편이 안전하다고 봅니다.
고른 값은 덮지 않는다
적응이 작동하는 것은 두 입구 어느 쪽에서든 "고르지 않았을 때"로 한정했습니다. 누군가 자리의 난이도를 명시적으로 골랐다면 그 값이 그대로 쓰입니다. 여기에는 하도 포함됩니다. 승수가 쌓인 사람이 하를 골라도 마음대로 끌어올리지 않습니다.
이 한 가지는 기능 자체보다 앞에 뒀습니다. 승수는 실력을 대신해 쓸 만한 정도의 숫자일 뿐, 그 사람이 오늘 이 대국에서 무엇을 원하는지에 대해서는 아무것도 말해 주지 않습니다. 친구에게 화면을 보여 주며 가볍게 돌리고 싶을 수도 있고, 판이 어떻게 보이는지만 확인하려는 것일 수도 있습니다. 저는 그걸 알 수 없고, 알 수 없는 것을 승수로 추측해서 분명히 표명된 선택을 덮을 근거는 없습니다. 자동으로 정해도 되는 자리는 아무도 아무 말을 하지 않은 자리뿐입니다.
달리 말하면 이 기능의 권한은 "빈칸을 채우는 것"까지이지 "이미 적힌 칸을 고치는 것"이 아닙니다. 제 경험으로는, 똑똑해지려는 장치가 신뢰를 잃는 것은 대개 후자에 손을 댔을 때였습니다. 기본값 개선은 명시적 선택을 반드시 이기게 한다는 조건 아래에서만 의미가 있다고 봤습니다.
저장하지 않기로 한 것과, 남는 부작용
구현에서는 그 사람이 지금까지 혼자 치른 봇전의 승수를 대국 기록에서 그 자리에서 셉니다. 전용 열을 더하지도, 그걸 위한 이전 작업을 돌리지도 않았습니다. 적응에 쓸 재료가 전부 이미 남아 있는 대국 기록에서 유도되기 때문입니다. 유도할 수 있는 값을 따로 옮겨 들고 있으면 진실이 둘이 됩니다. 갱신을 한 번 빠뜨리는 순간부터, 봇 세기의 근거만 옛 값인 채로 조용히 살아 있게 됩니다. 매번 다시 세는 비용을 치르는 쪽을 택했습니다.
세는 대상에서는 초반에 나가 버린 대국을 뺐습니다. 시작하자마자 끝난 판을 승수에 넣으면 몰입해서 뒀는지와 무관한 것이 섞입니다. 여기서 지키고 싶었던 것은 정확성 자체라기보다, 이 숫자를 "실력의 대리"로 쓸 자격 쪽입니다. 기준이 되지 못하는 승리를 더해 가면 어떤 경계를 그어도 의미가 사라집니다.
정리되지 않은 지점도 남습니다. 이 설계에서는 경계를 넘은 다음 대국부터 상대가 바뀝니다. 설정을 한 번도 건드리지 않은 사람에게는 내가 한 것은 없는데 상대만 달라진 것처럼 보일 것입니다. 실제로 그것을 어떻게 느꼈는지는 제 쪽에서 알 수 없습니다. 승률이라는 평균의 바깥에 있는 한 사람 한 사람은 숫자가 알려 주지 않는 영역입니다. 그래도 배정 규칙이 말없이 움직이는 이상, 그 규칙을 공개해 두는 것은 만든 쪽의 몫이라고 생각합니다. 이 글도 그 공개의 일부입니다.