猫史档案馆


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

用户:蓦然回首7wkR蓦然回首7wkR查看:78 回复:10 评论:29 创建时间:2022-08-04T17:47:08


【作品展示】

center_image

 

【作品介绍】

逆行飙车全新升级!新增成就系统。并且加入问号角色,至于有什么用,自己去探索吧!素材我放在了评论区,各位训练师请将程序与素材放在同一个文件夹才能运行。如果懒得自己下载音乐,请将pygame.mixer.Sound()那一行删掉

 

【作品源代码】

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

    DRIVER = False                                  #初始化DRIVER成就为false
    ZOMBIE = False                                  #初始化ZOMBIE成就为false
    BLIND_PERSON = False                            #初始化BLIND_PERSON成就为false
    BOLD = False                                    #初始化BOLD成就为false
    CHE_SHEN = False                                #初始化CHE_SHEN成就为false
    BOTTOM = False                                  #初始化BOTTOM成就为false

#定义敌人类
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=591, 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)
            Constant.BOTTOM = True

        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 <= 680:                          #如果按下d,并且不超出边界,则往右走
            self.rect.move_ip(5, 0)

        if pressed_key[pygame.K_f]:                                                     #如果按下f,退出游戏
            pygame.quit()
            sys.exit()

#定义金币类
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 Question_mark(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("Question_mark.png")
        self.surf = pygame.Surface((喵, 喵))
        self.rect = self.surf.get_rect(top=random.randint(0, 630), left=random.randint(0, 630))

#定义游戏类
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("微软雅黑", 60)                                       #将big_font字体设置成“微软雅黑”,字号为60
        self.喵all_font = pygame.font.SysFont("微软雅黑", 20)                                #将喵all_font字体设置成“微软雅黑”,字号为20

        self.game_over = big_font.render("游戏结束", True, Constant.BLACK)                   #将game_over文本为“游戏结束”,不透明,颜色黑
        self.driver = self.喵all_font.render("成就:老司机啦(分数极高,高达20分诶)", True, Constant.BLACK)
        self.zombie = self.喵all_font.render("成就:我是...僵尸?!(被豌豆打中了)", True, Constant.BLACK)
        self.blind_person = self.喵all_font.render("成就:车盲(分数太低啦)", True, Constant.BLACK)
        self.bold = self.喵all_font.render("成就:真儿胆大(居然敢往上边儿挺)", True, Constant.BLACK)
        self.che_shen = self.喵all_font.render("成就:全民车神(分数达到了惊人的40分!!!!", True, Constant.BLACK)
        self.no_bottom = self.喵all_font.render("成就:永不后退的兵", True, Constant.BLACK)

        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()
        question_mark = Question_mark()

        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)                           #
                                                        #
        peas_list = [pea]                               #
        peas = pygame.sprite.Group()
        for sprite in peas_list:
            peas.add(peas_list)

        question_marks_list = [question_mark]
        question_marks = pygame.sprite.Group()
        for sprite in question_marks_list:
            question_marks.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向右走,f退出游戏。\n\t2.努力躲开白色小车,否则就会失败。\n\t3.碰到金币就会加两分,碰到喵就会扣三分,碰到问号会...自己去探索吧。\n\t4.敌人的速度会随着时间的流逝而变快。\n\t5.分数就显示在左上角。\n\t6.不要碰到豌豆射手发喵的豌豆,它也会使您失败。", "逆行飙车", "我知道了")                  #游戏规则提示
        easygui.msgbox("\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)
            self.screen.blit(question_mark.image, question_mark.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)处

            scores_copy = "分数是" + str(Constant.SCORE)
            scores_copy_blit = self.喵all_font.render(scores_copy, True, Constant.BLACK)

            if Constant.SCORE >= 20:
                Constant.BLIND_PERSON = False
                Constant.DRIVER = True
            if pygame.sprite.spritecollideany(player, peas):
                Constant.ZOMBIE = True
            if Constant.SCORE <= 0 and pygame.sprite.spritecollideany(player, enemies):
                Constant.DRIVER = False
                Constant.CHE_SHEN = False
                Constant.BLIND_PERSON = True
            if player.rect.top <= 0:
                Constant.BOLD = True
            if Constant.SCORE >= 40:
                Constant.CHE_SHEN = True
                Constant.ZOMBIE = True

            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)

                #每过0.5秒,问号便更换一个位置
                if event.type == self.MOVE2_UP:
                    question_mark.rect.top = random.randint(0, 630)
                    question_mark.rect.left = random.randint(0, 630)

            #当玩家碰到敌人
            if pygame.sprite.spritecollideany(player, enemies):
                while True:
                    self.screen.fill(Constant.RED)
                    self.screen.blit(self.game_over, (240, 200))
                    self.screen.blit(scores_copy_blit, (210, 370))
                    if Constant.DRIVER == True:
                        self.screen.blit(self.driver, (210, 400))
                    if Constant.ZOMBIE == True:
                        self.screen.blit(self.zombie, (210, 430))
                    if Constant.BLIND_PERSON == True:
                        self.screen.blit(self.blind_person, (210, 400))
                    if Constant.BOLD == True:
                        self.screen.blit(self.bold, (210, 460))
                    if Constant.CHE_SHEN == True:
                        self.screen.blit(self.che_shen, (210, 490))
                    if Constant.BOTTOM == False:
                        self.screen.blit(self.no_bottom, (210, 520))

                    for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                            pygame.quit()
                            sys.exit()

                    pygame.display.update()
                    self.clock.tick(self.FPS)

            #当玩家碰到金币
            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

            #当玩家碰到了问号
            if pygame.sprite.spritecollideany(player, question_marks):
                player.rect.top = random.randint(0, 601)
                player.rect.left = random.randint(0, 6喵)

            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


评论


你敢反了你敢反了

center_image

点赞0


评论


你敢反了你敢反了

素材如下:

点赞0


评论


穹天穹天

那个,中文显示好像还有点问题

点赞0


评论

???

我本地运行好好地啊

有没有文字素材?

我这可能字体未下载

这个...文字素材好像是微软雅黑

是吗

可能要下载,有的话最好也发一下,要不全是框……

我不会呀

我发给你看看

额,好像发不了

那算了

那算了

没关系

问号是随机传送吗?

有点像

是的

并且,他有可能把你传送到敌人的位置,你就gameover了

这……

没事,只要躲到最右边,永远不会喵,呵呵……

我记得,我已经把bug修好了呀,这是怎么回事

还有,敌人是有可能贴着边来的,我试过

反正我用了最新版,照样200多分。

出去抢金币时喵掉了……

刚才我就玩了一遍,本来是想捡金币的,结果一个问号传送到豌豆旁边,我就gameover了

刚才我就玩了一遍,本来是想捡金币的,结果一个问号传送到豌豆旁边,我就gameover了

啊这

呵呵

正常正常

好厉害啊