한 번의 투구는 이렇게 진행된다
게임 화면은 360×220 픽셀이고, 배터(🧍)는 왼쪽, 타격선(흰 세로선)은 x=60 위치에 있습니다. 투구가 시작되면 공(⚾)이 오른쪽 끝 x=340에서 출발해 일정한 속도로 왼쪽으로 날아오고, 배터 뒤쪽 x=20 지점까지 320px를 이동하면 투구가 끝납니다. 공은 처음부터 끝까지 가속이나 감속 없이 같은 속도로 움직입니다. 속도는 투구마다 다르고, 공이 320px를 가는 데 걸리는 시간이 917ms~1,667ms 사이에서 무작위로 정해집니다. 게임을 시작하면 약 0.7초 뒤에 첫 투구가 나오고, 한 투구가 끝난 뒤 다음 투구까지는 약 0.9초 쉽니다.
- 공이 타격선과 정확히 겹치는 시점은 투구 진행의 87.5% 지점(출발 후 약 0.8~1.46초)입니다.
- 스윙은 투구마다 한 번만 인정됩니다. 스윙을 하는 순간 판정이 확정되어 곧바로 다음 투구 준비로 넘어갑니다.
- 투구와 투구 사이(공이 없는 시간)에 누른 스윙은 무시되며 벌점도 없습니다.
- 공이 끝까지 지나갈 때까지 스윙하지 않으면 "스트라이크"로 아웃이 하나 올라갑니다.
- 아웃이 3개가 되면 게임이 끝납니다. 몇 개든 점수는 홈런·2루타·안타로 쌓은 것만 합산합니다.
- 키를 누르고 있어서 생기는 반복 입력은 무시하므로 스페이스바를 꾹 눌러 자동으로 스윙할 수 없습니다.
판정 범위: 타격선에서 몇 픽셀 떨어졌는가
판정은 스윙 순간 공 중심과 타격선 사이의 거리(좌우 어느 쪽이든 같은 크기)로만 정해집니다. 아래 범위를 벗어나면 헛스윙으로 아웃입니다. 공이 아직 타격선에 도달하기 전에 누르면 "일렀다", 이미 지나친 뒤에 누르면 "늦었다"로 알려 주지만 판정 기준은 둘 다 같습니다.
| 결과 | 허용 오차(px) | 구간 폭(좌우 합계, px) | 점수 |
|---|---|---|---|
| 홈런 | ±6 이내 | 12 | 4점 |
| 2루타 | ±16 이내 | 32 | 2점 |
| 안타 | ±28 이내 | 56 | 1점 |
| 헛스윙 | ±28 초과 | - | 아웃 +1 |
투구 속도에 따라 달라지는 실제 허용 시간
픽셀 허용치는 고정이지만, 공이 빠를수록 같은 픽셀을 지나가는 시간이 짧아집니다. 아래 표는 투구 시간(공이 320px를 가는 시간)별로 각 구간을 지나가는 데 걸리는 시간을 계산한 것입니다. 시간은 좌우를 합친 허용 범위가 시작되어 끝날 때까지의 길이로, 판정에 쓸 수 있는 시간입니다.
| 투구 시간 | 이동 속도(px/프레임) | 타격선 도달(ms) | 홈런 구간(ms) | 2루타 이내(ms) | 안타 이내(ms) |
|---|---|---|---|---|---|
| 917ms | 5.82 | 802 | 34 | 92 | 160 |
| 1167ms | 4.57 | 1021 | 44 | 117 | 204 |
| 1417ms | 3.76 | 1240 | 53 | 142 | 248 |
| 1667ms | 3.20 | 1458 | 63 | 167 | 292 |
가장 빠른 투구에서 홈런 구간은 약 34ms입니다. 60Hz 화면에서는 한 프레임이 약 16.7ms이므로 이 구간 안에 화면이 두 번 갱신되는 정도입니다. 버튼을 누르는 시점의 판정에는 마지막으로 계산된 공 위치가 쓰이기 때문에, 화면 지연이 큰 기기나 입력 지연이 있는 환경에서는 눈으로 본 타이밍과 실제 판정이 몇 픽셀 어긋날 수 있습니다. 느린 투구(약 1.67초)에서는 홈런 구간이 약 63ms로 두 배 가까이 넓어집니다.
무작위로 누를 때의 기준선
공이 같은 속도로 움직이므로, 투구 중 아무 때나 한 번 눌렀다고 가정하면 투구 속도와 상관없이 확률은 판정 구간 폭과 이동 거리(320px)의 비율로 정해집니다. 안타 이내 56px는 17.5%, 2루타 이내32px는 10.0%, 홈런 12px는 3.8%입니다. 이 경우 한 번 스윙해서 맞은 것의 평균 점수는 2.0점이고, 세 번째 아웃이 나올 때까지 평균 0.64번 맞히므로 기대 점수는 약 1.3점입니다. 점수가 이보다 꾸준히 높아지면 감으로 눌렀다고 보기 어렵고, 공의 위치를 읽고 있다는 뜻입니다. 이 수치는 코드 상수에서 계산한 단순 기준선이며, 실제 사람의 성공률 통계가 아닙니다.
일찍 누르는 쪽과 늦게 누르는 쪽의 차이
공은 오른쪽(x=340)에서 출발해 타격선(x=60)을 지나 x=20에서 끝납니다. 그래서 타격선 앞쪽에는 280px의 긴 구간이 있지만, 선을 지난 뒤 남은 구간은 40px뿐입니다. 안타 범위가 ±28px이므로 늦게 눌러서 안타가 되는 구간은 선을 지난 뒤 28px까지이고, 그 이후 12px는 어떤 판정도 받지 못하는 "너무 늦었어요" 구간입니다. 일찍 누르는 쪽은 선 앞 28px 안이면 안타이고 그보다 앞서면 헛스윙입니다. 아래 표는 가장 빠른 투구와 가장 느린 투구에서 1px가 몇 ms인지, 늦게 눌러도 안타가 되는 시간이 얼마인지, 타격선을 지난 뒤 투구가 끝나기까지 얼마나 남는지를 정리한 것입니다.
| 투구 시간 | 1px당 시간(ms) | 선을 지난 뒤 안타 가능 시간(ms) | 선을 지난 뒤 투구 종료까지(ms) |
|---|---|---|---|
| 917ms | 2.86 | 80 | 115 |
| 1667ms | 5.21 | 146 | 208 |
가장 빠른 투구에서도 선을 지나고 나서 약 80ms 동안은 안타를 얻을 수 있고, 그 뒤 약35ms 동안은 눌러도 헛스윙입니다. 이 구간에서도 누르지 않으면 투구 종료와 함께 스트라이크가 되어 어차피 아웃이므로, 선을 놓쳤다고 판단되는 순간에는 포기하지 말고 눌러 보는 쪽이 손해가 없습니다. 어느 쪽이든 아웃 1개로 같기 때문입니다.
입력·화면 지연이 판정을 밀어내는 정도
스윙을 누르는 순간 판정에는 마지막 프레임에서 계산한 공 위치가 쓰입니다. 그래서 눈으로 본 위치와 판정 위치 사이에는 최소한 마지막 프레임 이후 흐른 시간만큼의 차이가 있고, 무선 키보드나 터치 입력, 모니터 응답 지연이 겹치면 더 커집니다. 지연 시간별로 공이 그 사이에 움직이는 거리를 계산하면 다음과 같습니다.
| 지연 시간 | 가장 빠른 투구에서 이동(px) | 가장 느린 투구에서 이동(px) |
|---|---|---|
| 17ms | 5.9 | 3.3 |
| 50ms | 17.5 | 9.6 |
| 100ms | 34.9 | 19.2 |
예를 들어 지연이 50ms라면 빠른 공에서는 약 17.5px가 밀려 홈런 허용치(±6px)를 훌쩍 넘고 2루타 범위(±16px)도 넘어섭니다. 반대로 느린 공에서는 같은 지연이 약 9.6px라서 2루타 범위 안에 머뭅니다. 이 지연은 사람마다 다른 반응속도와는 별개로, 환경이 정하는 고정 오프셋에 가깝습니다. 그래서 늘 같은 방향으로 어긋난다고 느껴진다면 실력보다 환경 지연을 의심해 보고, 같은 쪽으로 일정하게 어긋나는 만큼 미리(또는 늦게) 누르는 습관으로 보정하세요. 이 표는 단순 거리 계산이며 실제 기기별 지연을 측정한 값이 아닙니다.
한 판의 길이와 점수 범위
게임이 끝나는 조건은 아웃 3개뿐이고 점수에는 상한이 없습니다. 쳐서 점수를 얻는 투구는 아웃이 올라가지 않으므로 계속 맞히는 한 판은 이어집니다. 반대로 한 번도 스윙하지 않고 세 번 모두 흘려보내는 판은 첫 투구까지700ms, 투구 3번, 투구 사이 900ms 두 번, 마지막 아웃 뒤 500ms를 더해5,750ms(약 5.8초)~8,000ms(약8.0초) 사이입니다. 스윙이 빨리 헛나가면 투구가 일찍 끝나므로 이보다 더 짧을 수도 있습니다. 맞힌 횟수가 정해졌을 때 얻을 수 있는 점수의 범위는 안타만 치면 횟수와 같고, 전부 홈런이면 4배입니다.
| 맞힌 횟수 | 최소 점수(전부 안타) | 최대 점수(전부 홈런) |
|---|---|---|
| 3번 | 3점 | 12점 |
| 5번 | 5점 | 20점 |
| 10번 | 10점 | 40점 |
| 15번 | 15점 | 60점 |
한 투구에서 얻을 수 있는 점수는 1, 2, 4점뿐이고 3점은 나오지 않습니다. 점수를 올리는 수단은 맞힌 횟수를 늘리는 것과 한 번의 질을 올리는 것 두 가지인데, 홈런 구간이 좁아 두 번째 방법의 난이도가 훨씬 높습니다. 앞에서 구한 무작위 안타 확률 17.5%를 기준으로 연속해서 안타 이상을 칠 확률을 보면 다음과 같습니다.
| 연속 횟수 | 눈감고 눌러도 맞을 확률(%) |
|---|---|
| 1번 연속 | 17.50 |
| 2번 연속 | 3.06 |
| 3번 연속 | 0.54 |
| 4번 연속 | 0.09 |
세 번 연속 안타 이상은 무작위로는 1% 미만입니다. 그러니 3연속 이상이 나온다면 우연보다는 공의 위치를 읽은 결과일 가능성이 높습니다. 이 확률은 매 투구가 독립이고 눌러지는 위치가 이동 구간 안에서 균등하다는 가정에서 나온 단순 계산입니다.
연습 순서 제안
- 처음 몇 판은 홈런을 잊고 안타 띠(±28px)만 노리세요. 안정적으로 맞히는 비율을 올리는 것이 먼저입니다.
- 피드백에 나오는 오차 px의 부호가 한쪽으로 치우치는지 보세요. 일렀다는 말이 반복되면 반 박자 늦게, 늦었다는 말이 반복되면 반 박자 빠르게 누릅니다.
- 빠른 공과 느린 공을 구분하는 연습을 하세요. 출발 후 0.2초 동안 공이 얼마나 갔는지로 속도를 가늠하고, 빠른 공일수록 판정 시간이 짧아진다는 점을 몸으로 익힙니다.
- 안정되면 2루타 범위(±16px)를 목표로 삼고, 그다음에 홈런을 시도하세요.
- 최고 점수는 3아웃이 되는 순간 저장되므로 기록을 남기려면 한 판을 끝까지 끝내야 합니다. 도중에 페이지를 닫으면 그 판의 점수는 저장되지 않습니다.
타이밍을 읽는 방법
- 처음 몇 프레임으로 속도를 가늠하세요. 공은 직선으로 등속 이동하므로, 출발 후 0.2초 동안 얼마나 움직였는지를 보면 도착 시각을 추정할 수 있습니다. 짧은 시간에 많이 갔다면 빠른 공입니다.
- 소리 대신 위치를 보세요. 투구가 시작될 때 짧은 신호음이 한 번 나지만, 도착 시점은 투구마다 달라서 소리를 박자로 쓸 수 없습니다.
- 타격선을 눈으로 고정하세요. 공 자체를 쫓지 말고 타격선 근처를 보다가 공이 선 가까이 왔을 때 누르면 반응이 안정적입니다. 캔버스의 연한 띠가 안타 범위(±28px)를 보여 줍니다.
- 실패 뒤 피드백을 쓰세요. 헛스윙 메시지에 "일렀어요/늦었어요"와 오차 픽셀이 나오고 스윙한 위치가 캔버스에 잠시 남아 있습니다. 항상 같은 쪽으로 어긋난다면 누르는 습관을 조정하세요.
- 흘려보내기는 선택지가 아닙니다. 스윙하지 않고 공이 지나가도 아웃이고, 어긋난 때에 눌러도 아웃입니다. 둘의 손실이 같으므로 판단이 서지 않을 때도 공이 타격선을 지나치기 전에 눌러서 맞힐 기회를 남겨 두세요.
흔한 실수
- 버튼과 스페이스바를 동시에 쓰기: 한 투구에는 스윙이 한 번만 인정되므로 두 번째 입력은 효과가 없습니다.
- 홈런만 노리기: 홈런 구간은 12px 폭뿐입니다. 안타 구간(56px)은 그보다 4배 이상 넓어서, 무리한 홈런보다 안정적인 안타를 쌓는 것이 3아웃을 늦추는 방법입니다.
- 다른 탭에 갔다 오기: 화면이 숨겨진 동안 공의 움직임은 멈추지만, 투구와 투구 사이를 재는 타이머는 계속 가므로 돌아오면 이미 공이 나와 있을 수 있습니다.
- 모바일에서 스페이스바를 찾는 것: 키보드가 없는 기기에서는 "스윙!" 버튼이 유일한 입력입니다. 버튼이 화면에 보이도록 스크롤해 두고 캔버스와 함께 보면서 누르세요.
최고 점수의 저장과 삭제
최고 점수는 이 브라우저의 localStorage에 baseball-batting-best 키로 저장됩니다. 서버로 전송되지 않고 다른 기기와 동기화되지 않으며, 게임이 끝나는 순간 기존 기록보다 높을 때만 갱신됩니다. 화면의 "최고 점수 지우기" 버튼이나 브라우저의 사이트 데이터 삭제로 지울 수 있습니다. 시크릿 모드처럼 저장이 막힌 환경에서는 기록이 남지 않지만 게임은 정상적으로 진행됩니다.
한계
공의 높이, 구종, 스트라이크 존, 배트 각도는 없고 오직 타이밍만 겨루는 단순한 게임입니다. 투구 시간은 균등한 무작위(Math.random)로 정해지며 보안용이 아닙니다. 실제 야구의 타격과는 무관하니 이 게임의 숫자를 실전 야구에 적용하지 마세요.
다른 타이밍 게임도 즐겨보세요
비슷하게 정확한 타이밍이 필요한 게임을 원한다면 농구 자유투 게임이나다트보드 게임, 반응 시간을 숫자로 재 보려면반응속도 테스트도 확인해보세요. 숫자로 승부하는 야구 게임을 원한다면숫자 야구도 있습니다.
자주 묻는 질문
공의 속도가 매번 같나요?
아니요, 매 투구마다 도착까지 걸리는 시간이 917ms~1,667ms 사이에서 무작위로 정해집니다. 같은 투구 안에서는 속도가 일정하니 처음 움직임으로 도착 시각을 추정할 수 있습니다.
최고 점수는 어떻게 저장되나요?
이 브라우저(기기)에만 저장되어 다시 방문해도 유지되며, 다른 기기와는 공유되지 않습니다. "최고 점수 지우기" 버튼으로 삭제할 수 있습니다.
스윙을 안 하면 어떻게 되나요?
공이 배터 뒤쪽 끝까지 지나가면 스트라이크로 아웃이 하나 올라갑니다. 투구와 투구 사이에 누른 스윙은 무시됩니다.
홈런이 거의 안 나와요.
홈런은 타격선 좌우 6px 이내(폭 12px)에서만 나옵니다. 빠른 투구에서는 이 구간을 지나가는 시간이 약 34ms뿐이므로 어려운 것이 정상입니다. 먼저 안타 범위를 안정적으로 맞히는 연습을 하세요.
새 게임을 눌렀는데 투구가 겹치거나 바로 끝나는 일이 있나요?
새 게임을 누르면 이전 판의 대기 중인 투구와 종료 타이머를 모두 취소하고 처음부터 시작합니다.
점수에 상한이 있나요?
코드에 점수 상한은 없습니다. 아웃이 3개가 될 때까지 계속 이어지고, 한 투구에서 얻는 점수는 1·2·4점 중 하나입니다.
모니터 주사율이 높으면 유리한가요?
공의 위치는 프레임 수가 아니라 경과 시간으로 계산하므로 투구 시간은 주사율과 무관합니다. 다만 프레임이 촘촘할수록 눈에 보이는 위치와 판정 위치의 차이가 줄어듭니다. 한 프레임이 50ms를 넘게 끊기면 그 이상은 흐른 시간에 반영되지 않아 공이 실제 시간보다 느리게 움직일 수 있습니다.
3아웃 직전에 페이지를 닫으면 점수가 저장되나요?
최고 점수는 세 번째 아웃이 올라가는 순간 기존 기록과 비교해 저장됩니다. 그 전에 닫으면 진행 중이던 판의 점수는 저장되지 않습니다.