import pygame
import random
import sys

# 初始化Pygame
pygame.init()

# 游戏窗口设置
WIDTH, HEIGHT = 480, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("飞行躲避小游戏")

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 100, 255)

# 帧率控制
clock = pygame.time.Clock()
FPS = 60

# 玩家（飞机）设置
player_size = 40
player_x = WIDTH // 2 - player_size // 2
player_y = HEIGHT - 100
player_speed = 8

# 陨石（障碍物）设置
obstacle_size = 30
obstacle_speed = 5
obstacles = []

# 分数
score = 0
font = pygame.font.SysFont(None, 40)

# 游戏状态
game_over = False


# 绘制玩家（飞机）
def draw_player(x, y):
    # 用三角形简单模拟飞机
    points = [(x + player_size // 2, y),
              (x, y + player_size),
              (x + player_size, y + player_size)]
    pygame.draw.polygon(screen, BLUE, points)


# 生成陨石
def create_obstacle():
    x = random.randint(0, WIDTH - obstacle_size)
    y = -obstacle_size
    obstacles.append([x, y])


# 移动陨石
def move_obstacles():
    global score
    for obs in obstacles[:]:
        obs[1] += obstacle_speed
        # 陨石飞出屏幕删除，加分
        if obs[1] > HEIGHT:
            obstacles.remove(obs)
            score += 1


# 碰撞检测
def check_collision():
    player_rect = pygame.Rect(player_x, player_y, player_size, player_size)
    for obs in obstacles:
        obs_rect = pygame.Rect(obs[0], obs[1], obstacle_size, obstacle_size)
        if player_rect.colliderect(obs_rect):
            return True
    return False


# 显示文字
def show_text(text, x, y, color=WHITE):
    text_surface = font.render(text, True, color)
    screen.blit(text_surface, (x, y))


# 主游戏循环
def game_loop():
    global player_x, player_y, game_over
    obstacle_spawn_timer = 0

    while True:
        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            # 游戏结束点击鼠标重新开始
            if game_over and event.type == pygame.MOUSEBUTTONDOWN:
                reset_game()

        if not game_over:
            # 鼠标控制飞机
            mx, my = pygame.mouse.get_pos()
            player_x = mx - player_size // 2
            player_y = my - player_size // 2

            # 限制飞机不出屏幕
            player_x = max(0, min(player_x, WIDTH - player_size))
            player_y = max(0, min(player_y, HEIGHT - player_size))

            # 自动生成陨石
            obstacle_spawn_timer += 1
            if obstacle_spawn_timer >= 20:
                create_obstacle()
                obstacle_spawn_timer = 0

            # 移动与碰撞
            move_obstacles()
            if check_collision():
                game_over = True

        # 绘制画面
        screen.fill(BLACK)

        if not game_over:
            draw_player(player_x, player_y)
            for obs in obstacles:
                pygame.draw.circle(screen, RED, (obs[0] + obstacle_size // 2, obs[1] + obstacle_size // 2),
                                   obstacle_size // 2)
            show_text(f"分数：{score}", 10, 10)
        else:
            show_text("游戏结束！", WIDTH//2 - 60, HEIGHT//2 - 50, RED)
            show_text(f"最终得分：{score}", WIDTH//2 - 70, HEIGHT//2)
            show_text("点击鼠标重新开始", WIDTH//2 - 110, HEIGHT//2 + 50)

        pygame.display.update()
        clock.tick(FPS)


# 重置游戏
def reset_game():
    global player_x, player_y, score, obstacles, game_over
    player_x = WIDTH // 2 - player_size // 2
    player_y = HEIGHT - 100
    score = 0
    obstacles.clear()
    game_over = False


# 启动游戏
if __name__ == "__main__":
    game_loop()
