Fork me on GitHub

Python小恐龙快跑小游戏源代码及素材

该游戏是仿谷歌浏览器小恐龙游戏,程序运行入口Game7.py,配置文件:cfg.py,完整程序包及资源包请在本文文末下载,先上程序运行截图:

 

 

 

 

 

Game7.py
'''
Function:
  仿谷歌浏览器小恐龙游戏
微信公众号:
  学创英才
'''
import cfg
import sys
import random
import pygame
from modules.sprites.scene import *
from modules.sprites.obstacle import *
from modules.sprites.dinosaur import *
from modules.interfaces.gameend import GameEndInterface
from modules.interfaces.gamestart import GameStartInterface


'''main'''
def main(highest_score):
  # 游戏初始化
  pygame.init()
  screen = pygame.display.set_mode(cfg.SCREENSIZE)
  pygame.display.set_caption('小恐龙快跑-学创英才')
  # 导入所有声音文件
  sounds = {}
  for key, value in cfg.AUDIO_PATHS.items():
    sounds[key] = pygame.mixer.Sound(value)
  # 游戏开始界面
  GameStartInterface(screen, sounds, cfg)
  # 定义一些游戏中必要的元素和变量
  score = 0
  score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(534, 15), bg_color=cfg.BACKGROUND_COLOR)
  highest_score = highest_score
  highest_score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(435, 15), bg_color=cfg.BACKGROUND_COLOR, is_highest=True)
  dino = Dinosaur(cfg.IMAGE_PATHS['dino'])
  ground = Ground(cfg.IMAGE_PATHS['ground'], position=(0, cfg.SCREENSIZE[1]))
  cloud_sprites_group = pygame.sprite.Group()
  cactus_sprites_group = pygame.sprite.Group()
  ptera_sprites_group = pygame.sprite.Group()
  add_obstacle_timer = 0
  score_timer = 0
  # 游戏主循环
  clock = pygame.time.Clock()
  while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
        pygame.quit()
        sys.exit()
      elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
          dino.jump(sounds)
        elif event.key == pygame.K_DOWN:
          dino.duck()
      elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN:
        dino.unduck()
    screen.fill(cfg.BACKGROUND_COLOR)
    # --随机添加云
    if len(cloud_sprites_group) < 5 and random.randrange(0, 300) == 10:
      cloud_sprites_group.add(Cloud(cfg.IMAGE_PATHS['cloud'], position=(cfg.SCREENSIZE[0], random.randrange(30, 75))))
    # --随机添加仙人掌/飞龙
    add_obstacle_timer += 1
    if add_obstacle_timer > random.randrange(50, 150):
      add_obstacle_timer = 0
      random_value = random.randrange(0, 10)
      if random_value >= 5 and random_value <= 7:
        cactus_sprites_group.add(Cactus(cfg.IMAGE_PATHS['cacti']))
      else:
        position_ys = [cfg.SCREENSIZE[1]*0.82, cfg.SCREENSIZE[1]*0.75, cfg.SCREENSIZE[1]*0.60, cfg.SCREENSIZE[1]*0.20]
        ptera_sprites_group.add(Ptera(cfg.IMAGE_PATHS['ptera'], position=(600, random.choice(position_ys))))
    # --更新游戏元素
    dino.update()
    ground.update()
    cloud_sprites_group.update()
    cactus_sprites_group.update()
    ptera_sprites_group.update()
    score_timer += 1
    if score_timer > (cfg.FPS//12):
      score_timer = 0
      score += 1
      score = min(score, 99999)
      if score > highest_score:
        highest_score = score
      if score % 100 == 0:
        sounds['point'].play()
      if score % 1000 == 0:
        ground.speed -= 1
        for item in cloud_sprites_group:
          item.speed -= 1
        for item in cactus_sprites_group:
          item.speed -= 1
        for item in ptera_sprites_group:
          item.speed -= 1
    # --碰撞检测
    for item in cactus_sprites_group:
      if pygame.sprite.collide_mask(dino, item):
        dino.die(sounds)
    for item in ptera_sprites_group:
      if pygame.sprite.collide_mask(dino, item):
        dino.die(sounds)
    # --将游戏元素画到屏幕上
    dino.draw(screen)
    ground.draw(screen)
    cloud_sprites_group.draw(screen)
    cactus_sprites_group.draw(screen)
    ptera_sprites_group.draw(screen)
    score_board.set(score)
    highest_score_board.set(highest_score)
    score_board.draw(screen)
    highest_score_board.draw(screen)
    # --更新屏幕
    pygame.display.update()
    clock.tick(cfg.FPS)
    # --游戏是否结束
    if dino.is_dead:
      break
  # 游戏结束界面
  return GameEndInterface(screen, cfg), highest_score


'''run'''
if __name__ == '__main__':
  highest_score = 0
  while True:
    flag, highest_score = main(highest_score)
    if not flag: break
cfg.py
'''配置文件'''
import os


'''屏幕大小'''
SCREENSIZE = (600, 150)
'''FPS'''
FPS = 60
'''音频素材路径'''
AUDIO_PATHS = {
  'die': os.path.join(os.getcwd(), 'resources/audios/die.wav'),
  'jump': os.path.join(os.getcwd(), 'resources/audios/jump.wav'),
  'point': os.path.join(os.getcwd(), 'resources/audios/point.wav')
}
'''图片素材路径'''
IMAGE_PATHS = {
  'cacti': [os.path.join(os.getcwd(), 'resources/images/cacti-big.png'),
        os.path.join(os.getcwd(), 'resources/images/cacti-small.png')],
  'cloud': os.path.join(os.getcwd(), 'resources/images/cloud.png'),
  'dino': [os.path.join(os.getcwd(), 'resources/images/dino.png'),
       os.path.join(os.getcwd(), 'resources/images/dino_ducking.png')],
  'gameover': os.path.join(os.getcwd(), 'resources/images/gameover.png'),
  'ground': os.path.join(os.getcwd(), 'resources/images/ground.png'),
  'numbers': os.path.join(os.getcwd(), 'resources/images/numbers.png'),
  'ptera': os.path.join(os.getcwd(), 'resources/images/ptera.png'),
  'replay': os.path.join(os.getcwd(), 'resources/images/replay.png')
}
'''背景颜色'''
BACKGROUND_COLOR = (235, 235, 235)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

欢迎关注公众号:

posted @ 2021-04-07 00:12  MR_黄Python之路  阅读(3839)  评论(1编辑  收藏  举报