진짜 보이는 차이'만 남기기까지 — 두들스팟 제작기
두들스팟을 처음 설계할 때 세운 원칙은 하나였다. "찾을 수 있는 차이만 만든다." 당연한 소리 같지만 막상 절차대로 그림 요소를 무작위로 변형해 차이를 만들다 보면, 개발자 눈에는 '분명히 다른' 차이인데 실제로 플레이해 보면 안 보이는 경우가 계속 나왔다.
좌우 반전을 뺀 이유
초기 버전에는 위치 이동·크기 변화·색 변화·사라짐 외에 '좌우 반전(flip)'이라는 다섯 번째 유형이 있었다. 낙서 요소 하나를 거울처럼 뒤집는 방식이었는데, 원 형태에 가까운 손그림 요소는 좌우로 뒤집어도 사람 눈에는 거의 똑같이 보였다. 실제로 코드에 남아 있는 주석은 이렇게 설명한다. "좌우반전(flip)은 픽셀 변화가 30~50px 수준이라 사람 눈에 안 보여 전부 제외." 두 이미지를 픽셀 단위로 비교했을 때 실제로 값이 달라지는 영역이 30~50픽셀 정도에 불과했다는 뜻이다. 스테이지당 화면 크기를 생각하면 이건 오차 범위에 가깝다. 아무리 정답이라고 우겨도 플레이어가 못 찾으면 그건 버그지 콘텐츠가 아니다. 그래서 반전 유형은 통째로 뺐고, 남은 네 유형(위치·크기·색·사라짐)만으로 압축했다.
차이의 종류는 물체마다 다르게 배정된다
남은 네 유형도 모든 물체에 똑같이 적용되지는 않는다. 태양은 색·크기·이동 세 가지 중에서, 달은 크기·이동·색 중에서, 구름은 크기·삭제·이동 중에서, 나무는 색·크기·삭제 중에서, 사람은 색·삭제 두 가지 중에서만 차이가 골라진다. 언뜻 번거로워 보이는 이 구분에는 이유가 있다. 예를 들어 사람 캐릭터처럼 형태가 복잡한 손그림 요소는 크기를 무작위로 늘리거나 줄이면 비율이 깨져 부자연스러워 보이기 쉽다. 반면 구름이나 태양처럼 형태가 단순한 요소는 크기를 바꿔도 크게 어색하지 않다. 물체 종류마다 어떤 변형이 '자연스럽게 차이로 보이는지'를 먼저 따진 뒤, 그 물체에 허용할 변형 종류를 미리 정해둔 것이다. 위치 이동의 경우 이동 폭도 고정값(36px)으로 맞춰져 있는데, 이 정도면 원래 자리와 눈에 띄게 달라 보이면서도 화면 밖으로 튀어나가거나 다른 물체와 겹치지 않을 만큼의 절묘한 값으로 잡혀 있다.
물체를 바꾸는 차이 말고, 물체 자체가 다른 차이
지금까지 설명한 네 유형은 전부 '원래 있던 물체 하나를 변형'하는 방식이다. 그런데 두들스팟에는 이와 성격이 다른 차이 유형이 하나 더 숨어 있다. 별이나 새, 풍선처럼 화면 위쪽 하늘에 떠 있는 소품 중 일부는 아예 한쪽 그림에만 존재하고 다른 쪽에는 존재하지 않는 방식으로 차이를 만든다. 기존 물체의 색이나 크기를 슬쩍 바꾸는 게 아니라, 처음부터 그 물체를 한쪽 그림에만 그려 넣는 것이다. 나무처럼 화면 아래쪽 요소도 같은 방식으로 완전히 새로운 개체를 한쪽에만 추가하는 경우가 있다. 이 유형은 '무엇이 바뀌었나'를 찾는 게 아니라 '무엇이 있고 없나'를 찾는 문제이기 때문에, 앞의 네 유형과는 눈이 움직이는 방식 자체가 다르다. 변형 유형을 찾을 때는 두 그림의 같은 위치를 번갈아 보며 비교해야 하지만, 존재 유무 차이는 그 자리에 뭔가 있는지 없는지만 보면 되므로 오히려 더 빨리 눈에 띄는 경우가 많다. 두 가지 성격의 차이를 섞어두면, 플레이어가 한 가지 탐색 전략만 반복하지 않고 계속 눈의 쓰임을 바꾸게 된다.
열 곳을 다 채우지 못할 때
차이를 무작위로 생성하는 방식에는 또 다른 함정이 있다. 이미 배치한 차이와 겹치거나, 화면 가장자리라 자연스럽지 않은 위치에 걸리는 경우가 있어서 시도할 때마다 성공한다는 보장이 없다. 두들스팟의 생성 로직은 두 겹의 재시도 구조로 짜여 있다. 바깥쪽에서는 목표한 10곳을 채울 때까지 전체 배치 과정을 최대 200번까지 다시 시도하고, 그 안쪽에서는 각 차이 하나를 놓을 자리를 찾는 시도를 최대 400번까지 반복한다. 실패한 시도는 조용히 버리고 다음 시도로 넘어가는 방식이라, 플레이어 입장에서는 로딩이 아주 짧게 걸릴 뿐 생성 과정 자체는 보이지 않는다. 자리를 좀처럼 못 찾을 때는 물체 사이 최소 간격 자체를 5px씩 완화해가며 다시 시도하는 보정 로직도 있다. 이 이중 재시도 구조 덕분에, 드물게 나오는 빽빽한 배치에서도 게임이 멈추거나 10곳을 못 채운 채로 끝나는 일 없이 항상 안정적으로 완성된 스테이지가 나온다. 바깥쪽 200회, 안쪽 400회라는 상한선 자체도 실제로 거의 다 소진되는 일은 없고, 대부분의 판은 이 상한선의 극히 일부만 쓰고도 곧바로 완성된다.
판마다 새로 그리는 이유
두들스팟은 고정된 그림 쌍을 쓰지 않는다. 매 판 절차적으로 새로 그린다. 이유는 단순히 '다양하게 보이려고'가 아니다. 정적인 이미지로 만든 틀린그림찾기는 필연적으로 검색 한 번이면 정답 좌표가 나오는 콘텐츠가 된다. 스테이지 수가 아무리 많아도 조합이 유한하면 언젠가 인터넷에 정답이 돌아다니게 된다. 절차적으로 매번 새로 그리면 애초에 '외워서 푸는' 경로 자체가 없다.
규칙과 결과 사이의 간극
대신 이 방식은 대가가 있다. 생성기가 만들어내는 모든 조합이 사람 눈에 정말로 차이로 보이는지, 미리 하나하나 확인할 수 없다는 것이다. 반전 유형을 걸러낸 것처럼, 지금도 차이의 종류를 늘리거나 배치 규칙을 바꿀 때는 실제로 화면에 띄워서 눈으로 확인하는 과정을 거친다. 이론적으로는 '차이가 있다'고 코드가 판정해도, 사람 눈에는 그저 같은 그림 두 장으로 보이는 경우가 실제로 여러 번 있었다. 색상 변화 유형에서도 명도 차이를 너무 작게 잡았다가 후속 조정을 거친 적이 있다. 코드로 만든 규칙과 사람 눈으로 보는 결과 사이의 간극을 좁히는 일이, 이 게임을 만드는 작업의 절반이었다고 해도 과장이 아니다. 좌우 반전을 걸러낸 경험이 남긴 교훈은 결국 하나였다. 개발자가 코드를 보고 "이건 명백히 다르다"고 확신하는 것과, 실제로 화면을 처음 보는 사람이 몇 초 안에 알아채는 것 사이에는 항상 간극이 있을 수 있고, 그 간극을 메우는 유일한 방법은 직접 눈으로 확인하는 것뿐이라는 사실이다. 데이터나 픽셀 수치가 아무리 논리적으로 맞아떨어져도, 결국 마지막 판단 기준은 사람의 눈이라는 걸 계속 되새기며 만들고 있다.