한눈에 보는 게임 규칙
초록색 내 빛과 파란색 컴퓨터의 빛이 동시에 한 칸씩 움직이며 지나간 칸에 지워지지 않는 궤적을 남깁니다. 벽, 내 궤적, 컴퓨터의 궤적 중 어느 것에든 머리가 닿으면 그 자리에서 패배하고, 두 빛이 같은 칸으로 동시에 들어가려 하면 둘 다 충돌한 것으로 처리되어 무승부입니다. 먹이도 점수도 없는 순수한 생존 대결이라, 모든 판단은 "앞으로 내가 쓸 수 있는 빈 칸이 얼마나 남는가"로 귀결됩니다. 승·패·무승부 횟수와 이동 칸 수는 화면에서 보이는 현재 접속 동안만 세어지며, 새로고침하면 0으로 돌아갑니다. 어떤 기록도 저장되지 않습니다.
경기장과 속도: 코드에서 읽은 수치
| 항목 | 값 |
|---|---|
| 캔버스 크기 | 360×264픽셀 |
| 한 칸 크기 | 12픽셀 (경기장 30×22칸 = 660칸) |
| 이동 주기 | 90밀리초마다 한 칸 (초당 약 11.1칸) |
| 내 시작 위치 | 가로 4번째 칸·세로 11번째 칸(0부터), 오른쪽으로 이동 |
| 컴퓨터 시작 위치 | 가로 25번째 칸·세로 11번째 칸, 왼쪽으로 이동 |
| 정면 대치 거리 | 두 빛 사이에 빈 칸 20개 |
두 빛이 같은 가로줄에서 서로를 향해 출발하므로 입력 없이 직진하면 11번째 이동에서 충돌합니다. 두 빛이 매 이동마다 서로 한 칸씩 다가가 10번 이동하면 사이의 빈 칸 20개가 모두 사라지고, 그다음 이동이 상대 궤적 위로 들어가는 이동이 되기 때문입니다. 이 게임에서는 시작하자마자 방향을 꺾는 것이 사실상 첫 번째 필수 동작입니다.
시작 위치에서 직진했을 때 걸리는 시간
내 빛이 시작 위치에서 한 방향으로만 직진하면 벽에 닿기까지 이동할 수 있는 칸 수와 걸리는 시간은 아래와 같습니다(이동 주기 90밀리초 기준). 시작 방향이 오른쪽이므로 왼쪽으로는 바로 갈 수 없고, 위나 아래로 한 번 꺾은 뒤에야 왼쪽을 쓸 수 있습니다.
| 직진 방향 | 벽 앞까지 이동 가능한 칸 | 걸리는 시간(초) |
|---|---|---|
| 위(▲) | 11칸 | 0.99 |
| 아래(▼) | 10칸 | 0.90 |
| 오른쪽(▶, 시작 방향) | 25칸 | 2.25 |
| 왼쪽(◀, 한 번 꺾은 뒤에만 가능) | 4칸 | 0.36 |
표의 오른쪽 수치(25칸, 2.25초)는 이론상 벽까지의 거리일 뿐 실제로는 컴퓨터가 같은 줄을 마주 보고 오기 때문에 그만큼 갈 수 없습니다. 위나 아래로 꺾으면 그 줄에 길이 열리지만, 벽 앞까지 직진하면 세로로 10~11칸(약 0.9~1초)밖에 못 갑니다. 이 사실에서 나오는 첫 번째 원칙은 "벽에 닿기 전에 방향을 한 번 더 꺾을 계획을 먼저 세워 두라"는 것입니다.
컴퓨터는 이렇게 움직입니다
컴퓨터의 규칙은 코드로 확인할 수 있을 만큼 단순합니다. 매 이동마다 현재 방향(직진)을 가장 먼저 후보로 두고, 그다음 위·아래·왼쪽·오른쪽 순으로 후보를 훑되 지금 방향의 정반대는 건너뜁니다. 후보 중 바로 앞 한 칸이 비어 있는 첫 번째 방향을 고릅니다. 따라서 앞이 막히지 않는 한 항상 직진하고, 앞이 막혔을 때에야 꺾습니다. 가로로 달리다 막히면 위쪽이 우선이고, 세로로 달리다 막히면 왼쪽이 먼저 후보가 됩니다. 이 규칙에는 두 가지 성질이 따라옵니다.
- 한 칸 앞만 본다: 꺾은 뒤 갇힐 공간인지는 전혀 따지지 않습니다. 컴퓨터가 막다른 구역으로 들어가 스스로 멈추는 장면이 생기는 이유입니다.
- 예측할 수 있다: 난수를 쓰지 않습니다. 같은 상황이면 항상 같은 선택을 하므로 어디로 꺾을지 미리 읽을 수 있습니다. 이 게임에서 난수는 사용되지 않습니다.
- 충돌 직전에야 반응한다: 내 궤적이 컴퓨터 앞을 가로막는 순간 컴퓨터는 그 자리에서 꺾지만, 꺾을 곳이 없으면 그대로 충돌합니다.
첫 순간의 검증된 시나리오
게임 코드의 규칙을 그대로 옮겨 시뮬레이션하면 입력이 없는 경우 정확히 11번째 이동에서 패배합니다. 이때 내 빛은 가로 14번 칸(0부터 센 위치), 컴퓨터의 빛은 15번 칸에 서 있고 내 앞 칸이 컴퓨터의 궤적이라 충돌하며, 컴퓨터가 막힌 앞에서 위로 꺾을 수 있어 한 번에 둘이 다 죽는 무승부가 아니라 나만 지게 됩니다. 또 첫 이동에서 곧바로 위로 꺾어 끝까지 직진하면 12번째 이동에 위쪽 벽에 닿아 패배합니다(약 1.08초). 즉 두 번 이상 방향을 바꿔야 컴퓨터와 나란히 오래 가는 판에 진입합니다. 이 시나리오는 이동 순서가 같은 틱에서 동시에 처리된다는 점도 보여 줍니다. 내 이동과 컴퓨터 이동은 같은 순간 각자 계산된 뒤 합쳐집니다.
시간이 지나면 경기장은 얼마나 차는가
한 틱마다 두 빛이 각각 한 칸을 점유하므로 경기장은 틱당 2칸씩 줄어듭니다. 시작 때 이미 점유한 2칸을 합쳐 계산하면 아래와 같습니다. 이론적으로 두 빛이 한 번도 충돌하지 않는 최대 이동 횟수는 329틱(약 29.61초)이며, 현실에서는 훨씬 이른 시점에 길이 막힙니다.
| 이동 횟수 | 경과 시간(초) | 점유 칸 | 점유율 | 남은 빈 칸 |
|---|---|---|---|---|
| 0 | 0.00 | 2 | 0.3% | 658 |
| 25 | 2.25 | 52 | 7.9% | 608 |
| 50 | 4.50 | 102 | 15.5% | 558 |
| 100 | 9.00 | 202 | 30.6% | 458 |
| 150 | 13.50 | 302 | 45.8% | 358 |
| 200 | 18.00 | 402 | 60.9% | 258 |
| 250 | 22.50 | 502 | 76.1% | 158 |
| 300 | 27.00 | 602 | 91.2% | 58 |
| 329 | 29.61 | 660 | 100.0% | 0 |
단순한 계획 일곱 가지가 어떻게 끝나는가
컴퓨터에 난수가 없으므로 "이 순서대로 입력하면 이렇게 끝난다"를 규칙 그대로 계산할 수 있습니다. 아래 표는 이 페이지의 충돌 판정과 컴퓨터 방향 선택 규칙을 빌드 시 그대로 시뮬레이션한 결과입니다. 계획이 끝난 뒤에는 마지막 방향으로 계속 직진한다고 가정했고, 방향 전환은 매 이동 시작 시점에 정확히 적용되는 이상적인 입력을 전제로 합니다.
| 입력 계획 | 끝난 이동 횟수 | 경과 시간(초) | 결과 |
|---|---|---|---|
| 입력 없이 직진(오른쪽 입력으로 시작만) | 11 | 0.99 | 패배 |
| 즉시 위로 꺾어 계속 직진 | 12 | 1.08 | 패배 |
| 즉시 아래로 꺾어 계속 직진 | 11 | 0.99 | 패배 |
| 오른쪽 9칸 후 위로 계속 직진 | 21 | 1.89 | 패배 |
| 위 3칸 후 오른쪽으로 계속 직진 | 29 | 2.61 | 패배 |
| 오른쪽 4칸, 위 5칸, 오른쪽으로 계속 직진 | 31 | 2.79 | 패배 |
| 오른쪽 8칸, 위 2칸, 오른쪽 2칸, 아래 1칸, 오른쪽 1칸 | 14 | 1.26 | 승리 |
여섯 가지 단순 계획은 모두 1~3초 안에 패배로 끝납니다. 방향을 한두 번 바꾸는 정도로는 부족하고, 꺾은 뒤에도 앞에 열려 있는 줄이 계속 남도록 이어서 설계해야 합니다. 반대로 마지막 계획은 이동 14번(약 1.26초) 만에 컴퓨터가 막히는 승리입니다. 이 결과는 어디까지나 규칙 시뮬레이션이며 실제 플레이에서는 입력 시점이 한 틱(90밀리초)만 어긋나도 다른 결과가 나옵니다.
컴퓨터를 14번 이동 만에 가두는 패턴 해부
마지막 계획이 통하는 이유는 컴퓨터의 "직진이 막힐 때만 꺾는다"는 규칙을 이용해 컴퓨터를 내 궤적 두 줄 사이로 끌어들이기 때문입니다. 컴퓨터는 가로줄을 따라 왼쪽으로 직진하다가, 내가 그 줄 위에 그어 놓은 궤적 때문에 막히면 위쪽으로 꺾습니다. 그 위쪽 줄이 이미 내 궤적으로 막혀 있으면 꺾은 직후에 다시 막혀 충돌합니다. 표는 핵심 틱의 두 빛 위치입니다(위치는 가로,세로 칸 번호이고 0부터 셉니다. 마지막 틱의 위치는 충돌 직전 위치입니다).
| 이동 횟수 | 시간(초) | 내 입력 | 내 위치 | 컴퓨터 위치 | 결과 |
|---|---|---|---|---|---|
| 1 | 0.09 | 오른쪽 | 5,11 | 24,11 | 진행 |
| 8 | 0.72 | 오른쪽 | 12,11 | 17,11 | 진행 |
| 9 | 0.81 | 위 | 12,10 | 16,11 | 진행 |
| 10 | 0.90 | 위 | 12,9 | 15,11 | 진행 |
| 11 | 0.99 | 오른쪽 | 13,9 | 14,11 | 진행 |
| 12 | 1.08 | 오른쪽 | 14,9 | 13,11 | 진행 |
| 13 | 1.17 | 아래 | 14,10 | 13,10 | 진행 |
| 14 | 1.26 | 오른쪽 | 14,10 | 13,10 | 승리 |
13번째 이동에서 컴퓨터는 가로줄 앞(12번 칸)이 내 궤적에 막혀 위로 꺾고, 14번째 이동에서는 그 위 칸이 내가 먼저 그어 둔 위쪽 줄의 궤적이라 막힙니다. 그동안 나는 아래로 한 칸 내려와 오른쪽의 빈 칸으로 빠져나가기 때문에 살아남습니다. 이 패턴은 컴퓨터가 앞만 보고 꺾는 이유를 가장 극단적으로 보여 주는 예이며, 요령은 "컴퓨터가 꺾을 위쪽 줄을 내가 먼저 그어 둔다"는 한 문장으로 줄일 수 있습니다. 다만 입력 순서가 맞아도 타이밍이 어긋나면 되지 않으므로, 먼저 연습으로 가로줄 직진 길이(8칸)와 꺾는 틱을 익히는 편이 낫습니다.
반응 시간과 입력 여유
칸 단위로 움직이는 게임이라 "벽이나 궤적 앞에서 얼마나 늦게 꺾어도 되는가"는 남은 빈 칸 수에 90밀리초를 곱한 값으로 어림할 수 있습니다. 앞에 빈 칸이 n개 남았을 때 꺾지 않으면 n+1번째 이동에서 충돌하므로, 그 이동이 시작되기 전까지 입력이 적용되어야 합니다.
| 앞에 남은 빈 칸 | 꺾을 수 있는 대략의 여유 시간 |
|---|---|
| 1칸 | 약 90밀리초 |
| 2칸 | 약 180밀리초 |
| 3칸 | 약 270밀리초 |
| 4칸 | 약 360밀리초 |
| 6칸 | 약 540밀리초 |
| 10칸 | 약 900밀리초 |
이 표는 이론값이며 화면 표시와 입력 장치의 지연은 포함하지 않습니다. 따라서 장애물 바로 앞에서 꺾으려는 습관은 위험하고, 빈 칸이 3~4칸 남았을 때 미리 입력하는 것이 안전합니다. 앞에서 설명한 입력 큐는 한 틱에 한 방향만 적용하되 최대 두 개까지 쌓아 둡니다. 예를 들어 위쪽 키를 누른 직후 왼쪽 키를 누르면 두 입력이 큐에 쌓여, 한 틱 동안 위로 한 칸 가고 다음 틱에 왼쪽으로 꺾입니다. 큐가 이미 두 개 차 있으면 새 입력은 버려집니다.
이기는 방법: 공간을 먼저 확보한다
- 초반 3틱 안에 정면 충돌을 피합니다. 입력이 없으면 11틱에 부딪히므로, 위나 아래로 꺾어 세로 방향의 여유 칸(위 11칸, 아래 10칸)을 쓰기 시작합니다.
- 가장 넓은 구역 쪽으로 갑니다. 갈림길마다 앞쪽에 이어지는 빈 칸이 더 큰 쪽을 고르면, 컴퓨터가 한 칸 앞만 본다는 약점이 그대로 드러납니다.
- 벽을 따라 도는 것은 한동안 안전하지만 안쪽 공간을 상대에게 내주는 선택입니다. 가장자리 한 줄을 다 쓰고 나면 남은 빈 칸은 안쪽뿐이라, 거기에 출구가 남아 있는지 미리 확인해야 합니다.
- 컴퓨터의 진로를 끊는 방향으로 꺾습니다. 컴퓨터는 막혀도 후보 순서대로만 꺾으므로, 그 순서의 선택지를 모두 막는 궤적을 그리면 컴퓨터가 즉시 충돌합니다.
- 자기 궤적 안으로 나선형으로 들어가지 않습니다. 안쪽으로 감아 들어가는 방식은 마지막에 출구가 없어집니다.
이 규칙을 기준으로 코드 규칙을 옮긴 시뮬레이션을 돌려 보면, 매 이동마다 후보 방향 앞칸에서 이어지는 빈 칸의 개수가 가장 많은 방향(동률이면 직진)을 고르는 전략은 224번째 이동에서 동시 충돌해 무승부로 끝났습니다(약 20초). 이는 시뮬레이션 한 번의 결과이며 승률이 아니라, 컴퓨터가 쉽게 속지는 않지만 단순한 공간 우선 규칙만으로도 오래 버틸 수 있음을 보여 주는 예입니다.
조작과 입력 처리
- 키보드: 방향키 또는 W·A·S·D. 스페이스바와 P는 일시정지입니다. 방향키로 페이지가 스크롤되지 않도록 막아 둡니다.
- 화면 버튼과 스와이프: 터치 기기는 ▲◀▼▶ 버튼을 누르거나 캔버스 위를 한 방향으로 쓸어 방향을 바꿉니다.
- 입력 큐: 한 틱(90밀리초) 안에 방향을 연속으로 두 번 눌러도 순서대로 하나씩 적용됩니다. 진행 방향의 정반대(U턴)는 무시되어 자기 궤적에 곧바로 부딪히는 실수를 막습니다.
- 일시정지: 탭을 다른 창으로 바꾸면 자동으로 일시정지됩니다. 대결이 끝났거나 일시정지 중일 때의 방향 입력은 무시됩니다.
흔한 실수와 한계
- 방향을 꺾을 때 벽 한 칸 앞까지 미루는 것: 꺾은 뒤 다음 직선이 짧으면 곧 다시 막힙니다. 꺾을 곳은 한 칸 일찍 정하세요.
- 연속 입력 실수: 키를 짧게 두 번 누르면 빠르게 90도씩 꺾이므로 의도하지 않은 방향으로 갈 수 있습니다.
- 한계: 컴퓨터는 하나뿐이고 난이도를 고를 수 없으며, 경기장 크기도 고정입니다. 승패 기록은 저장되지 않습니다.
자주 묻는 질문
모바일에서도 플레이할 수 있나요?
네. 화면의 방향 버튼을 누르거나 캔버스 위를 위·아래·좌·우로 쓸어 넘기면 방향이 바뀝니다. 버튼을 누르거나 스와이프하는 첫 입력으로 게임이 시작됩니다.
컴퓨터는 어떻게 움직이나요?
직진하다가 앞 한 칸이 막히면, 위·아래·왼쪽·오른쪽 순서로 훑어 막히지 않은 첫 방향으로 꺾습니다. 난수를 쓰지 않아 항상 같은 선택을 하고, 한 칸 앞만 보기 때문에 막다른 구역에 갇히는 일이 있습니다.
무승부는 어떻게 나오나요?
두 빛이 같은 칸으로 동시에 들어가려 하거나, 같은 틱에 둘 다 막힌 칸에 부딪히면 무승부이며 승리·패배 횟수는 변하지 않고 무승부 횟수만 올라갑니다.
시작하자마자 지는 이유가 뭔가요?
두 빛이 같은 줄에서 마주 보고 출발하기 때문에 11번째 이동에서 맞닥뜨립니다. 시작 입력을 하기 전에는 움직이지 않으니, 시작과 동시에 위나 아래로 꺾으세요.
같은 방향키를 계속 누르고 있어야 하나요?
아닙니다. 한 번 누르면 그 방향으로 계속 직진하며, 새 방향키를 누를 때만 방향이 바뀝니다.
스와이프가 인식되지 않을 때는 어떻게 하나요?
캔버스 위에서 손가락이나 마우스를 20픽셀 이상 움직여야 방향 입력으로 인식합니다. 가로 이동량과 세로 이동량 중 큰 쪽을 방향으로 삼으므로 대각선으로 쓸면 더 많이 움직인 축으로 판정됩니다. 짧게 건드린 정도로는 입력되지 않으니 화면 버튼을 함께 쓰세요.
새 대결을 누르면 승패 기록은 어떻게 되나요?
새 대결은 경기장과 이동 칸 수만 초기화하고 승리·패배·무승부 횟수는 그대로 둡니다. 페이지를 새로고침하거나 닫으면 횟수가 0으로 돌아가며 어디에도 저장되지 않습니다.
일시정지 중에 방향키를 누르면 어떻게 되나요?
일시정지 중이거나 대결이 끝난 상태의 방향 입력은 무시됩니다. 스페이스바 또는 P 키(또는 계속하기 버튼)로 재개한 뒤에 입력하세요. 다른 탭으로 이동하면 자동으로 일시정지됩니다.
같은 입력인데 결과가 달라지는 이유는 무엇인가요?
컴퓨터는 난수 없이 항상 같은 규칙으로 움직이므로 같은 시점에 같은 입력을 하면 같은 결과가 나옵니다. 결과가 달라졌다면 입력이 들어간 틱이 한 칸 어긋났을 가능성이 큽니다. 입력 큐가 한 틱에 하나씩만 적용하는 점도 영향을 줍니다.
비슷한 게임도 있나요?
먹이를 먹으며 몸이 길어지는 스네이크 게임, 장애물을 피해 날아가는 틈새 비행 피하기 게임, 길을 찾는 미로 탈출 게임이 있습니다.