import pygame
import random

pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("塔防游戏")
clock = pygame.time.Clock()
FPS = 60

WHITE = (255, 255, 255)
RED = (200, 0, 0)
BLUE = (0, 0, 200)
GREEN = (0, 180, 0)
GRAY = (80, 80, 80)

path = [
    (0, 150),
    (200, 150),
    (200, 350),
    (500, 350),
    (500, 200),
    (800, 200)
]

class Enemy:
    def __init__(self):
        self.pos = list(path[0])
        self.path_index = 1
        self.hp = 100
        self.speed = 1.2

    def update(self):
        if self.path_index < len(path):
            target_x, target_y = path[self.path_index]
            dx = target_x - self.pos[0]
            dy = target_y - self.pos[1]
            dist = (dx**2 + dy**2)**0.5
            if dist > self.speed:
                self.pos[0] += dx / dist * self.speed
                self.pos[1] += dy / dist * self.speed
            else:
                self.pos = [target_x, target_y]
                self.path_index += 1

    def draw(self):
        pygame.draw.circle(screen, RED, (int(self.pos[0]), int(self.pos[1])), 12)

class Tower:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.range = 120
        self.damage = 15
        self.cooldown = 40
        self.timer = 0

    def update(self, enemy_list, bullet_list):
        self.timer -= 1
        if self.timer <= 0:
            for enemy in enemy_list:
                dis = ((enemy.pos[0] - self.x) ** 2 + (enemy.pos[1] - self.y) ** 2) ** 0.5
                if dis < self.range:
                    bullet_list.append(Bullet(self.x, self.y, enemy))
                    self.timer = self.cooldown
                    break

    def draw(self):
        pygame.draw.circle(screen, BLUE, (self.x, self.y), 18)

class Bullet:
    def __init__(self, x, y, target):
        self.x = x
        self.y = y
        self.target = target
        self.speed = 5

    def update(self):
        dx = self.target.pos[0] - self.x
        dy = self.target.pos[1] - self.y
        dist = (dx**2 + dy**2)**0.5
        if dist > self.speed:
            self.x += dx / dist * self.speed
            self.y += dy / dist * self.speed
            return True
        else:
            self.target.hp -= 15
            return False

    def draw(self):
        pygame.draw.circle(screen, GREEN, (int(self.x), int(self.y)), 5)

def main():
    enemies = []
    towers = []
    bullets = []
    gold = 100
    lives = 5
    spawn_timer = 0
    running = True
    # 获取默认字体，彻底避开SysFont
    default_font = pygame.font.get_default_font()
    while running:
        screen.fill(GRAY)
        for i in range(len(path)-1):
            pygame.draw.line(screen, WHITE, path[i], path[i+1], 6)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                mx, my = pygame.mouse.get_pos()
                if gold >= 50:
                    towers.append(Tower(mx, my))
                    gold -= 50

        spawn_timer += 1
        if spawn_timer >= 120:
            enemies.append(Enemy())
            spawn_timer = 0

        for e in enemies[:]:
            e.update()
            if e.path_index >= len(path):
                lives -= 1
                enemies.remove(e)
            elif e.hp <= 0:
                gold += 20
                enemies.remove(e)
            e.draw()

        for tw in towers:
            tw.update(enemies, bullets)
            tw.draw()

        for b in bullets[:]:
            if not b.update():
                bullets.remove(b)
            else:
                b.draw()

        # 绘制文字
        font = pygame.font.Font(default_font, 35)
        text_gold = font.render(f"金币:{gold}", True, WHITE)
        text_life = font.render(f"生命:{lives}", True, WHITE)
        screen.blit(text_gold, (10, 10))
        screen.blit(text_life, (120, 10))

        if lives <= 0:
            over_font = pygame.font.Font(default_font, 70)
            over_text = over_font.render("游戏结束", True, RED)
            screen.blit(over_text, (250, 250))

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

if __name__ == "__main__":
    main()