핀볼 게임

방향키(← →) 또는 아래 버튼으로 플리퍼를 조작해 공을 튕겨보세요.

점수: 0최고 점수: 0남은 공: 3

플레이 방법과 입력 장치

화면은 가로 320 × 세로 480 크기의 세로형 판입니다. 위쪽에서 공이 떨어지고, 중간에 주황색 범퍼가 세 개 있으며, 아래쪽에는 하늘색 플리퍼 두 개가 있습니다. 공이 범퍼에 닿을 때마다 100점이 더해지고, 공이 화면 아래로 사라지면 공이 하나 줄어듭니다. 공은 처음에 3개이고, 모두 잃으면 최종 점수가 표시됩니다. 점수를 올리는 방법은 범퍼 접촉 하나뿐이라 점수는 항상 100의 배수입니다.

플리퍼 구조: 축 위치와 각도

두 플리퍼는 길이 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이 더 얹혀 세게 튕겨 나갑니다. 중요한 점은 플리퍼가 움직이는 속도는 계산에 쓰이지 않는다는 것입니다. 올라가는 도중이든 이미 올라가 있든, 올라간 상태 플래그가 켜져 있으면 닿기만 해도 같은 킥을 받습니다.

플리퍼가 올라오는 데 걸리는 시간

플리퍼는 누르는 즉시 순간이동하지 않고, 매 프레임 남은 각도의 40%만큼만 목표 각도에 다가갑니다. 내려 둔 위치(약 39도 아래)에서 올린 위치(약 20도 위)까지 전체 이동 각도는 약 59도이고, n프레임 뒤에는 이동 각도의 1 − 0.6n만큼 올라와 있습니다. 같은 방식으로 내려올 때도 각도가 서서히 줄어듭니다.

누른 뒤 경과프레임이동 완료 비율올라온 각도
약 17ms140.0%23.6도
약 33ms264.0%37.8도
약 50ms378.4%46.3도
약 83ms592.2%54.4도
약 133ms898.3%58.0도

표처럼 5프레임(약 83ms)이면 거의 다 올라오므로 사람의 반응 시간이 훨씬 더 큰 변수입니다. 다만 킥은 "올린 상태 플래그가 켜져 있는가"로 결정되고 각도가 다 올라왔는지와는 무관하므로, 키를 누른 직후 아직 내려와 있는 면에 공이 닿아도 이미 킥이 적용됩니다. 이때 면의 방향은 그 순간의 각도를 따릅니다.

플리퍼 킥의 결과를 수치로 보기

공이 왼쪽 플리퍼 막대의 중간 면 위로 수직으로 떨어진다고 가정하고 코드의 반사식을 그대로 적용한 값입니다. 오른쪽 플리퍼는 좌우가 대칭인 값입니다. 막대 끝의 둥근 부분에 닿으면 법선 방향이 달라지고, 실제 플레이에서는 공이 옆으로도 움직이므로 이 표는 어디까지나 기준점입니다. 속도의 y 부호는 화면 좌표라서 음수가 위쪽입니다.

들어오는 속도(아래쪽)플리퍼반사 후 vx / vy속력수직 상승 높이
3내려 둠2.49 / -0.532.55약 0픽셀(2프레임)
3올림(킥)-4.46 / -12.2113.00약 260픽셀(44프레임)
8내려 둠6.65 / -1.426.80약 3픽셀(6프레임)
8올림(킥)-5.58 / -11.7413.00약 240픽셀(42프레임)
13내려 둠10.81 / -2.3111.05약 8픽셀(9프레임)
13올림(킥)-6.21 / -11.4213.00약 227픽셀(41프레임)

올린 플리퍼에 닿으면 들어오는 속도가 3이든 13이든 반사 후 속력이 상한 13에 걸립니다. 킥이 속도를 거의 정해 버리기 때문에 공이 어떻게 오든 플리퍼 중간에만 맞으면 비슷한 세기로 솟구친다는 뜻입니다. 위 표의 수직 상승 높이는 충돌 없이 중력만 받는 경우여서, 플리퍼 축 높이 y=418에서 출발하면 최고점은 y=158 근처에서 y=191 근처 사이가 됩니다. 이는 범퍼가 모여 있는 y=150~235 구간의 안쪽이므로, 중간 면 킥이 곧 범퍼 구간으로 공을 올려 주는 동작이라는 코드상의 근거입니다. 내려 둔 플리퍼에 닿은 공은 속력이 0.85배가 되고 위쪽 성분이 작아(표의 vy) 높이 뜨지 못한 채 가운데로 흘러갑니다.

범퍼 세 개의 위치와 간격

범퍼중심 좌표반지름공 중심이 닿는 거리1회 접촉 점수
왼쪽 범퍼(85, 150)1724100
오른쪽 범퍼(235, 150)1724100
가운데 범퍼(160, 235)1926100

범퍼에 닿으면 공은 법선 방향으로 반사된 뒤 법선 방향으로 속도 2가 더 얹힙니다. 즉 범퍼는 공을 조금씩 가속시킵니다. 범퍼 사이의 빈틈은 공 지름(14)보다 충분히 넓어 통과가 가능합니다.

