import pygame
import random

pygame.init()
W, H = 480, 640
screen = pygame.display.set_mode((W, H))
pygame.display.set_caption("피하기 게임")
clock = pygame.time.Clock()
font = pygame.font.SysFont("malgungothic", 22)
big_font = pygame.font.SysFont("malgungothic", 40, bold=True)

BG = (24, 26, 38)
PLAYER_COLOR = (120, 220, 160)
ROCK_COLOR = (255, 130, 110)
TEXT = (235, 240, 250)

PLAYER_W, PLAYER_H = 44, 44
PLAYER_SPEED = 6
ROCK_W, ROCK_H = 36, 36
ROCK_COUNT = 6

# 플레이어는 Rect 하나로 관리한다 (가로로만 움직이므로 정수로 충분)
player = pygame.Rect(0, 0, PLAYER_W, PLAYER_H)
player.centerx = W // 2
player.bottom = H - 20

rocks = []
score = 0
fall_speed = 3.0
state = "play"      # "play"(진행) / "over"(게임 오버)


def new_rock():
    """운석 하나를 화면 위쪽 어딘가에서 새로 만든다."""
    return {
        "x": float(random.randint(0, W - ROCK_W)),
        "y": float(random.randint(-H, -ROCK_H)),   # 화면 위쪽 바깥에서 시작
        "speed": random.uniform(0.7, 1.4),          # 운석마다 조금씩 다른 속도
    }


def rock_rect(r):
    """운석의 실수 좌표로 충돌 검사용 Rect를 만든다."""
    return pygame.Rect(int(r["x"]), int(r["y"]), ROCK_W, ROCK_H)


def reset_game():
    """게임을 처음 상태로 되돌린다."""
    global rocks, score, fall_speed, state
    rocks = [new_rock() for _ in range(ROCK_COUNT)]
    score = 0
    fall_speed = 3.0
    state = "play"
    player.centerx = W // 2


reset_game()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE and state != "play":
            reset_game()

    # 좌우 키를 누르고 있는 동안 계속 움직인다
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= PLAYER_SPEED
    if keys[pygame.K_RIGHT]:
        player.x += PLAYER_SPEED
    if player.left < 0:
        player.left = 0
    if player.right > W:
        player.right = W

    if state == "play":
        for r in rocks:
            r["y"] += fall_speed * r["speed"]        # 아래로 떨어뜨리기

            if r["y"] > H:                            # 바닥을 지나갔으면
                r["x"] = float(random.randint(0, W - ROCK_W))
                r["y"] = -float(ROCK_H)               # 다시 위에서 시작
                score += 10                           # 하나 피했으니 점수 추가

            if rock_rect(r).colliderect(player):      # 부딪혔으면 게임 오버
                state = "over"

        fall_speed += 0.002                           # 시간이 갈수록 조금씩 빨라진다

    # ---------- 그리기 ----------
    screen.fill(BG)

    for r in rocks:
        pygame.draw.rect(screen, ROCK_COLOR, rock_rect(r), border_radius=6)

    pygame.draw.rect(screen, PLAYER_COLOR, player, border_radius=8)

    screen.blit(font.render(f"점수 {score}", True, TEXT), (16, 16))
    screen.blit(font.render(f"속도 {fall_speed:.1f}", True, TEXT), (16, 44))

    if state == "over":
        msg = big_font.render("게임 오버", True, TEXT)
        sub = font.render("스페이스를 누르면 다시 시작", True, TEXT)
        screen.blit(msg, msg.get_rect(center=(W // 2, H // 2 - 20)))
        screen.blit(sub, sub.get_rect(center=(W // 2, H // 2 + 30)))

    pygame.display.flip()
    clock.tick(60)

pygame.quit()
