플레이 방법과 입력 장치
화면은 가로 320 × 세로 480 크기의 세로형 판입니다. 위쪽에서 공이 떨어지고, 중간에 주황색 범퍼가 세 개 있으며, 아래쪽에는 하늘색 플리퍼 두 개가 있습니다. 공이 범퍼에 닿을 때마다 100점이 더해지고, 공이 화면 아래로 사라지면 공이 하나 줄어듭니다. 공은 처음에 3개이고, 모두 잃으면 최종 점수가 표시됩니다. 점수를 올리는 방법은 범퍼 접촉 하나뿐이라 점수는 항상 100의 배수입니다.
- 왼쪽 플리퍼: 왼쪽 화살표(←), Z 키, 화면 아래 "왼쪽" 버튼, 또는 판 왼쪽 절반 터치.
- 오른쪽 플리퍼: 오른쪽 화살표(→), / 키, "오른쪽" 버튼, 또는 판 오른쪽 절반 터치.
- 키나 터치를 누르고 있는 동안 플리퍼가 올라가 있고, 떼면 내려갑니다. 두 개를 동시에 올릴 수도 있습니다.
- 새 공은 판 위쪽(가로 130~190 사이 무작위 위치, 약간의 좌우 속도)에서 나오며 별도의 발사 동작은 없습니다.
- 다른 탭으로 이동하면 자동으로 일시정지되고, 돌아와 아무 키나 누르거나 화면을 터치하면 계속됩니다. 입력 중에 창이 포커스를 잃으면 올려 둔 플리퍼는 자동으로 내려갑니다.
플리퍼 구조: 축 위치와 각도
두 플리퍼는 길이 85픽셀의 막대로, 축은 왼쪽 (80, 418), 오른쪽 (240, 418)에 있습니다. 내려 둔 상태의 각도는 수평에서 약 39도 아래, 올린 상태는 약 20도 위입니다. 막대 두께는 12픽셀이고 공 반지름이 7이라, 공 중심은 막대 중심선에서 13픽셀 이내로 들어오면 충돌로 처리됩니다.
| 상태 | 왼쪽 끝점 | 오른쪽 끝점 | 두 끝 사이 거리 |
|---|---|---|---|
| 내려 둔 상태 | (146.1, 471.4) | (173.9, 471.4) | 27.8픽셀 |
| 올린 상태 | (159.8, 388.9) | (160.2, 388.9) | 0.3픽셀 |
두 플리퍼를 동시에 올리면 끝이 거의 한 점(약 0.3픽셀 간격)에 모여 가운데 구멍이 사실상 막힙니다. 내려 둔 상태에서는 윗면이 가운데 쪽으로 낮아지는 경사라서, 위에 얹힌 공이 중앙 쪽으로 굴러 내려옵니다. 반대로 올린 상태의 면은 바깥쪽(축 쪽)이 낮으므로, 올린 플리퍼에 걸린 공은 안쪽이 아니라 바깥쪽을 향해 밀려납니다.
공이 플리퍼에 닿을 때
플리퍼에 닿는 순간 공은 막대 면에서 반사됩니다. 플리퍼가 내려가 있으면 반사 후 속도가 0.85배로 줄어 공이 "죽는" 느낌이 나고, 플리퍼가 올라가 있으면 면에 수직인 방향으로 속도 8이 더해지고 위쪽으로 3이 더 얹혀 세게 튕겨 나갑니다. 중요한 점은 플리퍼가 움직이는 속도는 계산에 쓰이지 않는다는 것입니다. 올라가는 도중이든 이미 올라가 있든, 올라간 상태 플래그가 켜져 있으면 닿기만 해도 같은 킥을 받습니다.
- 왼쪽 플리퍼를 올리면 면의 수직 방향이 위쪽·왼쪽을 향하므로 공은 왼쪽 위(왼쪽 범퍼 방향)로, 오른쪽 플리퍼는 오른쪽 위로 날아갑니다.
- 공의 최대 속도는 프레임당 13픽셀(초당 780픽셀)로 제한됩니다. 이 속도면 판 가로 320픽셀을 약 0.41초에 가로지릅니다.
- 벽(좌우·위쪽)에 닿으면 속도가 0.8배로 줄며 반사됩니다. 이 판에는 아래쪽 벽이 없고 공이 y=510 선을 넘으면 사라집니다.
플리퍼가 올라오는 데 걸리는 시간
플리퍼는 누르는 즉시 순간이동하지 않고, 매 프레임 남은 각도의 40%만큼만 목표 각도에 다가갑니다. 내려 둔 위치(약 39도 아래)에서 올린 위치(약 20도 위)까지 전체 이동 각도는 약 59도이고, n프레임 뒤에는 이동 각도의 1 − 0.6n만큼 올라와 있습니다. 같은 방식으로 내려올 때도 각도가 서서히 줄어듭니다.
| 누른 뒤 경과 | 프레임 | 이동 완료 비율 | 올라온 각도 |
|---|---|---|---|
| 약 17ms | 1 | 40.0% | 23.6도 |
| 약 33ms | 2 | 64.0% | 37.8도 |
| 약 50ms | 3 | 78.4% | 46.3도 |
| 약 83ms | 5 | 92.2% | 54.4도 |
| 약 133ms | 8 | 98.3% | 58.0도 |
표처럼 5프레임(약 83ms)이면 거의 다 올라오므로 사람의 반응 시간이 훨씬 더 큰 변수입니다. 다만 킥은 "올린 상태 플래그가 켜져 있는가"로 결정되고 각도가 다 올라왔는지와는 무관하므로, 키를 누른 직후 아직 내려와 있는 면에 공이 닿아도 이미 킥이 적용됩니다. 이때 면의 방향은 그 순간의 각도를 따릅니다.
플리퍼 킥의 결과를 수치로 보기
공이 왼쪽 플리퍼 막대의 중간 면 위로 수직으로 떨어진다고 가정하고 코드의 반사식을 그대로 적용한 값입니다. 오른쪽 플리퍼는 좌우가 대칭인 값입니다. 막대 끝의 둥근 부분에 닿으면 법선 방향이 달라지고, 실제 플레이에서는 공이 옆으로도 움직이므로 이 표는 어디까지나 기준점입니다. 속도의 y 부호는 화면 좌표라서 음수가 위쪽입니다.
| 들어오는 속도(아래쪽) | 플리퍼 | 반사 후 vx / vy | 속력 | 수직 상승 높이 |
|---|---|---|---|---|
| 3 | 내려 둠 | 2.49 / -0.53 | 2.55 | 약 0픽셀(2프레임) |
| 3 | 올림(킥) | -4.46 / -12.21 | 13.00 | 약 260픽셀(44프레임) |
| 8 | 내려 둠 | 6.65 / -1.42 | 6.80 | 약 3픽셀(6프레임) |
| 8 | 올림(킥) | -5.58 / -11.74 | 13.00 | 약 240픽셀(42프레임) |
| 13 | 내려 둠 | 10.81 / -2.31 | 11.05 | 약 8픽셀(9프레임) |
| 13 | 올림(킥) | -6.21 / -11.42 | 13.00 | 약 227픽셀(41프레임) |
올린 플리퍼에 닿으면 들어오는 속도가 3이든 13이든 반사 후 속력이 상한 13에 걸립니다. 킥이 속도를 거의 정해 버리기 때문에 공이 어떻게 오든 플리퍼 중간에만 맞으면 비슷한 세기로 솟구친다는 뜻입니다. 위 표의 수직 상승 높이는 충돌 없이 중력만 받는 경우여서, 플리퍼 축 높이 y=418에서 출발하면 최고점은 y=158 근처에서 y=191 근처 사이가 됩니다. 이는 범퍼가 모여 있는 y=150~235 구간의 안쪽이므로, 중간 면 킥이 곧 범퍼 구간으로 공을 올려 주는 동작이라는 코드상의 근거입니다. 내려 둔 플리퍼에 닿은 공은 속력이 0.85배가 되고 위쪽 성분이 작아(표의 vy) 높이 뜨지 못한 채 가운데로 흘러갑니다.
범퍼 세 개의 위치와 간격
| 범퍼 | 중심 좌표 | 반지름 | 공 중심이 닿는 거리 | 1회 접촉 점수 |
|---|---|---|---|---|
| 왼쪽 범퍼 | (85, 150) | 17 | 24 | 100 |
| 오른쪽 범퍼 | (235, 150) | 17 | 24 | 100 |
| 가운데 범퍼 | (160, 235) | 19 | 26 | 100 |
범퍼에 닿으면 공은 법선 방향으로 반사된 뒤 법선 방향으로 속도 2가 더 얹힙니다. 즉 범퍼는 공을 조금씩 가속시킵니다. 범퍼 사이의 빈틈은 공 지름(14)보다 충분히 넓어 통과가 가능합니다.
| 범퍼 쌍 | 중심 사이 거리 | 표면 사이 빈틈 |
|---|---|---|
| 왼쪽 범퍼 - 오른쪽 범퍼 | 150.0 | 116.0 |
| 왼쪽 범퍼 - 가운데 범퍼 | 113.4 | 77.4 |
| 오른쪽 범퍼 - 가운데 범퍼 | 113.4 | 77.4 |
떨어지는 시간: 한 개의 공은 얼마나 버티나
중력은 프레임마다 속도에 0.28을 더하는 방식입니다. 새 공이 y=50에서 정지 상태로 출발해 아무것에도 닿지 않고 떨어질 때 걸리는 시간은 아래와 같습니다. 속도가 상한 13에 닿는 데에는 약 47프레임이 걸립니다.
| 구간 | 프레임 | 시간(초) |
|---|---|---|
| 범퍼 높이(y=150)까지 | 27 | 0.45 |
| 가운데 범퍼 높이(y=235)까지 | 36 | 0.60 |
| 플리퍼 축 높이(y=418)까지 | 52 | 0.87 |
| 화면 아래 소멸선(y=510)까지 | 59 | 0.98 |
범퍼에 한 번도 닿지 않고 플리퍼를 지나쳐 바닥으로 사라지면 공 한 개가 약 1.0초 만에 끝납니다. 따라서 3개의 공으로 점수를 모으는 것은 결국 낙하 시간을 얼마나 늘리느냐의 문제이고, 그 수단은 범퍼 반사와 플리퍼 킥뿐입니다.
코드에서 읽어낼 수 있는 전략
- 가장 많이 점수가 나는 구역은 세 범퍼가 모인 y=150~235 구간입니다. 플리퍼 킥은 공을 위쪽으로 보내 이 구간으로 다시 올려 주는 역할입니다.
- 플리퍼 축 바깥쪽에는 받쳐 주는 구조물이 없습니다. 공 중심이 가로 13~67(오른쪽은 253~307) 범위의 띠로 떨어지면 플리퍼가 닿지 않아 사실상 막을 수 없습니다. 이 두 띠는 공이 움직일 수 있는 가로 범위(294픽셀) 중 합계 약 37%에 해당합니다.
- 플리퍼를 계속 올려 두면 가운데 구멍은 막히지만 올린 면이 공을 바깥쪽으로 보내려 하므로, 공이 면에 닿는 순간에만 짧게 올리는 편이 공을 가운데에 보존하기 쉽습니다.
- 내려 둔 플리퍼 위에 공이 얹혀 중앙으로 굴러오면, 두 플리퍼를 거의 동시에 올려 킥을 주는 것이 가장 안정적인 복구 동작입니다.
예시로 보는 점수와 시간
예시 1. 첫 번째 공이 왼쪽 범퍼, 가운데 범퍼, 오른쪽 범퍼를 한 번씩 맞히고 사라졌다면 점수는 3 × 100 = 300점입니다. 범퍼에 연속으로 붙어서 한 번에 여러 번 접촉하면 접촉 횟수만큼 더해지므로 점수가 순간적으로 크게 늘 수 있습니다.
예시 2. 공이 플리퍼 높이(y=418)에 도달하기까지 걸리는 자유낙하 시간은 약 0.87초입니다. 그 사이 플레이어는 공의 방향을 보고 어느 플리퍼를 올릴지 결정해야 하므로, 반응이 늦으면 판 아래로 빠집니다.
예시 3. 목표를 1,000점으로 잡으면 범퍼 접촉이 10번 필요합니다. 공이 3개이므로 한 개당 평균 3.33번이고, 모든 공이 3번씩만 맞히면 9번 = 900점에서 끝나 100점이 모자랍니다. 따라서 적어도 한 개의 공은 4번 이상 범퍼를 맞혀야 하며, 그러려면 범퍼 사이에서 여러 번 튕기게 하거나 플리퍼로 공을 다시 위로 올려 보내야 합니다.
예시 4. 아무 조작도 하지 않고 세 개의 공이 모두 범퍼를 한 번도 맞히지 않은 채 바닥으로 빠지는 가장 짧은 판을 계산하면 59프레임 × 3 = 177프레임, 약 2.95초입니다. 실제로는 새 공의 출발 가로 위치(130~190)와 가운데 범퍼의 접촉 폭(중심 160 ± 26 = 134~186)이 넓게 겹쳐서 가만히 두어도 가운데 범퍼를 먼저 맞히는 경우가 많고, 그만큼 짧은 판은 드뭅니다. 반대로 가운데 범퍼가 비껴 가는 출발 위치라면 점수 0점으로 끝날 수도 있습니다.
연습할 때 확인해 볼 동작
- 공이 내려 둔 플리퍼에 닿는 순간을 눈으로 확인하세요. 속력이 0.85배가 되며 가운데로 굴러오는 모습이 보이면, 이어서 두 쪽을 거의 동시에 올려 킥을 거는 연습을 합니다.
- 공이 플리퍼 끝(가운데 쪽)에 닿을 때와 축 쪽(바깥쪽)에 닿을 때 튕겨 나가는 방향이 어떻게 다른지 비교해 보세요. 막대 끝의 둥근 부분은 법선이 달라 표의 중간 면 값과 다르게 나옵니다.
- 키보드와 화면 터치를 번갈아 써 보세요. 키·버튼·터치는 각각 따로 기록되어 하나라도 눌려 있으면 플리퍼가 올라가 있으므로, 손을 바꿔도 의도치 않게 내려가지 않습니다.
- 한 판이 끝나면 점수를 100으로 나눠 범퍼 접촉 횟수를 역산해 보세요. 공 3개의 접촉 횟수 분포를 알면 어느 공에서 점수를 놓쳤는지 감을 잡기 쉽습니다.
한계와 알아둘 점
- 점수 규칙은 범퍼 100점 하나뿐입니다. 보너스 구역, 멀티볼, 틸트, 공 되살리기 같은 요소는 없습니다.
- 실제 핀볼 기계와 달리 플리퍼의 스윙 속도가 반영되지 않고, 판에 경사나 레일이 없습니다. 공의 움직임은 단순한 2차원 반사 계산입니다.
- 난수는 새 공의 출발 위치와 좌우 속도에만 쓰이며 Math.random입니다(보안용 난수가 아님).
- 최고 점수는 이 브라우저의 localStorage(키 이름 pinball-best)에 게임 오버 시점에만 저장됩니다. 지우려면 사이트 데이터를 삭제하면 되고, 다른 기기와는 공유되지 않습니다.
- 게임 속도는 1/60초 단위의 고정 계산이라 모니터 주사율이 높아도 같은 속도로 진행됩니다.
자주 묻는 질문
모바일에서도 할 수 있나요?
네, 화면 아래의 "왼쪽"·"오른쪽" 버튼을 누르고 있거나, 판의 왼쪽/오른쪽 절반을 직접 터치하면 해당 쪽 플리퍼가 올라갑니다. 두 손가락으로 양쪽을 동시에 눌러도 됩니다.
공이 멈춰서 안 움직여요.
중력이 항상 작용하기 때문에 공이 완전히 멈춰 있을 수는 없습니다. 내려 둔 플리퍼 위에서는 중앙 쪽으로 굴러가고, 플리퍼를 올리면 킥이 걸려 다시 튕겨 나갑니다. 그래도 멈춘 것 같다면 새 게임 버튼으로 다시 시작할 수 있습니다.
플리퍼를 누르는 타이밍이 점수에 영향을 주나요?
누르는 순간의 스윙 속도는 계산에 쓰이지 않고, 공이 올라간 플리퍼에 닿고 있는 동안 킥이 걸립니다. 그래서 미리 올려 두고 공을 기다리는 방식도 통하지만, 올린 면은 바깥쪽으로 기울어 있어 공이 옆으로 빠지기 쉽습니다.
공 3개를 모두 잃은 뒤에는 어떻게 하나요?
"새 게임" 버튼을 누르면 점수와 공이 초기화됩니다. 최고 점수는 그대로 유지됩니다.
공이 빨라도 플리퍼를 뚫고 지나가지 않나요?
공의 속도 상한은 프레임당 13픽셀이고, 플리퍼와의 충돌은 공 중심이 막대 중심선에서 13픽셀 안으로 들어오면 발생합니다. 막대 양쪽을 합친 충돌 폭은 26픽셀이라 한 프레임에 13픽셀을 넘게 움직이지 못하는 공이 막대를 건너뛰어 반대편으로 나가기는 어렵습니다. 막대의 끝 바깥쪽은 이 계산에 포함되지 않으니 끝을 비껴가는 것은 가능합니다.
창을 다른 곳으로 옮기면 게임이 멈추나요?
탭이 숨겨질 때(다른 탭으로 이동, 창 최소화)만 일시정지됩니다. 단순히 다른 창을 클릭해 포커스만 잃은 경우에는 게임이 계속 돌아가고, 올려 둔 플리퍼만 모두 내려갑니다. 일시정지 상태에서 키를 누르거나 화면을 터치하면 이어집니다.
게임 오버 뒤에 키를 눌러도 다시 시작되지 않아요.
마지막 공을 잃으면 계산이 멈추고 최종 점수만 표시됩니다. 다시 하려면 "새 게임" 버튼을 눌러야 하며, 이때 최고 점수와 별개로 점수와 공이 초기화됩니다.
공이 한 번에 여러 개 나오나요?
아니요. 판 위에는 항상 공이 하나만 있고, 그 공이 사라져야 다음 공이 나옵니다. 남은 공 표시는 아직 쓸 수 있는 공의 수이며, 지금 판 위의 공은 그 수에 포함됩니다.
키보드로 Z와 / 키는 왜 있나요?
방향키가 없는 환경이나 한 손 조작을 위한 대체 키입니다. Z는 왼쪽, /는 오른쪽 플리퍼에 연결되어 있습니다.
다른 아케이드 게임도 즐겨보세요
비슷한 클래식 아케이드 게임을 원한다면 벽돌깨기 게임이나 퐁 바운스 게임도 확인해보세요. 반사 각도 감각을 키우는 데 좋은 연습이 됩니다. 손의 타이밍만 따로 재 보고 싶다면 반응 속도 테스트도 있습니다.