범퍼 쌍중심 사이 거리표면 사이 빈틈
왼쪽 범퍼 - 오른쪽 범퍼150.0116.0
왼쪽 범퍼 - 가운데 범퍼113.477.4
오른쪽 범퍼 - 가운데 범퍼113.477.4

떨어지는 시간: 한 개의 공은 얼마나 버티나

중력은 프레임마다 속도에 0.28을 더하는 방식입니다. 새 공이 y=50에서 정지 상태로 출발해 아무것에도 닿지 않고 떨어질 때 걸리는 시간은 아래와 같습니다. 속도가 상한 13에 닿는 데에는 약 47프레임이 걸립니다.

구간프레임시간(초)
범퍼 높이(y=150)까지270.45
가운데 범퍼 높이(y=235)까지360.60
플리퍼 축 높이(y=418)까지520.87
화면 아래 소멸선(y=510)까지590.98

범퍼에 한 번도 닿지 않고 플리퍼를 지나쳐 바닥으로 사라지면 공 한 개가 약 1.0초 만에 끝납니다. 따라서 3개의 공으로 점수를 모으는 것은 결국 낙하 시간을 얼마나 늘리느냐의 문제이고, 그 수단은 범퍼 반사와 플리퍼 킥뿐입니다.

코드에서 읽어낼 수 있는 전략

예시로 보는 점수와 시간

예시 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점으로 끝날 수도 있습니다.

연습할 때 확인해 볼 동작

한계와 알아둘 점

자주 묻는 질문

모바일에서도 할 수 있나요?

네, 화면 아래의 "왼쪽"·"오른쪽" 버튼을 누르고 있거나, 판의 왼쪽/오른쪽 절반을 직접 터치하면 해당 쪽 플리퍼가 올라갑니다. 두 손가락으로 양쪽을 동시에 눌러도 됩니다.

공이 멈춰서 안 움직여요.

중력이 항상 작용하기 때문에 공이 완전히 멈춰 있을 수는 없습니다. 내려 둔 플리퍼 위에서는 중앙 쪽으로 굴러가고, 플리퍼를 올리면 킥이 걸려 다시 튕겨 나갑니다. 그래도 멈춘 것 같다면 새 게임 버튼으로 다시 시작할 수 있습니다.

플리퍼를 누르는 타이밍이 점수에 영향을 주나요?

누르는 순간의 스윙 속도는 계산에 쓰이지 않고, 공이 올라간 플리퍼에 닿고 있는 동안 킥이 걸립니다. 그래서 미리 올려 두고 공을 기다리는 방식도 통하지만, 올린 면은 바깥쪽으로 기울어 있어 공이 옆으로 빠지기 쉽습니다.

공 3개를 모두 잃은 뒤에는 어떻게 하나요?

"새 게임" 버튼을 누르면 점수와 공이 초기화됩니다. 최고 점수는 그대로 유지됩니다.

공이 빨라도 플리퍼를 뚫고 지나가지 않나요?

공의 속도 상한은 프레임당 13픽셀이고, 플리퍼와의 충돌은 공 중심이 막대 중심선에서 13픽셀 안으로 들어오면 발생합니다. 막대 양쪽을 합친 충돌 폭은 26픽셀이라 한 프레임에 13픽셀을 넘게 움직이지 못하는 공이 막대를 건너뛰어 반대편으로 나가기는 어렵습니다. 막대의 끝 바깥쪽은 이 계산에 포함되지 않으니 끝을 비껴가는 것은 가능합니다.

창을 다른 곳으로 옮기면 게임이 멈추나요?

탭이 숨겨질 때(다른 탭으로 이동, 창 최소화)만 일시정지됩니다. 단순히 다른 창을 클릭해 포커스만 잃은 경우에는 게임이 계속 돌아가고, 올려 둔 플리퍼만 모두 내려갑니다. 일시정지 상태에서 키를 누르거나 화면을 터치하면 이어집니다.

게임 오버 뒤에 키를 눌러도 다시 시작되지 않아요.

마지막 공을 잃으면 계산이 멈추고 최종 점수만 표시됩니다. 다시 하려면 "새 게임" 버튼을 눌러야 하며, 이때 최고 점수와 별개로 점수와 공이 초기화됩니다.

공이 한 번에 여러 개 나오나요?

아니요. 판 위에는 항상 공이 하나만 있고, 그 공이 사라져야 다음 공이 나옵니다. 남은 공 표시는 아직 쓸 수 있는 공의 수이며, 지금 판 위의 공은 그 수에 포함됩니다.

키보드로 Z와 / 키는 왜 있나요?

방향키가 없는 환경이나 한 손 조작을 위한 대체 키입니다. Z는 왼쪽, /는 오른쪽 플리퍼에 연결되어 있습니다.

다른 아케이드 게임도 즐겨보세요

비슷한 클래식 아케이드 게임을 원한다면 벽돌깨기 게임이나 퐁 바운스 게임도 확인해보세요. 반사 각도 감각을 키우는 데 좋은 연습이 됩니다. 손의 타이밍만 따로 재 보고 싶다면 반응 속도 테스트도 있습니다.