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 · ba54d2e9
    BellCodeEditor committed 3 years ago
    ba54d2e9
my_game.py 4.84 KB
Edit
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
import pygame
from pygame import locals
import random
import json
pygame.init()  # 初始化

class Block(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
        # 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')]
score_audio=pygame.mixer.Sound('score.wav')
basic_font = pygame.font.Font('STKAITI.TTF',32)

score=0
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
old_score=0
speed = 0

with open('record.txt','r',encoding='utf-8')as f:
    content=f.read()
    record=json.loads(content)
    one = record["第1名"]
    two = record["第2名"]
    thr = 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 = 20 + 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
            else:
                if sprite.rect.x+sprite.rect.width <wukong.rect.x:
                    score+=sprite.score
                    sprite.score = 0
        if score>old_score:
            score_audio.play()
            old_score=score
          
        scoreSurf = basic_font.render("分数:"+str(score),True,(250,36,48))
        screen.blit(scoreSurf,(880,20))
        scoreSurf = basic_font.render("第1名:"+str(one),True,(250,36,48))
        screen.blit(scoreSurf,(880,50))
        scoreSurf = basic_font.render("第2名:"+str(two),True,(250,36,48))
        screen.blit(scoreSurf,(880,80))
        scoreSurf = basic_font.render("第3名:"+str(thr),True,(250,36,48))
        screen.blit(scoreSurf,(880,110))
     
        # 刷新画面
        pygame.display.update()
        FPS.tick(600)