이 게임은 어떤 방식인가요?
360×360px 정사각형 화면 가운데에서 초록 구슬(반지름 8px)을 움직여, 가장자리에서 나타나 날아오는 빨간 탄(반지름 5px)을 피하는 생존 게임입니다. 구슬과 탄의 중심 거리가 13px(= 8 + 5) 미만이 되는 순간 즉시 끝나고, 그때까지의 생존 시간이 기록입니다. 체력, 아이템, 무기, 점수가 따로 없고 시간 하나만 쌓입니다. 아래 수치는 모두 이 페이지 코드의 상수에서 계산한 것입니다.
시간에 따라 어떻게 어려워지는가
탄 속도는 90 + min(6×경과초, 160) px/s이고, 발사 간격은 max(0.28, 1.1 − 0.02×경과초)초입니다. 탄 속도는 약 26.7초에 최대치 250px/s에 이르고, 발사 간격은 41초에 최소 0.28초에 이릅니다. 그 이후로는 더 어려워지지 않고 같은 강도가 유지됩니다.
| 경과 시간 | 탄 속도(px/s) | 발사 간격(초) | 분당 발사 수 | 가장자리 중앙→화면 중심(초) | 그동안 구슬이 움직일 수 있는 거리(px) | 속도 비교(구슬 190) |
|---|---|---|---|---|---|---|
| 0초 | 90 | 1.10 | 55 | 2.00 | 380 | 내가 더 빠름 |
| 10초 | 150 | 0.90 | 67 | 1.20 | 228 | 내가 더 빠름 |
| 20초 | 210 | 0.70 | 86 | 0.86 | 163 | 탄이 더 빠름 |
| 30초 | 250 | 0.50 | 120 | 0.72 | 137 | 탄이 더 빠름 |
| 40초 | 250 | 0.30 | 200 | 0.72 | 137 | 탄이 더 빠름 |
| 60초 | 250 | 0.28 | 214 | 0.72 | 137 | 탄이 더 빠름 |
탄이 구슬보다 빨라지는 시점은 약 16.7초입니다. 그 이후에는 "달아나기"로는 탄을 따돌릴 수 없고, 탄의 진행 방향에서 옆으로 비켜서는 방식이 필요합니다. 누적 발사 수는 10초에 약 10발, 30초에 약 39발, 60초에 약 135발, 120초에 약 346발입니다. 탄은 화면 밖 40px 바깥으로 나가면 사라지므로 한 시점에 화면에 존재하는 탄의 수는 이보다 훨씬 적습니다.
시간대별로 나눠 보는 한 판
- 0~17초 (탄이 구슬보다 느린 구간): 탄 속도가 90~190px/s라 화면 가장자리에서 중심까지 약 2초(90px/s)에서 1초 안팎(190px/s)이 걸립니다. 이 구간은 경로를 읽고 비켜서는 기본 동작을 몸에 익히는 시간입니다.
- 17~27초 (탄이 구슬보다 빨라지는 구간): 발사 간격이 0.76초에서 0.56초 사이라 동시에 날아다니는 탄이 많지 않지만, 한 번 경로에 들어서면 직선으로 도망치는 것이 통하지 않습니다.
- 27~41초 (속도는 최대, 간격은 계속 단축): 탄 속도는 250px/s로 고정되고 간격만 줄어드는 구간입니다. 탄 사이의 틈이 급격히 줄어듭니다.
- 41초 이후: 속도 250px/s, 간격 0.28초(분당 약 214발)로 고정됩니다. 여기서부터는 같은 난이도이므로 기록 차이는 집중력과 이동 습관에서 나옵니다.
구간별 발사 수와 화면 위의 탄 수
발사 간격이 계속 줄어들기 때문에 같은 10초라도 시기에 따라 쏟아지는 탄의 양이 전혀 다릅니다. 아래 표는 60단계/초 시뮬레이션으로 센 구간별 발사 수입니다.
| 구간(초) | 발사 수 | 초당 발사 |
|---|---|---|
| 0~10 | 10발 | 1.00 |
| 10~20 | 12발 | 1.20 |
| 20~30 | 17발 | 1.70 |
| 30~45 | 43발 | 2.87 |
| 45~60 | 53발 | 3.53 |
| 60~90 | 105발 | 3.50 |
| 90~120 | 106발 | 3.53 |
처음 10초에는 10발이지만 90~120초 구간에서는 30초 동안 106발, 즉 초당 3.53발입니다. 그렇다면 화면에는 동시에 몇 발이 떠 있을까요? 탄은 화면 밖 40px 지점에서 지워지므로, 중심을 지나 반대편으로 나가는 직선 경로라면 가장자리 10px 바깥에서 40px 바깥까지 약 410px를 날아갑니다. 시점별로 이 시간을 발사 간격으로 나누면 대략의 동시 탄 수가 나옵니다.
| 경과 시간 | 탄 속도(px/s) | 발사 간격(초) | 410px 통과 시간(초) | 동시에 떠 있는 탄(대략) |
|---|---|---|---|---|
| 0초 | 90 | 1.10 | 4.56 | 4.1발 |
| 20초 | 210 | 0.70 | 1.95 | 2.8발 |
| 40초 | 250 | 0.30 | 1.64 | 5.5발 |
| 60초 | 250 | 0.28 | 1.64 | 5.9발 |
이 값은 가장 긴 직선 경로 기준의 근사입니다. 구슬 쪽으로 조준한 탄은 대개 더 짧게 날아 사라지므로 실제 평균은 이보다 적고, 비스듬히 스쳐 가는 탄은 더 오래 남습니다. 어쨌든 최대 강도 구간에서도 화면에 한꺼번에 열 발 안팎 이상이 쌓이는 일은 드뭅니다. 어려움의 정체는 탄의 개수보다 "탄이 구슬보다 빠르고 새 탄이 0.28초마다 나타난다"는 점입니다.
조준과 피격 판정에서 나오는 계산
탄은 가장자리 네 변 중 한 곳에서 10px 바깥의 무작위 위치에 만들어지고, 그 순간 구슬이 있던 위치를 향해 발사됩니다. 여기에 ±0.7 rad(약 ±40도)의 무작위 오차가 더해져 완전한 추적 탄은 아닙니다. 한번 발사된 탄은 방향을 바꾸지 않고 직진합니다.
가만히 서 있는 구슬이 어느 탄에 맞을 확률을 대략 계산해 보면, 거리 D만큼 떨어진 곳에서 날아오는 탄이 맞으려면 오차 각도가 asin(13/D)보다 작아야 하므로 확률은 asin(13/D) ÷ 0.7입니다. 화면 한가운데에 서 있고 탄이 변 중앙에서 나왔다면(생성 위치가 10px 바깥이라 D=190) 약 9.8%, 모서리에서 나왔다면(D≈269) 약 6.9%입니다. 탄 한 발 한 발은 대체로 빗나가지만, 발사 수가 쌓이면 가만히 있는 시간이 곧 위험이 됩니다. 반대로 이 계산은 "탄의 경로에서 13px만 벗어나도 안전"이라는 뜻이기도 합니다.
- 예시 1: 시작 직후(탄 속도 90px/s) 화면 가장자리에서 중심까지 약 2.0초 걸립니다(생성 위치 10px 바깥은 제외). 구슬 속도 190px/s로 옆으로 13px 비켜서는 데는 0.07초면 충분합니다.
- 예시 2: 30초 시점(탄 속도 250px/s)에는 중심까지 약 0.72초입니다. 이때 구슬이 갈 수 있는 거리는 약 137px이므로 경로 옆으로 비키는 동작은 여전히 가능하지만 구슬이 탄을 따라 도망칠 수는 없습니다.
- 예시 3: 가로·세로 이동만 하면 초당 190px, 대각선은 방향 벡터를 정규화하므로 같은 190px/s입니다. 대각선 이동이 더 빠르지 않습니다. 화면 한쪽 끝에서 반대쪽 끝까지(좌우 8px 여유 제외) 이동에는 약 1.81초가 걸립니다.
가만히 있으면 얼마나 버틸까: 모델 계산
탄이 나오는 변을 같은 확률로 고르고 변 위의 위치도 고르게 뽑는다는 코드 규칙을 그대로 적용하면, 화면 중앙에 가만히 서 있는 구슬이 탄 한 발에 맞을 평균 확률은 약 8.7%입니다(변 중앙에서 나온 탄은 약 10%, 모서리에서 나온 탄은 약 7%인 값들의 평균). 발사가 서로 독립이라고 보면 누적 발사 수 8발째에서 맞았을 확률이 50%를 넘고, 이는 발사 일정으로 보면 약 8.1초 시점입니다. 90% 확률로 이미 맞은 시점은 26발, 약 22.3초입니다. 탄이 날아오는 시간(초반 최대 2초 안팎)은 반영하지 않은 근사이므로 실제 게임 오버는 이보다 1~2초 늦게 찍힙니다.
이 계산은 단순한 모델이라 실제 플레이 기록과 일치한다고 보장하지는 않습니다. 의미는 두 가지입니다. 첫째, 아무 조작 없이도 몇 초는 버티므로 짧은 기록만으로 실력을 평가하기는 어렵습니다. 둘째, 가만히 서 있으면 이 모델에서는 약 8초에 절반, 22초 안팎에 90%가 이미 맞은 셈이므로 오래 버티려면 움직임이 필요합니다. 기록을 늘리는 첫 단계는 "탄을 피하기"가 아니라 "조준이 정확히 맞는 자리에 머물지 않기"입니다.
코드 규칙에서 도출한 생존 요령
- 계속 움직이세요. 탄은 발사 순간의 위치를 향하므로 구슬이 움직이면 그 위치에서 이미 벗어나 있습니다. 가만히 있는 구슬은 조준이 정확히 들어맞는 위치입니다.
- 중앙에서 원을 그리듯 움직이는 것이 안전합니다. 구슬은 벽 8px 안쪽까지 갈 수 있지만, 벽에 붙으면 한쪽 방향이 막혀 도망칠 방향이 줄어듭니다. 모서리에서는 두 방향이 동시에 막혀 가장 위험합니다.
- 탄을 쳐다보지 말고 새로 나타나는 위치를 보세요. 탄은 화면 밖에서 시작하므로, 발사 간격이 0.28초까지 짧아지면 안쪽으로 들어온 뒤에 반응하기에는 이미 늦습니다.
- 누른 키를 완전히 떼는 연습을 하세요. 두 방향키를 겹쳐 누르면 대각선으로 움직이고, 반대 방향 키를 함께 누르면 서로 상쇄되어 멈춥니다.
흔한 실수와 한계
가장 흔한 실수는 탄이 지나간 직후 방향을 반대로 크게 바꾸다 새로 발사된 탄 앞으로 들어가는 것입니다. 새 탄은 방금 있던 위치가 아니라 발사 순간의 위치를 향하므로, 큰 동작보다 짧게 비키고 되돌아오는 소동작이 유리합니다. 또 화면 가장자리의 구슬은 이동이 막혀 있어, 탄이 나타나기 전에 안쪽으로 되돌아와야 합니다.
이 게임에는 생명 수, 무적 시간, 방어막, 점수 배율이 없고 난이도 선택이나 스테이지도 없습니다. 탄이 나오는 변, 위치, 조준 오차는 Math.random으로 정해지므로 같은 판이 반복되지 않으며 승패에 영향을 주는 공정성용 난수가 아닙니다. 프레임 간 시간은 최대 0.05초로 제한되어, 브라우저 탭이 느려져도 한 번에 크게 이동하지 않습니다. 창이 포커스를 잃으면 자동으로 일시정지됩니다.
일시정지, 포커스, 재시작의 세부 동작
- P 키 또는 버튼: 게임이 진행 중일 때만 일시정지가 됩니다. 정지 중에는 시간과 탄이 모두 멈추고 화면에 "일시정지"가 표시되며, 다시 P를 누르거나 "계속하기"를 누르면 이어집니다. 게임이 끝난 뒤에는 P가 동작하지 않습니다.
- 창이 포커스를 잃을 때: 다른 창이나 탭으로 넘어가면 누르고 있던 방향이 모두 해제되고 자동으로 일시정지됩니다. 돌아와서는 자동 재개되지 않으므로 P나 "계속하기"로 직접 이어야 합니다.
- 재시작: "다시 시작" 버튼은 언제든 눌러 새 판을 시작하며 구슬은 화면 중앙으로 돌아오고 탄은 모두 사라집니다. 게임 오버 뒤에는 Space·Enter로도 시작하지만, 버튼에 포커스가 있을 때는 키 입력이 버튼 클릭으로 처리됩니다.
- 시간 보정: 한 프레임이 길어져도 시간 증가는 최대 0.05초로 잘립니다. 기기 성능이 낮아 프레임이 20fps 아래로 떨어지면 게임 시간이 실제 시간보다 느리게 흘러, 같은 생존 시간이라도 실제로 더 오래 걸린 것이 됩니다. 이 때문에 기기가 달라도 시간 기록을 같은 척도로 보기는 어렵습니다.
- 방향 버튼(화면): 누르는 동안 이동하고 손가락을 떼거나 버튼 밖으로 나가면 멈춥니다. 두 버튼을 동시에 누르면 대각선으로 움직이는 것은 기기의 멀티터치 지원에 따라 다를 수 있습니다.
연습 방법: 목표를 나눠서 잡기
기록이 정체되면 시간대별로 구체적인 목표를 정해 보세요. 처음 15초는 탄이 구슬보다 느린 구간이므로 서두를 이유가 없습니다. 이 구간에서 가운데를 벗어나지 않고 옆으로 한두 걸음 비키는 동작만으로 피하는 연습을 합니다. 15~30초 구간은 탄이 구슬보다 빨라지기 시작하므로, 탄을 눈으로 쫓지 말고 새로 나타난 탄의 출발 위치에서 중심을 잇는 선만 보고 그 선에서 13px 이상 벗어나는 습관을 들입니다. 27초 이후에는 간격이 0.56초 아래로 줄어 한 번에 두 방향을 신경 써야 하므로, 이동을 한 방향 위주로 단순하게 하는 편이 낫습니다.
기록을 비교할 때는 한 판의 결과가 아니라 여러 판의 중앙값을 보세요. 탄의 방향이 매번 무작위라 한 판만으로는 운의 영향이 큽니다. 예를 들어 여섯 판의 생존 시간이 20, 35, 14, 41, 27, 33초라면 중앙값은 정렬한 값(14, 20, 27, 33, 35, 41)의 가운데 두 값 27과 33의 평균인 30초입니다. 최고 기록 41초는 우연히 좋았던 판이고 안정적인 실력은 30초 안팎이라고 읽는 것이 정확합니다.
최고 기록 저장
최고 생존 시간은 이 브라우저의 localStorage bullet-dodge-best 키에 소수점 한 자리 단위로 저장되어 새로고침해도 유지됩니다. 다른 기기와 동기화되지 않으며, 지우려면 브라우저의 사이트 데이터를 삭제하세요.
다른 반응속도 게임도 즐겨보세요
순간적인 반응속도를 측정해보고 싶다면 반응속도 테스트를, 방향 조작으로 오래 버티는 방식은 스네이크 게임을, 클릭 정확도 훈련은 에임 트레이너 게임을, 장애물을 넘는 방식은 장애물 점프 게임을 확인해보세요.
자주 묻는 질문
모바일에서도 플레이할 수 있나요?
네, 화면에 표시되는 방향 버튼을 누르고 있으면 그 방향으로 계속 이동합니다. 두 버튼을 동시에 누르면 대각선으로 움직일 수 있습니다.
최고 기록이 저장되나요?
네, 이 브라우저의 localStorage에 저장되어 새로고침해도 유지됩니다. 다른 기기나 다른 브라우저와는 공유되지 않습니다.
대각선으로 가면 더 빨리 움직이나요?
아닙니다. 대각선 이동도 방향 벡터를 길이 1로 맞추기 때문에 초당 190px로 같은 속도입니다.
탄이 구슬을 정확히 따라오나요?
아닙니다. 탄은 발사되는 순간 구슬이 있던 위치를 향하되 약 ±40도의 무작위 오차가 더해지며, 이후에는 방향을 바꾸지 않고 직진합니다.
얼마나 오래 버티면 잘하는 건가요?
정해진 기준은 없습니다. 이 게임은 탄 속도가 약 27초, 발사 간격이 41초에 최대 강도에 이르므로, 그 이후로 얼마나 더 버티는지가 실력의 지표가 됩니다.
탭을 바꿨더니 게임이 멈췄어요. 고장인가요?
의도된 동작입니다. 창이 포커스를 잃으면 자동으로 일시정지되고, 누르고 있던 방향도 해제됩니다. 돌아와서 P 키 또는 "계속하기" 버튼으로 이어 가세요.
탄이 화면 밖에서 시작해서 억울하게 맞을 수도 있나요?
탄은 가장자리 10px 바깥에서 만들어지고 구슬은 벽에서 8px 안쪽까지만 갑니다. 벽에 붙어 있으면 중심 사이 거리가 가까운 곳에서 탄이 만들어져 반응할 시간이 거의 없으므로, 가장자리에 머무는 것이 위험합니다. 중앙 부근에서 움직이면 이런 상황이 줄어듭니다.
같은 시간에 점수가 다르게 나오는 이유는요?
이 게임에는 점수가 없고 생존 시간만 기록됩니다. 탄의 출발 위치와 조준 오차가 매판 무작위여서 같은 실력이라도 운에 따라 기록이 달라집니다. 여러 판의 중앙값으로 비교하는 편이 정확합니다.
최고 기록을 지우고 싶어요.
최고 기록은 브라우저 localStorage의 bullet-dodge-best 키에만 저장되므로, 사이트 데이터를 삭제하면 0.0으로 돌아갑니다. 게임 안에 초기화 버튼은 없습니다.