블룸 스도쿠는 냥이 찾기와 같은 토스 미니앱 모노레포 안에 있던 프로젝트다. 이쪽은 커밋도 돼 있었고, 바로 직전에 "힌트를 보면 전면 광고가 뜨는" 기능까지 붙은 상태였다. 알맹이는 흔한 9×9 스도쿠인데, 그 위에 토끼를 꾸미고 정원을 가꾸는 육성 게임을 얹었다. 퍼즐을 풀면 XP를 받고, XP로 정원 장식이나 토끼 옷을 산다. 스도쿠에 토끼가 왜 필요하냐고 묻고 싶었지만, 해보니 퍼즐 하나 더 풀 이유가 되긴 한다.
스도쿠 자체는 손댈 게 없었다
퍼즐 생성·검증 로직은 외부 라이브러리 없이 직접 짠 코드였다. 무작위 백트래킹으로 완성된 판을 만들고, 난이도에 따라 칸을 파낸다. 쉬움은 36칸, 보통은 46칸, 어려움은 54칸이다. 81칸 중 54칸이 비면 남는 숫자는 27개뿐이다. 이 부분은 토스든 브라우저든 상관없는 순수 계산이라 그대로 옮겼다. 남이 짠 코드인데 고칠 게 없으면 할 말도 없다.
냥이 찾기와 똑같은 이유로 화면이 비었다
이 앱도 배포하자마자 완전히 빈 화면이었다. 원인도 같았다. @toss/tds-mobile이 앱인토스 환경이 아니면 로드되는 순간 스스로 오류를 던지는데, 이 앱도 그 라이브러리를 실제 화면 부품이 아니라 빈 껍데기로만 감싸 쓰고 있었다. @toss/tds-mobile, @toss/tds-mobile-ait, @toss/tds-colors, 그리고 딸려 있던 @emotion/react까지 걷어내니 떴다. 이 라이브러리는 localhost는 통과시키고 실제 도메인만 막는다. 그래서 내 컴퓨터에서 테스트할 때는 한 번도 안 드러났다. 같은 함정에 두 번 빠진 건 아니고, 두 앱을 같이 고쳤다. 그렇게 믿어줬으면 한다.
이미지 파일이 하나도 없었다
냥이 찾기는 고양이 그림 경로 때문에 한 번 더 고생했는데, 블룸 스도쿠는 그럴 일이 없었다. 토끼도, 정원 장식도, 옷장 아이템도 전부 이모지와 CSS로 그려져 있어서 이미지 파일 자체가 없다. 옷장에는 분홍 리본, 벚꽃 머리핀, 라탄 모자, 미니 왕관, 동글 안경 같은 아이템 8개가 있고, 정원 상점에는 튤립 한 송이, 둥근 화분, 해바라기, 벚나무 가지 같은 장식 6개가 있다. 세 앱 중에서 하위 경로로 옮기는 작업이 가장 간단했다.
처음부터 86 XP를 들고 시작한다
새로 시작한 사용자의 XP가 0이 아니라 86이다. 저장 코드의 초기값이 그렇게 박혀 있다. 왜 하필 86인지는 코드 어디에도 설명이 없다. 정원 상점의 튤립 한 송이가 20 XP니까, 첫 판을 풀기 전에도 튤립을 네 송이까지 살 수 있다. 추측하자면 처음 들어온 사람의 정원이 텅 비어 보이지 않게 하려는 값이다. 다섯 송이째를 사려면 결국 퍼즐을 풀어야 한다. 설명 없는 숫자는 원래 의심하고 보는 편인데, 이건 굳이 0으로 바꿀 이유를 못 찾아서 그대로 뒀다. 풀던 판도 저장된다. 퍼즐을 풀다가 창을 닫아도 채운 칸과 남은 힌트 개수가 브라우저에 남아 있어서, 다시 열면 이어서 풀 수 있다. 토스 저장소 대신 브라우저 저장소를 쓰니, 다른 기기에서는 이어지지 않는다.
힌트에 붙어 있던 광고는 그냥 사라졌다
힌트는 난이도마다 개수가 다르다. 쉬움 3개, 보통 2개, 어려움 1개다. 토스 앱에서는 힌트를 쓸 때 전면 광고가 뜨는데, 광고 코드가 "지원되는 환경인지"부터 확인하게 짜여 있어서 따로 손댈 게 없었다. 토스 밖에서는 광고 없이 바로 힌트가 나온다. 웹판 사용자는 광고를 안 보고 힌트를 쓰는 셈이다.
사용법
홈의 "오늘의 스도쿠 시작하기"를 누르고 쉬움·보통·어려움 중 하나를 고른다. 숫자 패드로 칸을 채우고, 막히면 힌트 버튼으로 정답 한 칸을 확인한다. 다 풀면 걸린 시간과 받은 XP가 뜬다. 하단 "정원" 탭에서는 XP로 장식을 사서 정원에 놓고, "꾸미기" 탭에서는 토끼에게 옷과 소품을 입힌다.