← 블로그로 돌아가기

엉킨 배선 개발 일지: 뒤죽박죽 조작을 '무작위'가 아니라 '공정'하게

· 6분 분량 · 엉킨 배선

엉킨 배선(Crossed Wires)은 벼룩시장에서 산 싸구려 휴대용 게임기를 다루는 퍼즐 게임이에요. 카트리지마다 배선이 새로운 방식으로 잘못돼 있어요. 왼쪽이 오른쪽으로 갈 수도 있고, 모든 버튼이 4분의 1바퀴씩 돌아가 있을 수도 있고, 한 번 누르면 한 칸이 아니라 두 칸을 갈 수도 있어요. 버튼 네 개가 실제로 무슨 일을 하는지 알아낸 다음, 배터리가 떨어지기 전에 출구까지 가면 돼요.

여섯 번째 게임이고, 여섯 번째 조작 방식이에요. 앞선 게임은 궤도 타이밍, 스와이프 판정, 집게 조종, 선을 그어 자르기, 밀기와 저금이었어요. 이번에는 조작을 시험하고 해독하는 일이 플레이의 중심이에요. 이 글에서는 이 아이디어가 안고 있던 가장 큰 위험과 그 위험을 줄이려고 한 일, 그리고 깔끔하지 못했던 부분을 이야기해요.

엉킨 배선 타이틀 화면: KLUNK-7 휴대용 게임기와 오늘의 카트리지, 무한 모드 버튼.

타이틀 화면. KLUNK-7은 우리가 지어낸 휴대용 게임기이고, 전부 코드로 그렸어요.

“그냥 잡음이잖아"라는 문제

조작이 뒤섞인 게임은 잡음처럼 느껴지기 쉬워요. 왜 엉뚱한 쪽으로 갔는지 알 수 없으면 버튼을 눌러 보며 운에 맡길 수밖에 없어요. 우리는 모든 실수가 플레이어가 피할 수 있었던 실수이길 바랐어요. 그래서 목표를 “무작위가 아니라 공정"으로 잡고 게임 전체를 거기에 맞췄어요.

네 번이면 다 알 수 있어요

방마다 안전한 시험 패드에서 시작해요. 버튼 네 개를 눌러 보면서 작은 로봇을 지켜보세요. 패드마다 처음 네 번은 무료이고, 그 뒤로는 한 번 누를 때마다 배터리가 1씩 줄어요. 패드에는 위험 요소가 없어요.

배선 종류는 8가지이고, 뒤쪽 방에서는 두세 가지가 겹쳐요. 서로 상쇄되거나 알아보기 힘들어지는 조합 몇 개는 금지했어요. 그렇게 해서 허용되는 배선은 71가지가 돼요. 디자이너가 이걸 전부 나열해서, 위, 오른쪽, 아래, 왼쪽을 한 번씩 누르는 24가지 순서마다 71가지 결과가 모두 다르게 나오는지 확인했어요. 한 번 누르면 구별되지 않는 묶음이 9개 남고, 두 번이면 28개, 세 번이면 46개예요. 네 번이면 71가지가 전부 따로 구별돼요. 처음 네 번이 무료인 이유예요. 네 번이 지나면 더 추측할 게 없어요.

시험 패드: 빈 방 가운데 작은 로봇, 아래에 버튼 네 개.

시험 패드.

방은 배선을 먼저 시뮬레이션해서 만들어요

규칙은 시드, 방의 상태, 누른 버튼만으로 결과가 정해지는 순수 함수예요. 게임과 봇이 같은 코드를 돌려요. 방을 만들 때 걸리기 쉬운 함정이 하나 있어요. 탁 트인 격자에서 두 칸 이동 방이 닿을 수 있는 칸은 81칸 중 25칸뿐이에요. 출구를 먼저 정하고 나중에 검사하면 아무도 클리어할 수 없는 방이 만들어져요. 그래서 생성기는 방의 배선을 먼저 시뮬레이션하고, 그 배선이 실제로 닿을 수 있는 칸에서만 출구를 골라요. 밀어낸 블록이 출구를 막아 버리는 일이 없도록 막힘 검사도 해요.

길에는 가시, 구덩이, 미끄러지는 블록, 배터리 칸이 있어요. 계획된 경로 위에는 위험 요소가 없고, 위험 요소는 경로 옆, 잘못 짚은 발걸음이 가는 자리에 있어요.

벽, 가시, 구덩이 사이로 출구 문까지 가는 방.

경로 구간. 벽에 부딪히는 것도 한 번 누른 것으로 쳐서 배터리가 1 줄어요.

빌드를 실패시키는 봇

테스트 스크립트 levelcheck는 봇 세 개로 수백 개의 시드를 돌리고, 기준 하나라도 못 맞추면 빌드를 실패시켜요. 무작위로 버튼을 누르는 봇, 패드를 눌러 보며 배선을 알아내는 ‘해독’ 봇, 처음부터 배선을 아는 완벽 봇이에요. 릴리스 후보 빌드의 마지막 실행은 모드마다 튜닝용 시드 500개와 따로 떼어 둔 시드 200개를 썼고, 약 4분 걸려요.

오늘의 카트리지 (중앙값)점수클리어한 방남은 배터리5개 모두 클리어
무작위0000.0%
해독153553100%
완벽153553100%

무한 모드에서는 해독 봇과 완벽 봇 모두 중앙값 16개 방까지 가고, 무작위 봇은 0개예요.

