미로 탈출 게임

방향키(또는 화면 버튼)로 캐릭터를 움직여 매번 새롭게 생성되는 미로의 출구를 찾아보세요. 탈출하면 최단 경로와 내 이동 횟수를 비교해 줍니다.

이동 횟수: 0시간: 0초

방향키·WASD 또는 위 버튼으로 이동하세요. 시간은 첫 이동부터 재기 시작하며, 지나온 칸은 연하게 표시됩니다.

게임 방법

왼쪽 위의 초록색 칸이 시작점이고 오른쪽 아래의 빨간색 칸이 출구입니다. 파란 원이 내 캐릭터이며, 방향키 또는 W·A·S·D 키, 화면의 ▲◀▶▼ 버튼으로 한 번에 한 칸씩 움직입니다. 벽이 막고 있는 방향으로 누르면 이동하지 않고 효과음만 나며, 이때는 이동 횟수가 늘지 않습니다. 이동 횟수는 실제로 칸을 옮긴 횟수이므로 막다른 길에 들어갔다가 되돌아 나오는 것도 모두 포함됩니다. 시간은 첫 이동을 하는 순간부터 재기 시작해 출구에 도착하면 멈추고, 지나간 칸은 옅은 파란색으로 남아 어디를 이미 확인했는지 알려 줍니다. 난이도를 바꾸거나 ‘새 미로’를 누르면 그 자리에서 새 미로가 만들어지고 기록은 처음으로 돌아갑니다. 점수나 최고 기록은 따로 저장하지 않으며 서버로 보내는 정보도 없습니다.

난이도별 미로 규격

세 난이도는 정사각형 격자의 한 변 칸 수만 다릅니다. 아래 표는 게임 코드의 칸 수와 칸 크기 상수에서 계산한 값입니다. 통로 수는 미로가 ‘모든 칸이 연결되고 순환 경로가 없는’ 구조라서 칸 수에서 1을 뺀 값으로 정해집니다(칸이 N개인 연결 구조에서 순환이 없으면 연결선이 정확히 N−1개). 남는 내부 벽의 수는 칸 사이의 전체 경계 2n(n−1)개에서 뚫린 통로를 뺀 (n−1)²개입니다.

난이도격자칸 수뚫린 통로남은 내부 벽캔버스(px)
쉬움11×11121120100352×352
보통17×17289288256408×408
어려움23×23529528484460×460

최단 이동 횟수 기준표

시작점과 출구는 항상 대각선 양 끝 칸이므로, 벽이 하나도 없다고 가정해도 최소 2(n−1)번은 움직여야 합니다. 실제 미로는 구불구불해서 최단 경로가 이보다 훨씬 깁니다. 아래 표의 ‘측정값’은 이 페이지의 생성 방식을 크기별로 3,000번씩 돌려 시작점에서 출구까지의 최단 이동 횟수를 구한 시뮬레이션 결과입니다(난수라서 실제 판마다 다릅니다). 하위 10%·중앙값·상위 10%는 3,000개 중 순서상 해당 위치의 값입니다.

난이도이론 하한측정 최소하위 10%중앙값상위 10%벽 따라가기 최대
쉬움2020325278240
보통324068112164576
어려움44601121902741056

‘벽 따라가기 최대’는 뒤에서 설명할 한쪽 손 벽 따라가기 방식이 아무리 운이 나빠도 넘지 않는 이동 횟수의 상한입니다. 모든 통로를 오가는 데 최대 두 번씩 쓰므로 2×(칸 수−1)이 됩니다. 게임이 끝나면 화면에는 그 판의 실제 최단 이동 횟수와 내 이동 횟수가 함께 표시됩니다.

효율 계산과 검산 예시

이동 효율은 최단 이동 횟수 ÷ 내 이동 횟수 × 100(%)입니다. 100%면 한 번도 헤매지 않고 최단 경로로 갔다는 뜻입니다.

미로는 어떻게 만들어지나요?

이 게임은 ‘깊이 우선 탐색 되돌아가기(recursive backtracker)’라는 널리 알려진 방식을 반복문과 스택으로 구현해 미로를 만듭니다. 모든 칸의 네 면이 벽인 상태에서 시작 칸을 방문 처리하고, 아직 가 보지 않은 이웃 칸 중 하나를 무작위로 골라 둘 사이의 벽을 허물며 이동합니다. 갈 곳이 없으면 스택에서 한 칸씩 되돌아가 다른 방향을 시도하고, 스택이 비면 모든 칸이 방문된 것입니다. 무작위 선택에는 브라우저의 Math.random이 쓰이며 암호용 난수가 아니므로 보안 목적으로 쓸 수 없습니다.

