import pygame
import random

# 初始化
pygame.init()
# 窗口设置
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 500
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("骑龙勇士历险记")

# ==========修复字体部分==========
try:
    # Windows系统黑体
    font = pygame.font.SysFont("simhei", 28)
except:
    try:
        font = pygame.font.SysFont("arial", 28)
    except:
        # 兜底使用默认字体
        font = pygame.font.Font(None, 28)

clock = pygame.time.Clock()
FPS = 60

# 颜色
WHITE = (255, 255, 255)
RED = (220, 30, 30)
BLUE = (30, 80, 220)
GREEN = (40, 180, 60)
BLACK = (0, 0, 0)
ORANGE = (255,140,0)
SKY = (120,180,255)

# 龙类
class Dragon(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.x = 120
        self.y = 220
        self.width = 110
        self.height =70
        self.vy = 0
        self.gravity = 0.4
        self.jump_power = -13

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            self.vy = self.jump_power
        self.vy += self.gravity
        self.y += self.vy
        # 边界限制
        if self.y < 0:
            self.y =0
            self.vy=0
        if self.y > SCREEN_HEIGHT - self.height:
            self.y = SCREEN_HEIGHT - self.height
            self.vy=0
        # 左右移动
        if keys[pygame.K_LEFT] and self.x>0:
            self.x -=5
        if keys[pygame.K_RIGHT] and self.x < SCREEN_WIDTH-self.width:
            self.x +=5

    def draw(self):
        # 龙身体
        pygame.draw.ellipse(screen, GREEN, (self.x+20, self.y+15,70,40))
        # 龙头
        pygame.draw.circle(screen, GREEN, (self.x+90,self.y+25),22)
        # 龙翅膀
        pygame.draw.polygon(screen,(60,200,90),[
            (self.x+30,self.y+10),
            (self.x-10,self.y-20),
            (self.x+20,self.y+35)
        ])
        pygame.draw.polygon(screen,(60,200,90),[
            (self.x+60,self.y+10),
            (self.x+100,self.y-20),
            (self.x+75,self.y+35)
        ])
        # 龙眼睛
        pygame.draw.circle(screen,BLACK,(self.x+98,self.y+22),4)
        # 勇士
        pygame.draw.rect(screen,BLUE,(self.x+45,self.y-28,22,32))
        pygame.draw.circle(screen,(255,220,180),(self.x+56,self.y-33),10)
        pygame.draw.polygon(screen,RED,[(self.x+48,self.y-42),(self.x+64,self.y-42),(self.x+56,self.y-54)]) #头盔

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

# 火球
class FireBall(pygame.sprite.Sprite):
    def __init__(self,x,y):
        super().__init__()
        self.x = x
        self.y = y
        self.radius = 9
        self.speed = 10
    def update(self):
        self.x += self.speed
    def draw(self):
        pygame.draw.circle(screen,ORANGE,(self.x,self.y),self.radius)
    def get_rect(self):
        return pygame.Rect(self.x-self.radius,self.y-self.radius,self.radius*2,self.radius*2)

# 障碍物
class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.w = 45
        self.h = random.randint(60,130)
        self.x = SCREEN_WIDTH
        self.y = random.randint(0,SCREEN_HEIGHT-self.h)
        self.speed = 6
    def update(self):
        self.x -= self.speed
    def draw(self):
        pygame.draw.rect(screen,(90,40,20),(self.x,self.y,self.w,self.h))
    def get_rect(self):
        return pygame.Rect(self.x,self.y,self.w,self.h)

def game_loop():
    dragon = Dragon()
    fireballs = []
    obstacles = []
    score =0
    game_over = False
    spawn_timer =0
    while True:
        screen.fill(SKY)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_j and not game_over:
                    fireballs.append(FireBall(dragon.x+95, dragon.y+25))
                if event.key == pygame.K_r and game_over:
                    game_loop() #重新开始

        if not game_over:
            dragon.update()
            # 生成障碍物
            spawn_timer +=1
            if spawn_timer > 90:
                obstacles.append(Obstacle())
                spawn_timer=0
            # 更新火球
            for fb in fireballs[:]:
                fb.update()
                if fb.x>SCREEN_WIDTH:
                    fireballs.remove(fb)
            # 更新障碍物
            for obs in obstacles[:]:
                obs.update()
                if obs.x + obs.w <0:
                    obstacles.remove(obs)
                    score +=10
            # 碰撞检测 龙 vs 障碍
            d_rect = dragon.get_rect()
            for obs in obstacles:
                o_rect = obs.get_rect()
                if d_rect.colliderect(o_rect):
                    game_over = True
                #火球撞障碍
                for fb in fireballs[:]:
                    if fb.get_rect().colliderect(o_rect):
                        obstacles.remove(obs)
                        fireballs.remove(fb)
                        score +=20
                        break
        #绘制
        dragon.draw()
        for fb in fireballs:
            fb.draw()
        for obs in obstacles:
            obs.draw()
        #分数
        score_text = font.render(f"得分: {score}",True,BLACK)
        screen.blit(score_text,(10,10))
        if game_over:
            over_text = font.render("游戏结束！按R重新开始",True,RED)
            screen.blit(over_text,(220,200))
        pygame.display.flip()
        clock.tick(FPS)

if __name__ == "__main__":
    game_loop()
