import pygame
import random
import math
import sys

pygame.init()
WIDTH = 600
HEIGHT = 500
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Breakout 打砖块增强版")
clock = pygame.time.Clock()

# 颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (220, 40, 40)
GREEN = (40, 180, 40)
YELLOW = (255, 220, 0)
BRICK1 = (80,180,240)
BRICK2 = (240,160,40)
BRICK3 = (220,60,60)

# 字体
font = pygame.font.Font(None, 36)

# 挡板
paddle_w = 140
paddle_h = 16
paddle_x = WIDTH // 2 - paddle_w // 2
paddle_y = HEIGHT - 40
paddle_speed = 7

# 小球
ball_r = 10
ball_x = WIDTH // 2
ball_y = HEIGHT // 2
dx = 2.5
dy = -2.5
base_speed = 2.5
max_speed = 5

# 砖块数据 [x,y,hp]
brick_w = 60
brick_h = 22
brick_gap = 6
bricks = []
rows = 3
cols = 9

score = 0
game_over = False
win = False

def create_bricks():
    bricks.clear()
    for r in range(rows):
        for c in range(cols):
            bx = c * (brick_w + brick_gap) + 20
            by = r * (brick_h + brick_gap) + 40
            hp = random.choice([1,1,2,2,3])
            bricks.append([bx, by, hp])

def reset_game():
    global paddle_x, ball_x, ball_y, dx, dy, score, game_over, win
    paddle_x = WIDTH // 2 - paddle_w // 2
    ball_x = WIDTH // 2
    ball_y = HEIGHT // 2
    dx = base_speed
    dy = -base_speed
    score = 0
    game_over = False
    win = False
    create_bricks()

reset_game()

running = True
while running:
    dt = clock.tick(60)
    screen.fill(BLACK)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_r:
                reset_game()

    keys = pygame.key.get_pressed()
    if not game_over and not win:
        if keys[pygame.K_LEFT] and paddle_x > 0:
            paddle_x -= paddle_speed
        if keys[pygame.K_RIGHT] and paddle_x + paddle_w < WIDTH:
            paddle_x += paddle_speed

        ball_x += dx
        ball_y += dy

        # 墙壁反弹
        if ball_x - ball_r <= 0 or ball_x + ball_r >= WIDTH:
            dx = -dx
        if ball_y - ball_r <= 0:
            dy = -dy
        if ball_y + ball_r >= HEIGHT:
            game_over = True

        # 挡板碰撞
        paddle_rect = pygame.Rect(paddle_x, paddle_y, paddle_w, paddle_h)
        ball_rect = pygame.Rect(ball_x - ball_r, ball_y - ball_r, ball_r*2, ball_r*2)
        if ball_rect.colliderect(paddle_rect):
            dy = -abs(dy)

        # 砖块碰撞
        for brick in bricks:
            bx, by, hp = brick
            if hp > 0:
                brick_rect = pygame.Rect(bx, by, brick_w, brick_h)
                if ball_rect.colliderect(brick_rect):
                    dy = -dy
                    brick[2] -= 1
                    score += 10
                    # 随机加速小球
                    if random.random() < 0.25:
                        spd = math.hypot(dx, dy)
                        if spd < max_speed:
                            scale = 1.08
                            dx *= scale
                            dy *= scale
                    break

        # 判断胜利
        if all(b[2] <= 0 for b in bricks):
            win = True

    # 绘制砖块，根据血量切换颜色
    for bx, by, hp in bricks:
        if hp > 0:
            if hp == 1:
                color = BRICK1
            elif hp == 2:
                color = BRICK2
            else:
                color = BRICK3
            pygame.draw.rect(screen, color, (bx, by, brick_w, brick_h), border_radius=4)

    pygame.draw.rect(screen, WHITE, (paddle_x, paddle_y, paddle_w, paddle_h), border_radius=6)
    pygame.draw.circle(screen, YELLOW, (int(ball_x), int(ball_y)), ball_r)

    score_text = font.render(f"Score: {score}", True, WHITE)
    screen.blit(score_text, (10, 10))

    if game_over or win:
        overlay = pygame.Surface((WIDTH, HEIGHT))
        overlay.set_alpha(150)
        overlay.fill(BLACK)
        screen.blit(overlay, (0, 0))
        if win:
            msg = font.render("YOU WIN! Press R Restart", True, GREEN)
        else:
            msg = font.render("GAME OVER! Press R Restart", True, RED)
        rect = msg.get_rect(center=(WIDTH//2, HEIGHT//2))
        screen.blit(msg, rect)

    pygame.display.update()

pygame.quit()
sys.exit()