import pygame
import random
import sys
import math

pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("像素枪战 - 人机对战")
clock = pygame.time.Clock()
FPS = 60
font = pygame.font.Font(None, 32)

# 颜色常量
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 40, 40)
YELLOW = (255, 225, 0)
WHITE = (255,255,255)

# --------------------------玩家类--------------------------
class Player:
    def __init__(self):
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.size = 24
        self.speed = 4
        self.hp = 100

    def update(self):
        # 持续按键检测！修复人物不动BUG
        keys = pygame.key.get_pressed()
        if keys[pygame.K_w] and self.y > 0:
            self.y -= self.speed
        if keys[pygame.K_s] and self.y < HEIGHT - self.size:
            self.y += self.speed
        if keys[pygame.K_a] and self.x > 0:
            self.x -= self.speed
        if keys[pygame.K_d] and self.x < WIDTH - self.size:
            self.x += self.speed

    def draw(self):
        pygame.draw.rect(screen, GREEN, (self.x, self.y, self.size, self.size))

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.size, self.size)

# --------------------------AI人机类--------------------------
class AIEnemy:
    def __init__(self):
        self.size = 24
        self.x = random.choice([50, WIDTH - 80])
        self.y = random.randint(50, HEIGHT - 80)
        self.speed = 2.2
        self.hp = 100
        self.shoot_cd = 0
        self.shoot_interval = 90

    def update(self, target_x, target_y, bullets):
        dx = target_x - (self.x + self.size/2)
        dy = target_y - (self.y + self.size/2)
        dist = math.hypot(dx, dy)
        if dist > 0:
            self.x += (dx / dist) * self.speed
            self.y += (dy / dist) * self.speed

        # 边界限制
        self.x = max(0, min(WIDTH - self.size, self.x))
        self.y = max(0, min(HEIGHT - self.size, self.y))

        # AI射击计时
        self.shoot_cd += 1
        if self.shoot_cd >= self.shoot_interval and dist < 450:
            self.shoot_cd = 0
            bx = self.x + self.size/2
            by = self.y + self.size/2
            bdx = dx / dist
            bdy = dy / dist
            bullets.append(Bullet(bx, by, bdx, bdy, True))

    def draw(self):
        pygame.draw.rect(screen, RED, (self.x, self.y, self.size, self.size))

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.size, self.size)

# --------------------------子弹类--------------------------
class Bullet:
    def __init__(self, x, y, dx, dy, is_ai_bullet=False):
        self.x = x
        self.y = y
        self.dx = dx
        self.dy = dy
        self.speed = 8
        self.size = 6
        self.is_ai = is_ai_bullet

    def update(self):
        self.x += self.dx * self.speed
        self.y += self.dy * self.speed

    def is_out(self):
        return self.x < 0 or self.x > WIDTH or self.y < 0 or self.y > HEIGHT

    def draw(self):
        color = RED if self.is_ai else YELLOW
        pygame.draw.rect(screen, color, (self.x, self.y, self.size, self.size))

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.size, self.size)

def main():
    player = Player()
    ai = AIEnemy()
    bullet_list = []
    game_over = False
    win_text = ""

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

        # 事件循环只处理退出和鼠标点击，移动交给get_pressed
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.MOUSEBUTTONDOWN and not game_over:
                mx, my = pygame.mouse.get_pos()
                px = player.x + player.size/2
                py = player.y + player.size/2
                dx = mx - px
                dy = my - py
                dist = math.hypot(dx, dy)
                if dist > 0:
                    bullet_list.append(Bullet(px, py, dx/dist, dy/dist))

        # 每一帧强制更新玩家移动
        if not game_over:
            player.update()
            ai.update(player.x+player.size/2, player.y+player.size/2, bullet_list)

            # 更新子弹 & 碰撞检测
            for b in bullet_list[:]:
                b.update()
                if b.is_out():
                    bullet_list.remove(b)
                    continue
                # 玩家子弹击中AI
                if not b.is_ai and b.get_rect().colliderect(ai.get_rect()):
                    ai.hp -= 5
                    bullet_list.remove(b)
                # AI子弹击中玩家
                if b.is_ai and b.get_rect().colliderect(player.get_rect()):
                    player.hp -= 5
                    bullet_list.remove(b)

            # 胜负判定
            if player.hp <= 0:
                game_over = True
                win_text = "你被AI击败！"
            if ai.hp <= 0:
                game_over = True
                win_text = "你击败AI，胜利！"

        # 渲染所有物体
        player.draw()
        ai.draw()
        for b in bullet_list:
            b.draw()

        # UI血量文字
        hp_player = font.render(f"我方HP:{player.hp}", True, GREEN)
        hp_ai = font.render(f"AI HP:{ai.hp}", True, RED)
        screen.blit(hp_player, (10, 10))
        screen.blit(hp_ai, (10, 40))

        # 游戏结束画面
        if game_over:
            end_surface = font.render(win_text, True, WHITE)
            screen.blit(end_surface, (WIDTH//2 - 110, HEIGHT//2))

        pygame.display.flip()

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()