猫史档案馆


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

用户:蓦然回首7wkR蓦然回首7wkR查看:29 回复: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


评论