도로의 생김새: 열 줄 중 차도는 여섯 줄
화면은 가로 7칸 × 세로 10줄이며 한 칸은 가로 50픽셀, 세로 40픽셀입니다. 캐릭터(주황색 원)는 맨 아래 줄 가운데 칸에서 시작해 맨 위 줄에 닿으면 1점을 얻고 곧바로 출발선으로 되돌아갑니다. 줄 10개 중 안전한 줄이 4개(도착선, 인도 두 줄, 출발선), 차량이 다니는 차도가 6개이며, 한 번 건너려면 위쪽으로 최소 9번 이동해야 합니다.
| 줄 번호(위쪽이 0) | 종류 | 차량 진행 방향 |
|---|---|---|
| 0 | 도착선(안전) | - |
| 1 | 차도 | ← 왼쪽 |
| 2 | 차도 | 오른쪽 → |
| 3 | 인도(안전) | - |
| 4 | 차도 | 오른쪽 → |
| 5 | 차도 | ← 왼쪽 |
| 6 | 인도(안전) | - |
| 7 | 차도 | ← 왼쪽 |
| 8 | 차도 | 오른쪽 → |
| 9 | 출발선(안전) | - |
강조된 줄이 차도입니다. 차도는 두 줄씩 짝을 이루어 붙어 있고(1·2번, 4·5번, 7·8번 줄) 각 짝의 두 줄은 서로 반대 방향으로 달립니다. 그래서 한 줄을 넘은 뒤 바로 옆 줄까지 연달아 건너려면 두 줄의 빈틈이 같은 시간대에 열려야 합니다. 인도는 3번·6번 줄이며 인도에서는 어떤 차에도 부딪히지 않습니다.
조작과 판정
- 이동: 방향키 또는 W/A/S/D, 화면의 ▲▼◀▶ 버튼. 한 번 누르면 한 칸 이동하며, 키를 누르고 있어도 반복 이동하지 않습니다(실수로 연속 이동해 차도에 뛰어드는 것을 막기 위함).
- 충돌: 캐릭터가 서 있는 줄 위의 차량과 가로 방향으로 겹치면 즉시 게임 오버입니다. 캐릭터의 판정 폭은 칸 폭의 70%인 35픽셀(칸의 15%~85%)이고, 차량 폭은 65픽셀입니다. 차량 그림은 줄 높이의 가운데 60%만 차지하지만 충돌은 줄 전체를 기준으로 합니다.
- 화면 가장자리: 좌우 가장자리 밖으로는 이동하지 않으며, 아래쪽 출발선보다 아래로 내려갈 수도 없습니다.
- 다시 시작: 게임 오버 후 Space, Enter, R 키 또는 "다시 시작" 버튼. 화면이 바뀐 직후 0.4초 동안은 키 입력으로 재시작되지 않아 연타로 바로 넘어가는 일이 없습니다.
- 화면 주사율이 높아도 차량 이동은 경과 시간 기준으로 보정되어, 60Hz와 144Hz에서 같은 속도로 달립니다.
차량은 이렇게 움직입니다
차도 줄마다 차량은 2대 또는 3대이고, 줄별로 속도가 0.6~1.1 사이(프레임당 픽셀, 초당 약 36~66픽셀)에서 무작위로 정해집니다. 한 줄의 모든 차량은 같은 속도로 같은 방향으로 달리고, 화면 밖으로 완전히 사라지면 반대편 끝 바깥에서 다시 나타납니다. 이 때문에 차량 사이의 간격은 일정하지 않습니다. 처음에는 화면 폭을 차량 수로 나눈 간격으로 놓이지만, 되돌아오는 길이는 화면 폭에 차량 한 대의 폭을 더한 415픽셀이기 때문입니다.
| 차선 종류 | 차량 사이 빈틈(픽셀) | 가장 좁은 빈틈에서 캐릭터(35픽셀)가 움직일 수 있는 여유 |
|---|---|---|
| 2대 차선 | 110.0 / 175.0 | 75.0픽셀 |
| 3대 차선 | 51.7 / 51.7 / 116.7 | 16.7픽셀 |
3대 차선에서는 가장 좁은 빈틈의 여유가 16.7픽셀뿐입니다. 이 빈틈이 한 열을 지나가는 데 걸리는 시간이 곧 "그 칸에 머물러도 안전한 시간"이며, 속도가 1.1인 가장 빠른 차선에서는 0.25초에 불과합니다. 차량 한 대가 한 열을 완전히 지나가는 데는 1.5~2.8초, 한 줄의 차량 배치가 한 바퀴 돌아 처음으로 오는 데는 6.3~11.5초가 걸립니다.
건널수록 빨라지는 속도
도착선에 닿을 때마다 모든 차도 줄의 속도가 6% 곱해져 올라갑니다. 시간이 지나서 빨라지는 것이 아니라 오직 건넌 횟수에 따라 빨라진다는 점이 중요합니다. 속도 상한이나 초기화는 없으므로, 점수가 오를수록 차량은 계속 빨라집니다. 아래 표는 이 규칙을 그대로 계산한 값입니다.
| 건넌 횟수 | 속도 배율 | 차선 속도(픽셀/초) | 3대 차선 좁은 빈틈 여유(초) | 2대 차선 좁은 빈틈 여유(초, 가장 빠른 차선) |
|---|---|---|---|---|
| 0회 | ×1.00 | 36~66 | 0.25~0.46 | 1.14 |
| 5회 | ×1.34 | 48~88 | 0.19~0.35 | 0.85 |
| 10회 | ×1.79 | 64~118 | 0.14~0.26 | 0.63 |
| 15회 | ×2.40 | 86~158 | 0.11~0.19 | 0.47 |
| 20회 | ×3.21 | 115~212 | 0.08~0.14 | 0.35 |
| 30회 | ×5.74 | 207~379 | 0.04~0.08 | 0.20 |
표의 "3대 차선 좁은 빈틈 여유"는 가장 빠른 차선(왼쪽 값)과 가장 느린 차선(오른쪽 값)에서의 시간입니다. 건너는 횟수가 10회를 넘어가면 가장 빠른 3대 차선의 좁은 틈은 사람이 보고 대응하기 어려운 0.15초 아래로 내려옵니다. 입력이 조금만 늦어도 곧바로 충돌로 이어진다는 뜻입니다.
한 열이 비어 있는 비율
차량이 한 줄 위를 한 바퀴(415픽셀) 도는 동안 특정 열이 비어 있는 길이를 합산하면, 아무 때나 그 열에 들어섰을 때 안전할 시간의 비율을 알 수 있습니다. 각 빈틈에서 캐릭터 판정 폭(35픽셀)을 뺀 값이 그 빈틈이 열려 있는 길이이고, 이를 모두 더해 415픽셀로 나눈 것이 아래 표의 "열린 비율"입니다. 차량이 한 바퀴를 균등하게 돈다고 본 이론값이며, 실제 판의 속도와 위치는 무작위입니다.
| 차선 종류 | 차량이 한 바퀴를 채우는 비율 | 한 열이 비어 있는 비율 | 가장 넓은 빈틈의 체류 가능 시간(느린~빠른 차선, 처음 판) |
|---|---|---|---|
| 2대 차선 | 31.3% | 51.8% | 3.89~2.12초 |
| 3대 차선 | 47.0% | 27.7% | 2.27~1.24초 |
3대 차선은 임의의 순간에 한 열이 열려 있을 확률이 27.7%에 그치는 반면 2대 차선은 51.8%입니다. 붙어 있는 두 줄이 서로 독립이라고 가정하면 두 줄이 동시에 열릴 비율은 2대+2대가 약 26.8%, 3대+3대가 약 7.7%로 크게 낮아집니다. 두 줄의 속도가 서로 다르므로 실제로는 열리는 열이 계속 바뀌지만, 3대 차선이 겹친 짝을 만나면 "타이밍을 기다렸다가 한 호흡에 두 줄을 연속으로 건너는" 방식이 필수라는 뜻입니다.
코드에서 읽어낸 전략
- 시간제한이 없고 속도는 건넌 횟수로만 오릅니다. 인도(3번·6번 줄)와 출발선에서는 얼마든지 기다려도 불이익이 없으므로, 틈이 보이지 않으면 서두르지 말고 기다리세요.
- 인도 위에서는 좌우로 움직여도 안전합니다. 다음 차도 줄에서 빈틈이 막 지나가는 열을 골라 그 열로 먼저 옮겨 두면 한 번에 진입할 수 있습니다.
- 차도 두 줄이 붙어 있는 구간(1·2, 4·5, 7·8번 줄)은 첫 줄에서 머무는 시간이 가장 위험합니다. 첫 줄 진입 직후 곧바로 다음 줄로 올라갈 수 있는 열을 미리 확인한 뒤 연속 입력으로 통과하세요.
- 차도 위에서 옆으로 이동하면 그 줄에 머무는 시간만 늘어납니다. 열 선택은 인도에서 끝내고 차도에서는 위쪽으로만 움직이는 것이 안전합니다.
- 같은 방향의 줄이 붙어 있지 않으므로(오른쪽·왼쪽이 번갈아 나옴) 한쪽 방향만 보고 판단하면 놓칩니다. 두 줄의 차량 위치를 함께 보세요.
계산 예시
예시 1. 처음 판에서 3대 차선의 속도가 1.1인 줄이라면 초당 66픽셀이므로 좁은 빈틈(51.7픽셀) 안에서 캐릭터(35픽셀)가 머물 수 있는 시간은 16.7 ÷ 66 = 약 0.25초입니다. 반응 시간을 생각하면 이런 빈틈을 노리기보다 넓은 빈틈(116.7픽셀)을 기다리는 것이 안전합니다.
예시 2. 10번 건넌 뒤에는 속도가 ×1.79이므로 가장 빠른 차선이 1.1 × 1.79 = 약 1.97픽셀/프레임, 즉 초당 약 118픽셀로 달립니다. 화면 가로 350픽셀을 3초 이내에 가로지르는 속도입니다.
예시 3. 점수 20점을 목표로 한다면 한 번 건널 때 위쪽으로 최소 9번을 눌러야 하므로 180번 이상 이동해야 합니다(좌우 이동 제외). 도중에 한 번이라도 부딪히면 점수가 처음부터 다시 쌓이고 차량 속도도 판마다 새로 정해지는 구성으로 돌아가므로, 높은 점수는 빠른 손보다 인도에서 기다리는 습관이 좌우합니다.
예시 4. 속도 ×1.34가 되는 5회 이후의 3대 차선에서 가장 빠른 줄은 초당 약 88픽셀이므로 가장 좁은 빈틈에서 0.19초 안에 지나가야 합니다. 같은 차선의 가장 넓은 빈틈(81.7픽셀)은 0.92초 동안 열려 있어 넓은 빈틈을 고르는 편이 다섯 배 가까이 여유롭습니다.
화면이 느려지거나 탭을 옮길 때
- 차량 이동은 직전 프레임과의 시간 차를 60프레임 기준 값으로 환산해 반영하되, 한 번에 최대 3프레임 분량까지만 이동시킵니다. 기기가 순간적으로 버벅여도 차량이 한 번에 크게 건너뛰는 일을 줄이도록 되어 있습니다.
- 브라우저는 보이지 않는 탭의 애니메이션 갱신을 멈추는 것이 일반적이므로, 다른 탭을 보는 동안 게임도 사실상 멈추고 돌아오면 이어서 진행됩니다. 이 게임에는 별도의 일시정지 버튼이 없어 이 동작에 의존합니다.
- 화면 버튼과 키보드는 같은 이동 함수를 호출하므로 동작이 동일합니다. 모바일에서는 화면의 ▲▼◀▶ 버튼을 누르세요.
최고 점수 저장과 한계
- 최고 점수는 게임 오버 시점에 이 브라우저의 localStorage(키 이름 road-crossing-best)에 저장됩니다. 판 도중에 탭을 닫으면 그 판의 점수는 기록되지 않고, 기기·브라우저가 다르면 기록도 공유되지 않습니다. 삭제하려면 브라우저의 사이트 데이터를 지우세요.
- 차선 구성(차량 수, 속도)은 새 판마다 Math.random으로 새로 정해지며 보안·추첨용 난수가 아닙니다. 모든 구성이 반드시 통과 가능하다고 보장하지는 않습니다.
- 아이템, 목숨, 통나무·강 같은 요소는 없고 차도와 인도만 있는 단순한 구조입니다.
- 실제 도로를 건너는 연습용이 아니며, 현실의 횡단보도에서는 신호와 차량 정지를 확인하는 것이 최우선입니다.
자주 묻는 질문
차량은 항상 같은 방향으로 움직이나요?
줄마다 방향이 정해져 있으며, 짝수 번호 줄은 오른쪽, 홀수 번호 줄은 왼쪽으로 달립니다. 화면을 벗어난 차량은 반대쪽 끝에서 다시 나타나 계속 순환합니다. 같은 줄의 차량은 항상 같은 방향·같은 속도입니다.
안전지대(인도)에서는 차에 부딪히지 않나요?
네, 초록색 인도 칸에서는 차량이 다니지 않아 안전합니다. 출발선과 도착선도 마찬가지이며, 다음 인도 칸까지 도로 칸의 차량 흐름을 잘 보고 타이밍을 맞춰 이동하세요.
키를 꾹 눌러도 계속 이동하지 않아요.
의도한 동작입니다. 한 번 눌러서 한 칸씩 움직이므로 키를 누르고 있어도 연속 이동하지 않습니다. 빠르게 연속 이동하려면 키를 짧게 여러 번 누르세요.
점수가 오를수록 왜 어려워지나요?
도착선에 닿을 때마다 모든 차량 속도가 6%씩 곱해져 올라가기 때문입니다. 시간이 지난다고 빨라지지는 않으며 속도 상한도 없습니다. 위 표에서 건넌 횟수별 속도를 확인할 수 있습니다.
도착선에 닿으면 왜 바로 아래로 돌아가나요?
맨 위 줄에 닿는 순간 점수를 올리고 캐릭터를 출발선 가운데 칸으로 되돌려 다음 도전을 시작하는 구조이기 때문입니다. 도착선 위에 서 있는 장면은 따로 없습니다.
차가 지나간 직후 같은 줄에 들어가도 되나요?
차량의 뒤쪽 끝이 캐릭터 판정 영역(35픽셀)을 완전히 벗어난 뒤라면 안전합니다. 충돌은 캐릭터가 서 있는 줄에서만 매 프레임 검사되므로, 차도 줄에 들어간 순간 이미 겹쳐 있으면 바로 게임 오버입니다.
최고 점수를 초기화하려면 어떻게 하나요?
게임 안에 초기화 버튼은 없습니다. 브라우저의 사이트 데이터(localStorage의 road-crossing-best 항목)를 지우면 0으로 돌아갑니다.
다시 시작하면 차선 구성이 같은가요?
아닙니다. 새 판마다 차량 수(줄마다 2대 또는 3대)와 줄별 속도가 무작위로 다시 정해지고 속도 배율도 처음으로 돌아갑니다. 같은 패턴을 외워서 푸는 방식은 통하지 않습니다.
왜 3대 차선이 2대 차선보다 훨씬 어렵게 느껴지나요?
3대 차선은 차량이 한 바퀴를 47% 채워 열린 비율이 27.7%로 떨어지고, 가장 좁은 빈틈은 캐릭터 폭보다 16.7픽셀만 더 넓기 때문입니다.
비슷한 게임
점프 타이밍에 집중하는 장애물 점프 게임, 쫓아오는 상대를 피해 길을 찾는 미로 추격 게임, 길이를 키우며 벽을 피하는 스네이크 게임도 함께 즐겨 보세요.