import pygame
import random
import sys

# 初始化pygame
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("捕鱼模拟器")

# 颜色定义
SEA_BLUE = (20, 80, 160)
NET_COLOR = (255, 255, 255)
WHITE = (255, 255, 255)
RED = (255, 60, 60)
YELLOW = (255, 220, 0)
GREEN = (60, 220, 80)

# 字体
try:
    font = pygame.font.Font("simhei.ttf", 24)
except:
    font = pygame.font.SysFont("Microsoft YaHei", 24)

score = 0
clock = pygame.time.Clock()
FPS = 60

# 鱼类
class Fish:
    def __init__(self):
        self.x = random.randint(50, WIDTH - 50)
        self.y = random.randint(120, HEIGHT - 50)
        self.size = random.randint(15, 40)
        self.speed_x = random.choice([-1, 1]) * random.uniform(1, 2.5)
        self.speed_y = random.uniform(-0.8, 0.8)
        # 大鱼分高
        self.point = int(50 - self.size)
        self.color = random.choice([RED, YELLOW, GREEN])

    def update(self):
        self.x += self.speed_x
        self.y += self.speed_y
        # 撞边反弹
        if self.x < self.size or self.x > WIDTH - self.size:
            self.speed_x *= -1
        if self.y < 100 or self.y > HEIGHT - self.size:
            self.speed_y *= -1

    def draw(self):
        pygame.draw.ellipse(screen, self.color, (self.x, self.y, self.size * 2, self.size))
        pygame.draw.circle(screen, (0, 0, 0), (int(self.x + self.size*1.6), int(self.y + self.size*0.3)), 3)

# 渔网类
class FishingNet:
    def __init__(self):
        self.is_cast = False
        self.start_x = WIDTH // 2
        self.start_y = 0
        self.end_x = self.start_x
        self.end_y = 0
        self.net_radius = 35
        self.fall_speed = 6

    def cast_down(self, mouse_x, mouse_y):
        if not self.is_cast:
            self.is_cast = True
            self.start_x = mouse_x
            self.start_y = 0
            self.end_x = mouse_x
            self.end_y = 0

    def update(self):
        if self.is_cast:
            self.end_y += self.fall_speed
            # 落底自动收网
            if self.end_y > HEIGHT - 20:
                self.is_cast = False

    def draw(self):
        pygame.draw.line(screen, NET_COLOR, (self.start_x, self.start_y), (self.end_x, self.end_y), 2)
        if self.is_cast:
            pygame.draw.circle(screen, NET_COLOR, (int(self.end_x), int(self.end_y)), self.net_radius, 2)

    def check_catch(self, fish_list):
        global score
        if not self.is_cast:
            return
        net_x, net_y = self.end_x, self.end_y
        to_remove = []
        for idx, fish in enumerate(fish_list):
            dx = fish.x + fish.size - net_x
            dy = fish.y + fish.size/2 - net_y
            dist = (dx**2 + dy**2)**0.5
            if dist < self.net_radius:
                score += fish.point
                to_remove.append(idx)
        # 倒序删除防止索引错乱
        for i in sorted(to_remove, reverse=True):
            del fish_list[i]

# 生成初始鱼群
fish_group = [Fish() for _ in range(12)]
net = FishingNet()

running = True
while running:
    screen.fill(SEA_BLUE)
    # 海面分界线
    pygame.draw.line(screen, WHITE, (0, 100), (WIDTH, 100), 3)

    # 事件监听
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            mx, my = pygame.mouse.get_pos()
            net.cast_down(mx, my)

    # 鼠标未撒网时跟随鼠标
    if not net.is_cast:
        mx, my = pygame.mouse.get_pos()
        net.start_x = mx

    # 更新渔网
    net.update()
    net.draw()

    # 更新鱼
    for fish in fish_group:
        fish.update()
        fish.draw()

    # 碰撞捕捞检测
    net.check_catch(fish_group)

    # 鱼不够就补充
    if len(fish_group) < 10:
        fish_group.append(Fish())

    # 绘制分数
    score_text = font.render(f"当前分数：{score}", True, WHITE)
    screen.blit(score_text, (10, 10))
    tip = font.render("鼠标点击海面撒网捕鱼", True, WHITE)
    screen.blit(tip, (WIDTH - 320, 10))

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

pygame.quit()
sys.exit()