import pygame
from pygame import locals
import random
class Bob(pygame.sprite.Sprite):
    def __init__(self,image1,image2,image3):
        super().__init__()
        self.image = random.choice([image1,image2,image3])
        self.rect = self.image.get_rect()
        self.rect.x = 1000
        self.rect.y = 500 - self.rect.height
        self.score = 1
class Player(pygame.sprite.Sprite):
    def __init__(self,image):
        super().__init__()
        self.image =image
        self.rect = self.image.get_rect()
        self.rect.x = 150
        self.rect.y = 400 
pygame.init()  # 初始化
# 创建一个窗口
screen = pygame.display.set_mode((1000, 600))
FPS = pygame.time.Clock()  # pygame时钟,控制游戏速度(帧数)
pygame.display.set_caption("悟空酷跑")
# 载入图片
background = pygame.image.load('bg.png')        # 背景
road = pygame.image.load('road.png')            # 路
stone = pygame.image.load('stone.png')          # 石头
cacti = pygame.image.load('cacti.png')          # 仙人掌
bush = pygame.image.load('bush.png')            # 灌木丛
hero = [pygame.image.load('hero1.png'),
        pygame.image.load('hero2.png'),
        pygame.image.load('hero3.png'),
        pygame.image.load('hero4.png'),
        pygame.image.load('hero5.png')]
score_audio = pygame.mixer.Sound("score.wav")
index = 0   
y = 400
jumpState = "runing"
t = 36
road_x = 0
bj_x = 0
obstacle_list = pygame.sprite.Group() 
time = 0
gamestate = True
score = 0
basic_font = pygame.font.Font('STKAITI.TTF',20)
speed = 8
old_score = 0

while True:
    for event in pygame.event.get():
        if event.type == locals.QUIT:
            # 接收到退出事件后退出程序
            exit()
        if event.type == locals.KEYDOWN:
            if jumpState == "runing":
                if event.key == locals.K_SPACE:
                    jumpState = "up"
    speed = 8 + (score//3)
    # 悟空造型
    wukong =Player(hero[index])
    if jumpState == "runing":                   # 跑步状态下
        index += 1
        if index >= 5:
            index = 0
    if gamestate == True:    
        if jumpState == "up":                       # 起跳状态
            if t > 0:
                y -= t
                wukong.rect.y = y
                t -= 2
            else:
                jumpState = "down"  
        if jumpState == "down":                     # 降落状态
            if t <= 36:
                y += t
                wukong.rect.y = y
                t += 2
            else:
                jumpState = "runing"
                t = 36
        
        # 将背景图画上去                                      
        bj_x -= 3
        if bj_x <= -1000:                          
            bj_x = 0
        screen.blit(background, (bj_x, 0))             # 远处背景    
        road_x -= speed
        if road_x <= -1000:                         # 路
            road_x = 0
        screen.blit(road , (road_x, 500))
        screen.blit(wukong.image, (150, y))               # 悟空
        time += 1
        if time >=60:
            num = random.randint(0,100)
            if num > 20:
                obstacle = Bob(bush, stone, cacti)
                obstacle_list.add(obstacle)
            time = 0
            
        for i in obstacle_list:
            i.rect.x -= speed
            screen.blit(i.image,(i.rect.x, i.rect.y)) 
            if i.rect.x < 0 - i.rect.width:
                i.kill()
            if pygame.sprite.collide_rect(wukong,i):
                gameover = pygame.image.load("gameover.png")
                screen.blit(gameover,(400,200))
                gamestate = False
            else:
                if i.rect.x + i.rect.width < wukong.rect.x:
                    score += i.score
                    i.score = 0
        if score > old_score:
           score_audio.play()
           old_score = score 
        scoreSurf = basic_font.render("分数:"+str(score),True,(255,0,0))
        screen.blit(scoreSurf,(850,20))
        # 刷新画面
        pygame.display.update()
        FPS.tick(60)