猫史档案馆


【Python作品分享】逆行飙车【作品秀】

用户:蓦然回首7wkR蓦然回首7wkR查看:1 回复:9 评论:1 创建时间:2022-07-31T17:23:22


【作品展示】

center_image

 

【作品介绍】

逆行飙车更新啦!新增了金币,喵和豌豆射手,规则详见游戏。素材我放在了评论区。注意:必须把程序和素材放在同一文件夹才能运行,麻烦各位了

 

【作品源代码】

import pygame
import easygui
import sys
import time
import random

class Constant:
    SCREEN_HEIGHT = 700                             #设置舞台的高为700
    SCREEN_WIGHT = 700                              #设置舞台的宽为700

    BLACK = (0, 0, 0)                               #设置黑色
    RED = (255, 0, 0)                               #设置红色

    SCORE = 0                                       #初始化分数为0
    SPEED = 1                                       #初始化敌人的速度为1

#定义敌人类
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("Enemy.jpg")                             #导入图片
        self.surf = pygame.Surface((60, 96))
        self.rect = self.surf.get_rect(top=0, left=random.randint(0, 624))

    def move(self):
        self.rect.move_ip(0, Constant.SPEED)

        #如果敌人超出了屏幕的高,则回到y=0
        if self.rect.top >= Constant.SCREEN_HEIGHT:
            self.rect.top = 0
            self.rect.left = random.randint(0, 624)                             #将敌人的x坐标,在舞台内随机出现
            Constant.SCORE += 1                                                 #分数加一

#定义玩家类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("Player.png")                                #导入玩家角色
        self.surf = pygame.Surface((20, 83))
        self.rect = self.surf.get_rect(top=601, left=332)                           #初始化玩家的位置

    def move(self):
        pressed_key = pygame.key.get_pressed()
        if pressed_key[pygame.K_w] and self.rect.top >= 0:                              #如果按下w,并且不超出边界,则往上走
            self.rect.move_ip(0, -5)

        if pressed_key[pygame.K_s] and self.rect.bottom <= Constant.SCREEN_HEIGHT:      #如果按下s,并且不超出边界,则往下走
            self.rect.move_ip(0, 5)

        if pressed_key[pygame.K_a] and self.rect.left >= 0:                             #如果按下a,并且不超出边界,则往左走
            self.rect.move_ip(-5, 0)

        if pressed_key[pygame.K_d] and self.rect.right <= Constant.SCREEN_WIGHT:        #如果按下d,并且不超出边界,则往右走
            self.rect.move_ip(5, 0)