해독 봇은 배선을 알아내야 하고 완벽 봇은 그럴 필요가 없는데도 점수가 같아요. 조작을 배우는 데 드는 비용이 무료로 누르는 네 번뿐이라는 뜻이에요. 다른 기준도 모두 지켜졌어요. 무료 네 번 안에 모든 배선을 구별할 수 있고(71개 중 71개), 해독 봇은 모든 시드에서 무작위 봇을 이기고, 약 2만 개 경로 구간에서 막힘은 0건이었어요.

우리가 놓친 것

숨은 규칙을 넣어 버렸고, 모든 봇이 통과했어요. 초기 플레이 테스트에서 실제 빌드로 13판을 끝까지 돌렸어요. 입력이 빠진 적도 없고, 화면과 규칙이 어긋난 적도 없었어요. 결론은 “대체로 공정하지만 숨은 규칙이 하나 있다"였어요. 두 칸 이동은 벽이 있으면 한 칸에서 멈추는데, 아무도 그걸 알려 주지 않았어요. 게다가 시험 패드로는 그걸 절대 볼 수 없어요. 150일치 오늘의 카트리지에서 두 칸 이동 방 148개 중 130개(88%)는 최적 경로가 그 부분 이동을 필요로 해요. 봇은 규칙을 그대로 따르니까 눈치채지 못했지만, 사람이라면 속은 기분이었을 거예요. 고친 건 두 칸 이동 설명에 벽이 있으면 한 칸만 간다는 문장을 한 줄 더한 거예요. 규칙은 하나도 바꾸지 않았어요.

같은 플레이 테스트에서 표류는 처음 알아차리기 어렵다는 점(처음 3번은 평범해 보여요)과 게으른 버튼이 다른 배선 종류와 겹치면 읽기 어렵다는 점도 나왔어요. 테스트 후에 패드와 일부 배선 종류를 더 읽기 쉽게 다듬었어요.

화면 잡음 위에 뜬 ‘접촉 끊김’ 배너: 방 중간에 배선이 바뀌었어요.

방 중간의 헐거운 커넥터가 배선을 바꿔요. 작은 패드가 열려서 다시 시험해 볼 수 있어요.

출시 전 QA의 결론은 “네, 무작위가 아니라 공정합니다"였어요. 해독 봇은 오늘의 카트리지 40개를 전부 클리어했고, 무작위 봇은 20개 중 18개에서 0점이었어요. 다만 한쪽 방향이 두 번에 한 번만 먹히는 게으른 버튼은 공정한데도 가장 가혹하게 느껴져요. 아무 일도 일어나지 않는 입력도 배터리를 깎기 때문이에요.

오늘의 카트리지, 무한 모드, 공유 문구

오늘의 카트리지는 모두에게 같은 카트리지이고, UTC 날짜가 시드예요. 방은 5개, 하루에 한 번만 도전할 수 있어요. 도중에 새로고침하면 같은 지점부터 이어져서, 탭을 닫아도 도전 기회가 날아가지 않고 다시 도전하는 데 쓸 수도 없어요. 점수는 클리어한 방 수 x 20 + 남은 배터리예요. 완벽하게 하면 봇 추정으로 플레이 시간이 약 2분 45초인데, 사람은 더 느리겠죠. 무한 모드는 방 수 제한이 없고 배터리가 떨어지면 끝나요.

공유 문구에는 URL이 없고, 칸 하나가 방 하나예요. 초록은 완벽한 플레이의 1.25배 이내, 노랑은 그보다 많이 걸린 방, 빨강은 배터리가 떨어진 방이에요.

오늘의 카트리지 결과: 점수 내역과 방마다 이동 수가 적힌 초록·노랑 칸.

오늘의 카트리지 결과.

작게 만들고, 두 언어로

그래픽은 전부 540x960 세로 캔버스 2D에 코드로 그리고 소리는 모두 합성해서, 이미지나 오디오 파일도 런타임 의존성도 없어요. 아트 킷은 TypeScript 파일 11개이고, 게임은 123 KB짜리 game.js 하나로 나가요(릴리스 후보 기준). 합성 효과음은 21개예요. 방향마다 누르는 소리가 따로 있고, 이동, 부딪힘, 아무 일 없음은 결과가 나올 때 소리가 나서 “이걸 눌렀더니 이렇게 움직였다"를 귀로 들을 수 있어요. 글자는 공용 글꼴 함수 하나가 360x640 휴대폰에서 12px보다 작게 그리지 않고, 모든 효과에 움직임 줄이기 버전이 있어요.

한국어로도 완전히 즐길 수 있고, 한국어 제목은 ‘엉킨 배선’이에요.

방 클리어 카드: 배선 종류 이름과 한 줄 설명, NEW 표시.

방을 클리어하면 나오는 카드. 이 방에 쓰인 배선의 이름과 규칙을 알려 줘요.

아직 확인하지 못한 것

모든 테스트는 휴대폰 에뮬레이션을 켠 Chromium에서 했어요. 실제 휴대폰도, iOS Safari도 아니에요. 아직 아무도 소리를 들어 보지 못했어요. 확인한 건 소리가 시작되고 정해진 최대 크기를 넘지 않는다는 것뿐이에요. ‘공정’은 스크립트 봇과 배선마다 몇 번 눌러야 알 수 있는지 세어 본 결과로 판단했고, 처음 해 보는 사람들로 확인한 게 아니에요. 게임 속 한국어는 교정 담당이 읽어 봤지만 한국어가 모국어인 플레이어가 직접 해 본 적은 없고, 실제 휴대폰에서는 기기 글꼴이 쓰여요. 진동은 가짜 브라우저 API로만 시험했어요.

불공정하게 느껴지는 곳이 있다면 알려 주세요.

엉킨 배선 플레이하기. 배선을 얼마나 빨리 알아내는지 확인해 보세요.