두들푸시 심화 공략: 데드락 패턴 세 가지
두들푸시에서 판이 막히는 건 대부분 규칙을 몰라서가 아니라, 상자를 되돌릴 수 없는 자리로 밀어 넣고 나서야 그 사실을 깨닫기 때문이다. 창고지기(Sokoban) 형식의 퍼즐에는 '데드락(deadlock)'이라 불리는, 상자가 영원히 목표에 도달할 수 없게 되는 대표적인 패턴 몇 가지가 있다. 미리 알아두면 실수를 손이 아니라 눈으로 걸러낼 수 있다.
구석 데드락
가장 흔하고 가장 치명적인 패턴이다. 상자를 벽과 벽이 만나는 구석 칸으로 밀어 넣으면, 그 자리가 목표(동그라미) 위가 아닌 이상 상자는 그 자리에서 완전히 멈춘다. 두들푸시는 상자를 미는 것만 가능하고 당기는 것은 불가능하기 때문에, 구석에서는 어느 방향으로도 다시 밀 수 있는 여지가 없다. 캐릭터가 그 상자의 반대편으로 돌아가 밀어낼 공간 자체가 존재하지 않는다. 구석을 향해 상자를 밀기 전에는 그 구석이 목표 지점인지 반드시 먼저 확인해야 한다.
벽줄 데드락
구석까지는 아니어도, 상자가 벽에 붙은 채로 그 벽을 따라 늘어선 목표 지점 중 어느 것과도 같은 줄에 있지 않다면 똑같이 막힌다. 상자가 벽에 붙으면 그 벽에 수직인 방향으로는 다시는 밀 수 없고, 벽을 따라 평행하게만 밀 수 있다. 그런데 그 벽을 따라 이동해도 도달할 수 있는 목표가 하나도 없다면, 평행 이동 자체가 무의미해진다. 즉 벽에 상자를 붙이기 전에는 "이 벽을 따라가면 갈 수 있는 목표가 있는가"를 먼저 확인하는 게 안전하다.
사각 클러스터 데드락
상자 두 개를 나란히, 그리고 그 옆줄에 상자 두 개를 더 붙여 2×2 형태로 모으면, 네 상자가 서로를 벽처럼 지지하며 전부 움직일 수 없는 상태가 된다. 상자 하나만 봐서는 안 보이지만, 다른 상자들과의 상대적 위치 때문에 굳어버리는 경우다. 이런 패턴은 상자를 하나씩 옮길 때마다 "지금 이 상자 옆에 다른 상자가 나란히 놓이는가"를 확인하는 습관으로 예방할 수 있다.
어떤 상자부터 옮겨야 할까
상자가 여러 개인 판에서 흔히 하는 실수는 손에 잡히는 대로, 혹은 캐릭터와 가까운 상자부터 옮기는 것이다. 데드락을 피하는 관점에서는 순서를 거꾸로 생각하는 편이 낫다. 밀 수 있는 방향의 선택지가 가장 적은 상자, 즉 이미 벽이나 다른 상자에 둘러싸여 여유가 별로 없는 상자를 먼저 처리하는 게 안전하다. 그런 상자는 다른 상자들이 주변에 더 들어차기 전에 옮기지 않으면 갈수록 선택지가 줄어들다가 결국 막히기 때문이다. 반대로 사방이 트여 있어 나중에 옮겨도 여러 경로가 남아 있는 상자는 뒤로 미뤄도 괜찮다. 여유가 적은 대상부터 처리한다는 이 순서 감각은 상자 퍼즐뿐 아니라 여러 개의 제약이 서로 얽힌 문제 전반에서 흔히 통하는 접근법이다.
거꾸로 생각하고, 막히면 바로 되돌리기
기존 가이드의 "목표 지점에서 거꾸로 생각하면 풀리는 판이 많다"는 조언은 데드락 예방과도 직결된다. 마지막에 상자가 어느 방향에서 들어와 목표에 안착할지를 먼저 정해두면, 그 경로를 거스르는 밀기를 자연히 피하게 된다. 그리고 두들푸시에는 되돌리기 기능이 있다. 막혔다고 판단되면 몇 수를 더 두고 고민하기보다, 데드락이 의심되는 그 순간 바로 되돌리는 편이 수를 아낀다. 참고로 두들푸시의 12개 레벨은 무작위로 생성된 판이 아니라 하나하나 손으로 설계됐다. 무작위 생성 퍼즐과 달리, 모든 판에 실제로 데드락을 피해가는 의도된 해법이 존재한다는 뜻이니 막혔다면 판이 잘못된 게 아니라 되돌릴 지점을 놓친 것이다.
12개 레벨을 여는 숫자들
두들푸시 레벨 데이터는 게임 코드 안에 열두 개의 문자 격자로 그대로 박혀 있다. 격자 크기와 상자 개수를 표로 정리하면 난이도가 어떻게 설계됐는지가 보인다.
| 레벨 | 격자 크기 | 상자 수 | 코드 주석 |
|---|---|---|---|
| 1 | 3×5 | 1 | 밀기 배우기 |
| 2 | 5×5 | 1 | 자리 잡고 밀기 |
| 3 | 4×6 | 2 | 두 상자 직진 |
| 4 | 5×6 | 2 | 두 상자, 두 기술 |
| 5 | 5×7 | 2 | 벽 우회 |
| 6 | 5×7 | 2 | 모퉁이 재배치 |
| 7 | 6×7 | 2 | 간격 두 상자 |
| 8 | 5×6 | 2 | 순서가 중요하다 |
| 9 | 5×6 | 2 | 창고 정리 |
| 10 | 6×7 | 3 | 삼형제 일렬 |
| 11 | 5×8 | 2 | 양쪽 창고 |
| 12 | 7×8 | 3 | 피날레 |
12판을 통틀어 밀어야 하는 상자는 총 24개다. 상자 수만 보면 1~2개 언저리에서 크게 늘지 않는데, 실제로 체감 난이도가 계속 올라가는 이유는 상자 개수가 아니라 격자 크기와 벽 배치다. 레벨 5의 '벽 우회'나 레벨 7의 '간격 두 상자'처럼, 상자는 두 개뿐이라도 상자 사이·벽 사이 통로가 좁아지면 순서를 한 번만 잘못 잡아도 앞서 정리한 데드락 패턴 중 하나에 걸린다. 코드에 남은 주석("순서가 중요하다", "창고 정리")은 사실 이 글의 데드락 설명과 정확히 같은 문제를 가리키고 있다.
격자 뒤편의 기호 체계
화면에는 보이지 않지만 코드 안에서는 각 칸이 문자 하나로 표현된다. #은 벽, @는 목표 칸이 아닌 자리의 캐릭터, +는 목표 칸 위의 캐릭터, $는 목표가 아닌 자리의 상자, *는 목표 위에 올라간 상자, .은 비어 있는 목표 칸이다. 상자를 목표로 밀어 넣으면 $가 *로 바뀌고 해당 칸에 초록색 팝 애니메이션이 걸린다. 모든 목표 칸이 *가 됐는지를 매 수마다 확인해서 클리어를 판정한다. 소코반 계열 퍼즐을 직접 만들어보고 싶은 사람에게는 이 여섯 개 기호만으로도 웬만한 판을 텍스트로 설계할 수 있다는 뜻이기도 하다.
되돌리기는 왜 거의 무한정처럼 느껴질까
되돌리기 버튼을 누르면 직전 상태 하나만 복원되는 게 아니라, 매 수마다 격자 전체의 스냅샷을 배열에 쌓아뒀다가 그중 가장 최근 것을 꺼내 쓰는 방식이다. 이 히스토리는 최대 200수까지 쌓이고, 그 이상은 오래된 기록부터 버려진다. 12개 레벨 중 가장 큰 판(레벨 12, 7×8)도 200수 근처까지 갈 일은 사실상 없기 때문에, 실전에서는 되돌리기 한도를 신경 쓸 필요가 없다. 키보드로 플레이한다면 방향키 외에 'z' 키가 되돌리기에 그대로 연결되어 있다는 것도 게임 화면 어디에도 적혀 있지 않은 단축키다.
스와이프·D패드·키보드, 결국 같은 함수
두들푸시는 조작 수단이 세 가지(화면 스와이프, D패드 버튼, 키보드 방향키)지만 셋 다 내부적으로는 같은 이동 함수 하나를 호출한다. 스와이프의 경우 손을 뗀 지점과 짚은 지점의 거리 차가 가로세로 어느 쪽이든 18px을 넘지 않으면 조작으로 인정하지 않는데, 이는 화면을 살짝 스치기만 한 실수 입력을 걸러내기 위한 최소 여유값이다. 18px 미만의 흔들림은 그냥 무시되니, 손이 떨려도 상자가 엉뚱한 방향으로 밀릴 걱정은 안 해도 된다.