결과는 모든 칸이 연결되고 순환 경로가 없는 ‘완벽한 미로’입니다. 어느 두 칸 사이에도 길이 정확히 하나뿐이므로 출구에 닿을 수 없는 판은 생기지 않습니다. 이 방식은 일반적으로 길고 구불구불한 통로와 상대적으로 적은 갈림길을 만든다고 알려져 있습니다. 위 표에서 보통 난이도의 최단 경로 중앙값 112회가 이론 하한 32회의 약 3.5배인 것도 이런 성질과 맞아떨어집니다.

크기별 미로의 성격: 시뮬레이션 비교표

아래 표는 앞의 측정값과 같은 시뮬레이션(크기별 3,000판, 이 페이지의 생성 방식과 같은 알고리즘)에서 뽑은 비교 지표입니다. 실제 판마다 값이 다르며 코드에 저장된 값이 아니라 반복 실험의 요약입니다. ‘경로 비율’은 최단 경로 중앙값을 전체 칸 수로 나눈 값으로, 길이 미로 전체의 몇 %를 지나가는지 보여 줍니다. ‘편차 배율’은 상위 10% 값을 하위 10% 값으로 나눈 것으로, 판에 따라 길이가 얼마나 들쭉날쭉한지 나타냅니다. ‘벽 따라가기’는 오른손을 벽에 대고 따라가는 방식의 이동 횟수 중앙값이며, 막다른 칸은 통로가 한 방향뿐인 칸의 평균 개수입니다.

난이도경로 비율중앙값 ÷ 하한편차 배율벽 따라가기 중앙값벽 따라가기 ÷ 최단막다른 칸(평균)
쉬움43.0%2.6배2.4배1062.0배약 14개 (12%)
보통38.8%3.5배2.4배2622.3배약 31개 (11%)
어려움35.9%4.3배2.4배4802.5배약 55개 (10%)

표에서 읽을 수 있는 점은 세 가지입니다. 첫째, 격자가 커질수록 최단 경로가 차지하는 칸의 비율이 낮아집니다. 즉 큰 미로일수록 정답 길 바깥에 막다른 가지가 많아 헤매기 쉽습니다. 둘째, 상위 10%와 하위 10%의 배율이 약 2.4배 안팎이어서 어떤 판은 평균의 절반 정도로, 어떤 판은 평균보다 훨씬 긴 길이 나옵니다. 그래서 이동 횟수보다 효율(%)로 평가하는 편이 공정합니다. 셋째, 벽 따라가기는 최단 경로보다 대략 2배 이상의 이동이 필요합니다. 이는 모든 가지를 갔다 오는 만큼의 비용입니다.

이동 횟수는 항상 짝수입니다

칸을 한 번 옮길 때마다 가로+세로 좌표의 합이 1씩 바뀌어 홀짝이 번갈아 달라집니다. 시작 칸의 좌표 합은 0, 출구 칸은 2(n−1)이라 둘 다 짝수이므로, 출구에 도착했을 때의 이동 횟수는 항상 짝수입니다. 화면에 홀수가 찍힌 채 탈출 메시지가 나오는 일은 없으며, 같은 이유로 그 판의 최단 이동 횟수도 항상 짝수입니다. 위 표의 값이 모두 짝수인 것도 이 때문입니다. 효율 계산의 분자·분모가 짝수라는 사실은 계산 검산에도 쓸 수 있습니다. 예컨대 최단 128회인 판에서 내 이동이 201회로 보고되면 어딘가 잘못 센 것입니다.

시나리오: 보통 난이도 세 판의 효율 추이

아래는 보통(17×17)에서 세 번 연속 플레이한 가상의 기록입니다. 최단 이동 횟수는 게임 종료 메시지에 표시되는 값이라고 가정했고, 효율은 최단 ÷ 내 이동 × 100을 반올림했습니다.

판최단 이동내 이동추가 이동효율
1번째961889251%
2번째1282027463%
3번째1041444072%

세 판의 평균 이동은 178회로 단순하게 보면 ‘잘 늘고 있다’고 느끼기 어렵지만, 효율은 51% → 63% → 72%로 오르고 있고 평균은 62%입니다. 두 번째 판은 최단 거리가 128회로 첫 판보다 길었는데도 추가 이동은 74회였습니다. 이처럼 판 길이가 달라도 효율이라는 기준을 쓰면 연습의 효과를 비교할 수 있습니다. 목표를 세운다면 ‘효율 70% 이상’처럼 비율로 정하세요.

탈출 요령

화면과 조작 관련 메모