#定义金币类
class Gold(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("Gold.png")                              #导入金币图片
        self.surf = pygame.Surface((48, 48))
        self.rect = self.surf.get_rect(top=random.randint(0, 652), left=random.randint(0, 652))

#定义喵类
class Bomb(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("Bomb.png")                              #导入喵图片
        self.surf = pygame.Surface((96, 96))
        self.rect = self.surf.get_rect(top=random.randint(0, 600), left=random.randint(0, 600))

#定义豌豆射手类
class Pea_shooter(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("Pea_shooter.png")
        self.surf = pygame.Surface((39, 63))
        self.rect = self.surf.get_rect(top=200, left=0)

#定义豌豆类
class Pea(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("Pea.png")
        self.surf = pygame.Surface((37, 37))
        self.rect = self.surf.get_rect(top=200, left=55)

    def move(self):
        self.rect.move_ip(5, 0)

        if self.rect.left >= Constant.SCREEN_WIGHT:
            self.rect.left = 55

#定义游戏类
class Game:
    def __init__(self):
        pygame.init()                                                                       #初始化pygame模块

        size = Constant.SCREEN_HEIGHT, Constant.SCREEN_WIGHT                                #将舞台大小设置成700,700

        self.screen = pygame.display.set_mode(size)                                         #创建舞台
        pygame.display.set_caption("逆行飙车")                                               #将游戏命名为“逆行飙车“

        big_font = pygame.font.SysFont("叶根友毛笔行书2.0版 常规", 60)                                       #将big_font字体设置成“微软雅黑”,字号为60
        self.喵all_font = pygame.font.SysFont("叶根友毛笔行书2.0版 常规", 20)                                #将喵all_font字体设置成“微软雅黑”,字号为20
        self.game_over = big_font.render("游戏结束", True, Constant.BLACK)                   #将game_over文本为“游戏结束”,不透明,颜色黑

        self.clock = pygame.time.Clock()                                                    #设置clock时钟
        self.FPS = 70                                                                       #将帧率设置为70

        self.background = pygame.image.load("Background.jpg")                               #导入背景

        self.SPEED_UP = pygame.USEREVENT + 1
        pygame.time.set_timer(self.SPEED_UP, 1000)

        self.MOVE_UP = pygame.USEREVENT + 2
        pygame.time.set_timer(self.MOVE_UP, 3000)

        self.MOVE1_UP = pygame.USEREVENT + 3
        pygame.time.set_timer(self.MOVE1_UP, 3000)

        self.MOVE2_UP = pygame.USEREVENT + 4
        pygame.time.set_timer(self.MOVE2_UP, 1000)

    #运行
    def run(self):
        player = Player()                               #初始化Player类
        enemy = Enemy()                                 #初始化Enemy类
        gold = Gold()                                   #初始化Gold类
        喵 = Bomb()                                   #初始化Bomb类
        pea_shooter = Pea_shooter()
        pea = Pea()

        enemies_list = [enemy, pea]                     #定
        enemies = pygame.sprite.Group()                 #义
        for sprite in enemies_list:                     #4
            enemies.add(sprite)                         #个
                                                        #精
        babies_list = [gold]                            #灵
        babies = pygame.sprite.Group()                  #组
        for sprite in babies_list:                      #
            babies.add(sprite)                          #enemies
                                                        #babies
        喵s_list = [喵]                             #喵s
        喵s = pygame.sprite.Group()                   #all_sprites
        for sprite in 喵s_list:                       #
            喵s.add(sprite)                           #
                                                        #
                                                        #以
        all_sprites_list = [player, enemy, pea]         #下
        all_sprites = pygame.sprite.Group()             #精
        for sprite in all_sprites_list:                 #灵
            all_sprites.add(sprite)                     #组

        pygame.mixer.Sound("Background.wav").play(-1)   #无限播放Background.wav

        easygui.msgbox("游戏规则:\n\t1.w向上走,s向下走,a向左走,d向右走。\n\t2.努力躲开白色小车,否则就会失败。\n\t3.碰到金币就会加两分,碰到喵就会扣三分。\n\t4.敌人的速度会随着时间的流逝而变快。\n\t5.分数就显示在左上角。\n\t6.不要碰到豌豆射手发喵的豌豆,它也会使您失败", "逆行飙车", "我知道了")                  #游戏规则提示

        #游戏主循环
        while True:
            self.screen.blit(self.background, (0, 0))   #将background打印在坐标(0, 0)处
            self.screen.blit(gold.image, gold.rect)
            self.screen.blit(喵.image, 喵.rect)
            self.screen.blit(pea_shooter.image, pea_shooter.rect)
            for sprite in all_sprites:
                self.screen.blit(sprite.image, sprite.rect)
                sprite.move()

            scores = self.喵all_font.render(str(Constant.SCORE), True, Constant.BLACK)
            self.screen.blit(scores, (10, 10))          #将得分打印在坐标(10, 10)处

            for event in pygame.event.get():
                #当鼠标点击到右上角的叉叉处,清楚所有的pygame库,并且退出程序
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()

                #每过一秒,敌人的速度便增加0.25
                if event.type == self.SPEED_UP:
                    Constant.SPEED += 0.25

                #每过三秒,金币便更换一个位置
                if event.type == self.MOVE_UP:
                    gold.rect.top = random.randint(0, 652)
                    gold.rect.left = random.randint(0, 652)

                #每过三秒,喵便更换一个位置
                if event.type == self.MOVE1_UP:
                    喵.rect.top = random.randint(0, 600)
                    喵.rect.left = random.randint(0, 600)

            #当玩家碰到敌人
            if pygame.sprite.spritecollideany(player, enemies):
                time.sleep(2)                                       #休眠两秒

                self.screen.fill(Constant.RED)                      #将背景色设置为红色
                self.screen.blit(self.game_over, (240, 255))        #将结束字幕打印在坐标(240, 255)处

                pygame.display.update()                             #刷新界面
                time.sleep(2)                                       #休眠两秒

                pygame.quit()                                       #删除pygame库在内存中的位置
                sys.exit()                                          #退出程序


            #当玩家碰到金币
            if pygame.sprite.spritecollideany(player, babies):
                gold.rect.top = random.randint(0, 652)              #将金币的y坐标设置成0到652中的随机整数
                gold.rect.left = random.randint(0, 652)             #将金币的x坐标设置成0到652中的随机整数

                Constant.SCORE += 2                                 #分数加2

            #当玩家碰到了喵
            if pygame.sprite.spritecollideany(player, 喵s):
                喵.rect.top = random.randint(0, 600)              #将喵的y坐标设置成0到600中的随机整数
                喵.rect.left = random.randint(0, 600)             #将喵的x坐标设置成0到600中的随机整数

                Constant.SCORE -= 3                                 #分数减3

            pygame.display.update()                                 #刷新界面
            self.clock.tick(self.FPS)


if __name__ == "__main__":
    game = Game()
    game.run()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
你敢反了你敢反了

center_image

点赞0


评论


你敢反了你敢反了

center_image

点赞0


评论


你敢反了你敢反了

center_image

点赞0


评论


你敢反了你敢反了

center_image

点赞0


评论


你敢反了你敢反了

center_image

点赞0


评论


你敢反了你敢反了

center_image

点赞0


评论


你敢反了你敢反了

center_image

点赞0


评论


你敢反了你敢反了

素材如下:

点赞0


评论


穹天穹天

建议完善一下那个bug,同时增加真实感。

点赞0


评论