用户:
蓦然回首7wkR查看:29 回复:10 评论:29 创建时间:2022-08-04T17:47:08
【作品展示】

【作品介绍】
逆行飙车全新升级!新增成就系统。并且加入问号角色,至于有什么用,自己去探索吧!素材我放在了评论区,各位训练师请将程序与素材放在同一个文件夹才能运行。如果懒得自己下载音乐,请将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