import pygame
import random
import sys

# 初始化
pygame.init()
SCREEN_W = 800
SCREEN_H = 600
screen = pygame.display.set_mode((SCREEN_W, SCREEN_H))
pygame.display.set_caption("简易RPG冒险游戏")
clock = pygame.time.Clock()
FPS = 60

# 颜色常量
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (220, 20, 20)
GREEN = (30,180,30)
BLUE = (40,120,255)
YELLOW = (255, 220, 0)
GRAY = (80,80,80)

# 字体容错处理
try:
    font = pygame.font.SysFont("simhei",26)
except Exception:
    font = pygame.font.Font(None,26)

# ----------------------全局游戏变量----------------------
player_x,player_y = 100,100
player_w,player_h = 36,36
player_speed = 4
hp = 100
max_hp = 100
atk = 20
gold = 0
attack_cd = 0

monsters = []
monster_size = 32

# 墙壁障碍物
walls = [
    pygame.Rect(200,120,120,30),
    pygame.Rect(400,220,30,140),
    pygame.Rect(150,350,160,30),
    pygame.Rect(500,400,30,150)
]

# 生成怪物
def spawn_monster():
    mx = random.randint(50, SCREEN_W-50)
    my = random.randint(50, SCREEN_H-50)
    monsters.append({"x":mx,"y":my,"hp":60,"speed":1.8})

for _ in range(3):
    spawn_monster()

def draw_ui():
    hp_text = font.render(f"生命:{int(hp)}/{max_hp}",True,RED)
    screen.blit(hp_text,(15,15))
    atk_text = font.render(f"攻击:{atk}",True,GREEN)
    screen.blit(atk_text,(160,15))
    gold_text = font.render(f"金币:{gold}",True,YELLOW)
    screen.blit(gold_text,(280,15))

def move_player(dx,dy):
    global player_x,player_y
    old_x,old_y = player_x,player_y
    player_x += dx*player_speed
    player_y += dy*player_speed
    player_rect = pygame.Rect(player_x,player_y,player_w,player_h)
    for wall in walls:
        if player_rect.colliderect(wall):
            player_x,player_y = old_x,old_y
            return
    # 屏幕边界
    player_x = max(0, min(SCREEN_W-player_w, player_x))
    player_y = max(45, min(SCREEN_H-player_h, player_y))

def monster_update():
    global hp
    player_rect = pygame.Rect(player_x,player_y,player_w,player_h)
    for m in monsters:
        m_rect = pygame.Rect(m["x"],m["y"],monster_size,monster_size)
        # 怪物追踪玩家
        if player_x>m["x"]:
            m["x"] += m["speed"]
        elif player_x<m["x"]:
            m["x"] -= m["speed"]
        if player_y>m["y"]:
            m["y"] += m["speed"]
        elif player_y<m["y"]:
            m["y"] -= m["speed"]
        # 碰到玩家扣血
        if m_rect.colliderect(player_rect):
            hp -= 0.3

def player_attack():
    global attack_cd,gold
    if attack_cd > 0:
        return
    attack_cd = 35
    attack_range = pygame.Rect(player_x-40,player_y-40,player_w+80,player_h+80)
    dead = []
    for idx,m in enumerate(monsters):
        mr = pygame.Rect(m["x"],m["y"],monster_size,monster_size)
        if attack_range.colliderect(mr):
            m["hp"] -= atk
            if m["hp"] <= 0:
                dead.append(idx)
                gold += random.randint(15,40)
    # 删除死亡怪物并且重生
    for i in reversed(dead):
        del monsters[i]
        spawn_monster()

def draw_all():
    screen.fill((35,55,35))
    for w in walls:
        pygame.draw.rect(screen,GRAY,w)
    pygame.draw.rect(screen,BLUE,(player_x,player_y,player_w,player_h))
    for m in monsters:
        pygame.draw.rect(screen,RED,(m["x"],m["y"],monster_size,monster_size))
    draw_ui()


running = True
while running:
    clock.tick(FPS)
    keys = pygame.key.get_pressed()

    # 删掉了主循环里面非法的 global hp, attack_cd
    attack_cd -= 1

    # 角色移动
    if keys[pygame.K_w] or keys[pygame.K_UP]:
        move_player(0,-1)
    if keys[pygame.K_s] or keys[pygame.K_DOWN]:
        move_player(0,1)
    if keys[pygame.K_a] or keys[pygame.K_LEFT]:
        move_player(-1,0)
    if keys[pygame.K_d] or keys[pygame.K_RIGHT]:
        move_player(1,0)
    if keys[pygame.K_SPACE]:
        player_attack()

    # 关闭窗口事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    monster_update()

    # 角色死亡重置
    if hp <= 0:
        hp = max_hp
        player_x, player_y = 100, 100

    draw_all()
    pygame.display.flip()
