Skip to content
  • P
    Projects
  • G
    Groups
  • S
    Snippets
  • Help

Administrator / pygame_lesson9_diy4

  • This project
    • Loading...
  • Sign in
Go to a project
  • Project
  • Repository
  • Issues 0
  • Merge Requests 0
  • Pipelines
  • Wiki
  • Snippets
  • Members
  • Activity
  • Graph
  • Charts
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • Files
  • Commits
  • Branches
  • Tags
  • Contributors
  • Graph
  • Compare
  • Charts
Switch branch/tag
  • pygame_lesson9_diy4
  • my_game.py
Find file
BlameHistoryPermalink
  • BellCodeEditor's avatar
    save project · 7b79ecca
    BellCodeEditor committed 3 years ago
    7b79ecca
my_game.py 5.34 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
import pygame
from pygame import locals
import random
import json
pygame.init()  # 初始化

class Block(pygame.sprite.Sprite):      # 障碍物精灵类
    def __init__(self,image1,image2,image3):
        self.score=1
        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

class Player(pygame.sprite.Sprite):     # 悟空
    def __init__(self, image):
        super().__init__()
        # 加载悟空精灵图像
        self.image = image
        # image的get_rect()方法,可以返回pygame.Rect(0,0,图像宽,图像高)的对象
        self.rect = self.image.get_rect()
        self.rect.x = 150
        self.rect.y = 400

# 创建一个窗口
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')]
basic_font = pygame.font.Font('STKAITI.TTF',32)
index = 0   
y = 400
jumpState = "runing"
t = 30
road_x = 0
bg_x = 0
time = 0
gamestate = True
block_list =pygame.sprite.Group()
score=0
speed=10
old_score=0
score_studio=pygame.mixer.Sound("score.wav")
with open("record.txt","r",encoding="utf-8") as f:
    content=f.read()
    record=json.loads(content)
    one=record["第1名"]
    two=record["第2名"]
    three=record["第3名"]

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=10+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 <= 30:
                y += t
                wukong.rect.y = y
                t += 2
            else:
                jumpState = "runing"
                t =30
        
        # 将背景图画上去
        bg_x -= 1
        if bg_x<=-1000:
            bg_x = 0
        screen.blit(background, (bg_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:      # 创建障碍物精灵
            time = 0
            num = random.randint(0,50)
            if num > 20:
                obstacle = Block(bush,cacti,stone)  
                block_list.add(obstacle)
        for sprite in block_list:       # 遍历、展示障碍物精灵
            sprite.rect.x -= speed
            screen.blit(sprite.image, (sprite.rect.x, sprite.rect.y)) 
            if sprite.rect.x <= 0-sprite.rect.width:
                sprite.kill()
            if pygame.sprite.collide_rect(wukong, sprite):  # 精灵碰撞检测
                gameover = pygame.image.load('gameover.png')     # 游戏结束
                screen.blit(gameover, (400, 200))
                gamestate = False
                if score>three:
                    if socre>one:
                        record["第1名"]=score
                        record["第2名"]=one
                        record["第3名"]=two
                    elif score>two:
                        record["第2名"]=score
                        record["第3名"]=two
                    else:
                        record["第3名"]=score
                    record=json.dumps(record,ensure_ascii=False)
                    with open('record.txt','w',encoding='utf-8')as f:
                        f.write(record)        
            else:
                if sprite.rect.x+sprite.rect.width<wukong.rect.x:
                    score+=sprite.score
                    sprite.score=0
        scoreSurf = basic_font.render("分数:"+str(score),True,(255,0,0))
        screen.blit(scoreSurf,(850,20))
        if score>old_score:
            score_studio.play()
            old_score=score
        scoreSurf = basic_font.render("第1名:"+str(one),True,(255,0,0))
        screen.blit(scoreSurf,(850,50))
        scoreSurf = basic_font.render("第2名:"+str(two),True,(255,0,0))
        screen.blit(scoreSurf,(850,80))
        scoreSurf = basic_font.render("第3名:"+str(three),True,(255,0,0))
        screen.blit(scoreSurf,(850,110))


        # 刷新画面
        pygame.display.update()
        FPS.tick(60)