import pygame
import random

# 初始化
pygame.init()

# 窗口设置
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("简易RPG游戏")
clock = pygame.time.Clock()
FPS = 60

# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
GRAY = (100, 100, 100)

# 字体
font_small = pygame.font.SysFont("simhei", 20)
font_big = pygame.font.SysFont("simhei", 32)

# 玩家类
class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((40, 40))
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.speed = 4
        self.hp = 100
        self.max_hp = 100
        self.attack = 15

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_a] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_d] and self.rect.right < SCREEN_WIDTH:
            self.rect.x += self.speed
        if keys[pygame.K_w] and self.rect.top > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_s] and self.rect.bottom < SCREEN_HEIGHT:
            self.rect.y += self.speed

    def draw_hp(self):
        bar_width = 60
        bar_height = 8
        fill = (self.hp / self.max_hp) * bar_width
        pygame.draw.rect(screen, RED, (self.rect.x, self.rect.y -12, bar_width, bar_height))
        pygame.draw.rect(screen, GREEN, (self.rect.x, self.rect.y -12, fill, bar_height))

# 敌人类 ——修复：update不再接收player参数，改成单独函数传参
class Enemy(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((40, 40))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.hp = 50
        self.max_hp = 50
        self.speed = 1.5
        self.attack = 8

    def ai_move(self, player):
        # 敌人AI移动逻辑，单独方法
        dx = player.rect.x - self.rect.x
        dy = player.rect.y - self.rect.y
        if dx > 0:
            self.rect.x += self.speed
        elif dx < 0:
            self.rect.x -= self.speed
        if dy > 0:
            self.rect.y += self.speed
        elif dy < 0:
            self.rect.y -= self.speed

    def draw_hp(self):
        bar_width = 60
        bar_height = 8
        fill = (self.hp / self.max_hp) * bar_width
        pygame.draw.rect(screen, RED, (self.rect.x, self.rect.y -12, bar_width, bar_height))
        pygame.draw.rect(screen, GREEN, (self.rect.x, self.rect.y -12, fill, bar_height))

# 战斗文本
def draw_text(text, x, y, color=WHITE, size="small"):
    if size == "big":
        surf = font_big.render(text, True, color)
    else:
        surf = font_small.render(text, True, color)
    screen.blit(surf, (x, y))

# 创建精灵组
player_group = pygame.sprite.Group()
enemy_group = pygame.sprite.Group()

player = Player(SCREEN_WIDTH//2, SCREEN_HEIGHT//2)
player_group.add(player)

# 生成3个敌人
for _ in range(3):
    ex = random.randint(100,700)
    ey = random.randint(100,500)
    e = Enemy(ex, ey)
    enemy_group.add(e)

# 游戏变量
game_over = False
fight_log = []

# 主循环
running = True
while running:
    clock.tick(FPS)
    screen.fill((30,30,30))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # 空格攻击
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and not game_over:
                hits = pygame.sprite.spritecollide(player, enemy_group, False)
                for enemy in hits:
                    enemy.hp -= player.attack
                    fight_log.append(f"你对敌人造成 {player.attack} 伤害！")
                    if enemy.hp <= 0:
                        enemy.kill()
                        fight_log.append("敌人被击杀！")

    if not game_over:
        # 更新玩家
        player_group.update()
        # 手动遍历敌人调用AI，解决传参报错！！
        for enemy in enemy_group:
            enemy.ai_move(player)

        # 敌人碰玩家扣血
        hits = pygame.sprite.spritecollide(player, enemy_group, False)
        for enemy in hits:
            player.hp -= enemy.attack * 0.02
            if player.hp <= 0:
                player.hp = 0
                game_over = True

    # 绘制
    player_group.draw(screen)
    enemy_group.draw(screen)

    # 绘制血条
    player.draw_hp()
    for e in enemy_group:
        e.draw_hp()

    # UI面板
    pygame.draw.rect(screen, GRAY, (5,5,220,110))
    draw_text(f"玩家HP: {int(player.hp)}/{player.max_hp}", 10,10)
    draw_text(f"敌人剩余: {len(enemy_group)}",10,35)
    draw_text("WASD移动 | 空格攻击", 10,60)

    # 战斗日志，只保留5行
    for i,msg in enumerate(fight_log[-5:]):
        draw_text(msg, 10, 85 + i*22)

    # 游戏结束
    if game_over:
        draw_text("游戏结束！", SCREEN_WIDTH//2-100, SCREEN_HEIGHT//2, RED, "big")
    if len(enemy_group) == 0:
        draw_text("🎉 胜利！全部敌人消灭", SCREEN_WIDTH//2-140, SCREEN_HEIGHT//2, GREEN, "big")

    pygame.display.flip()

pygame.quit()