방향키·WASD는 페이지 스크롤이나 난이도 선택 칸의 값이 바뀌는 동작보다 우선하도록 처리되어 있어, 게임 중 화면이 위아래로 움직이지 않습니다. 난이도를 고른 직후에는 선택 칸에서 포커스를 풀어 바로 키보드로 이동할 수 있게 했습니다. 스마트폰에서는 캔버스 아래의 4방향 버튼을 누르세요. 캔버스는 화면 폭에 맞게 줄어들지만 내부 해상도는 그대로여서 선명도는 유지됩니다. 가장 큰 23×23 미로는 460px 정사각형 캔버스이므로 작은 폰 화면에서는 약간 축소되어 보일 수 있습니다. 움직이는 적이 나오는 변형이 궁금하면 미로 술래잡기 게임을, 기울여 굴리는 방식은 미로 구슬 굴리기 게임을 이용해 보세요.

기록을 늘려 가는 방법

같은 난이도를 여러 번 반복하며 이동 횟수보다 효율(%)을 기준으로 변화를 보세요. 길이 유일한 미로에서는 출구에서 시작점으로 거꾸로 따라가도 같은 길이 나온다는 점을 이용할 수 있습니다. 시작하자마자 움직이지 말고, 쉬움·보통 난이도에서는 출구 칸에서 눈으로 길을 거슬러 올라가며 첫 갈림길까지 확인해 보세요. 막다른 길이 짧게 끝나는 곳이 많은 미로라면 그 길을 눈으로 미리 소거할 수 있습니다. 어려움(23×23) 미로는 캔버스가 큰 만큼 한눈에 보기 어려우므로, 갈림길을 하나씩 통과할 때마다 옅은 파란 흔적으로 확인하며 진행하는 방식이 안정적입니다. 효율 100%는 한 번도 헤매지 않았다는 뜻이므로 사실상 눈으로 완전히 길을 파악한 경우에만 가능하며, 처음에는 50~70% 정도를 목표로 해도 충분합니다. 시간 기록은 입력 속도와 기기에 영향을 받으니 이동 횟수·효율과 함께 참고 지표로만 보시기 바랍니다.

자주 묻는 질문

미로에 여러 개의 길이 있나요?

이 알고리즘으로 만든 미로는 어느 두 지점 사이에도 경로가 정확히 하나뿐인 ‘완벽한 미로’입니다. 갈림길은 많지만 순환이 없어 돌아서 갈 다른 길이 없고, 막다른 길에서는 되돌아 나와야 합니다.

벽에 부딪히면 이동 횟수가 늘어나나요?

아니요. 벽을 향해 누르면 효과음만 나고 이동 횟수는 바뀌지 않습니다. 이동 횟수는 실제로 칸을 옮긴 횟수만 셉니다.

시간은 언제부터 재나요?

미로가 만들어진 직후가 아니라 첫 이동을 하는 순간부터 재기 시작합니다. 판을 훑어보는 시간은 기록에 들어가지 않으며, 출구에 도착하면 멈춰 소수점 한 자리까지 표시합니다.

모바일에서도 플레이할 수 있나요?

네, 화면의 방향 버튼을 터치해서 이동할 수 있어 키보드가 없는 환경에서도 즐길 수 있습니다. 버튼을 연속으로 눌러 이동하세요.

같은 미로를 다시 풀 수 있나요?

미로는 매번 난수로 만들어지고 저장되지 않으므로 같은 모양이 다시 나오지 않습니다. 새로고침하거나 난이도를 바꾸면 현재 판은 사라집니다.

한글 입력 상태에서도 WASD가 되나요?

코드는 눌린 글자(key)뿐 아니라 물리 키 위치(code: KeyW, KeyA, KeyS, KeyD)로도 방향을 인식하므로, 한글 입력 상태에서도 같은 자리의 키가 이동으로 작동하도록 되어 있습니다. 방향키는 입력 상태와 무관합니다. Ctrl·Alt·Meta 키를 함께 누른 조합은 무시되어 브라우저 단축키와 겹치지 않습니다.

이동 횟수가 항상 짝수인 이유는 무엇인가요?

한 칸 이동할 때마다 좌표 합의 홀짝이 바뀌고, 시작과 출구의 좌표 합이 모두 짝수이기 때문입니다. 그래서 탈출 시점의 이동 횟수와 최단 이동 횟수는 항상 짝수가 됩니다.

효율이 100%를 넘을 수도 있나요?

없습니다. 최단 이동 횟수는 너비 우선 탐색으로 구한 실제 최솟값이므로 내 이동은 그보다 적을 수 없습니다. 효율은 최대 100%입니다.

시간 표시가 초 단위로만 올라가는데 정확한가요?

플레이 중에는 0.5초 간격으로 화면의 초 숫자를 갱신하고 소수점 아래는 버립니다. 탈출하면 실제 경과 시간을 소수점 한 자리까지 다시 계산해 표시하므로, 결과 메시지의 값이 더 정확합니다.

함께 보면 좋은 도구