import pygame
import random
import sys

# 初始化
pygame.init()

# 窗口
WIDTH = 1100
HEIGHT = 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("2D 移动射击游戏")
clock = pygame.time.Clock()
FPS = 60

# 配色 美观高级
BG_COLOR = (22, 27, 34)
GROUND_COLOR = (35, 42, 50)
PLAYER_COLOR = (41, 156, 255)
ENEMY_COLOR = (255, 72, 72)
BULLET_COLOR = (255, 220, 100)

# 游戏参数
player_speed = 6
bullet_speed = 12
enemy_speed = 3

# 玩家类
class Player:
    def __init__(self):
        self.x = 100
        self.y = HEIGHT // 2
        self.w = 44
        self.h = 55
        self.hp = 5
        self.shoot_cd = 0

    def move(self, up, down, left, right):
        if up and self.y > 80:
            self.y -= player_speed
        if down and self.y < HEIGHT - self.h - 30:
            self.y += player_speed
        if left and self.x > 0:
            self.x -= player_speed
        if right and self.x < WIDTH - self.w:
            self.x += player_speed

    def shoot(self, bullet_list):
        if self.shoot_cd <= 0:
            bullet_list.append([self.x + self.w, self.y + self.h//2 - 4])
            self.shoot_cd = 12

    def update_cd(self):
        if self.shoot_cd > 0:
            self.shoot_cd -= 1

    def draw(self):
        pygame.draw.rect(screen, PLAYER_COLOR, (self.x, self.y, self.w, self.h), border_radius=10)

# 敌人类
class Enemy:
    def __init__(self):
        self.x = WIDTH
        self.y = random.randint(60, HEIGHT - 90)
        self.w = 40
        self.h = 45

    def update(self):
        self.x -= enemy_speed

    def draw(self):
        pygame.draw.rect(screen, ENEMY_COLOR, (self.x, self.y, self.w, self.h), border_radius=8)

# 生成血量提示色块（替代文字，不报错）
def draw_hp_bar(hp):
    bar_x = 20
    bar_y = 20
    size = 22
    gap = 8
    for i in range(5):
        if i < hp:
            c = (46, 204, 113)
        else:
            c = (80,80,80)
        pygame.draw.rect(screen, c, (bar_x + i*(size+gap), bar_y, size, size), border_radius=4)

# 主函数
def main():
    player = Player()
    bullet_list = []
    enemy_list = []
    enemy_spawn_timer = 0
    game_over = False

    while True:
        screen.fill(BG_COLOR)
        # 绘制地面
        pygame.draw.rect(screen, GROUND_COLOR, (0, HEIGHT-30, WIDTH, 30))

        # 事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            # 游戏结束按R重置
            if game_over and event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    main()

        # 按键检测
        keys = pygame.key.get_pressed()
        if not game_over:
            player.move(
                keys[pygame.K_w],
                keys[pygame.K_s],
                keys[pygame.K_a],
                keys[pygame.K_d]
            )
            if keys[pygame.K_SPACE]:
                player.shoot(bullet_list)
            player.update_cd()

            # 生成敌人
            enemy_spawn_timer += 1
            if enemy_spawn_timer >= 50:
                enemy_list.append(Enemy())
                enemy_spawn_timer = 0

            # 更新子弹
            for b in bullet_list[:]:
                b[0] += bullet_speed
                if b[0] > WIDTH:
                    bullet_list.remove(b)

            # 更新敌人 + 碰撞
            for e in enemy_list[:]:
                e.update()
                # 子弹打敌人
                e_rect = pygame.Rect(e.x, e.y, e.w, e.h)
                for b in bullet_list[:]:
                    b_rect = pygame.Rect(b[0], b[1], 14, 6)
                    if e_rect.colliderect(b_rect):
                        enemy_list.remove(e)
                        bullet_list.remove(b)
                        break
                # 敌人撞玩家扣血
                p_rect = pygame.Rect(player.x, player.y, player.w, player.h)
                if e_rect.colliderect(p_rect):
                    enemy_list.remove(e)
                    player.hp -= 1
                    if player.hp <= 0:
                        game_over = True

        # 绘制子弹
        for b in bullet_list:
            pygame.draw.rect(screen, BULLET_COLOR, (b[0], b[1], 14, 6), border_radius=3)

        # 绘制敌人
        for e in enemy_list:
            e.draw()

        # 绘制玩家
        player.draw()

        # 绘制血量条
        draw_hp_bar(player.hp)

        # 游戏结束遮挡提示
        if game_over:
            pygame.draw.rect(screen, (0,0,0,120), (0,0,WIDTH,HEIGHT))

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

if __name__ == "__main__":
    main()