脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python Pygame实战之超级炸弹人游戏的实现

Python Pygame实战之超级炸弹人游戏的实现

2022-11-04 10:26嗨!栗子同学 Python

如今的玩家们在无聊的时候会玩些什么游戏呢?王者还是吃鸡是最多的选择。但在80、90年代的时候多是一些很简单的游戏:《超级玛丽》、《魂斗罗》等。本文将利用Pygame制作另一个经典游戏—炸弹人,感兴趣的可以了解一下

前言

如今的玩家们在无聊的时候会玩些什么游戏呢?

王者还是吃鸡是最多的选择。但在80、90年代的时候多是一些很简单的游戏:《超级玛丽》、《蜘蛛纸牌》、《魂斗罗》......

不知道还有人记得《炸弹人》这款怀旧的产品嘛?

啊这,不对不对,放错图片了下面这才是童年的正确打开方式

Python Pygame实战之超级炸弹人游戏的实现

今天小编就带大家怀旧一波,来给大家用代码仿制一下童年大家玩儿过的《炸弹人》小游戏!

 

一、环境安装

1.素材(图片)

Python Pygame实战之超级炸弹人游戏的实现

Python Pygame实战之超级炸弹人游戏的实现

2.环境安装

本文是由Pygame写的小游戏。

涉及运行环境:Python3.7、Pycharm社区版、Pygame模块。

pip install +模块名 或pip install -i https://pypi.douban.com/simple/ +模块名

 

二、代码演示

1.配置文件

'''配置文件'''
import os


'''屏幕大小'''
SCREENSIZE = (640, 480)
'''块大小'''
BLOCKSIZE = 30
'''FPS'''
FPS = 30
'''游戏地图路径'''
GAMEMAPPATHS = [os.path.join(os.getcwd(), path) for path in \
  ['resources/maps/1.map', 'resources/maps/2.map']]
'''墙路径'''
WALLPATHS = [os.path.join(os.getcwd(), path) for path in \
  ['resources/images/misc/wall0.png', 'resources/images/misc/wall1.png', 'resources/images/misc/wall2.png']]
'''英雄路径'''
HERODKPATHS = [os.path.join(os.getcwd(), path) for path in \
  ['resources/images/dk/left.png', 'resources/images/dk/right.png', 'resources/images/dk/up.png', 'resources/images/dk/down.png']]
HEROZELDAPATHS = [os.path.join(os.getcwd(), path) for path in \
  ['resources/images/zelda/left.png', 'resources/images/zelda/right.png', 'resources/images/zelda/up.png', 'resources/images/zelda/down.png']]
HEROBATMANPATHS = [os.path.join(os.getcwd(), path) for path in \
  ['resources/images/batman/left.png', 'resources/images/batman/right.png', 'resources/images/batman/up.png', 'resources/images/batman/down.png']]
'''水果路径'''
FRUITPATHS = [os.path.join(os.getcwd(), path) for path in \
  ['resources/images/misc/banana.png', 'resources/images/misc/cherry.png']]
'''背景路径'''
BACKGROUNDPATHS = [os.path.join(os.getcwd(), path) for path in \
  ['resources/images/misc/bg0.png', 'resources/images/misc/bg1.png', 'resources/images/misc/bg2.png']]
'''爆炸和发射路径'''
BOMBPATH = os.path.join(os.getcwd(), 'resources/images/misc/bomb.png')
FIREPATH = os.path.join(os.getcwd(), 'resources/images/misc/fire.png')
'''背景音乐'''
BGMPATH = os.path.join(os.getcwd(), 'resources/audio/bgm.mp3')
'''一些颜色'''
YELLOW = (255, 255, 0)
BLUE = (0, 0, 255)
RED = (255, 0, 0)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

2.主程序

 
import sys
import cfg
import random
import pygame
from modules import *


'''游戏主程序'''
def main(cfg):
  # 初始化
  pygame.init()
  pygame.mixer.init()
  pygame.mixer.music.load(cfg.BGMPATH)
  pygame.mixer.music.play(-1, 0.0)
  screen = pygame.display.set_mode(cfg.SCREENSIZE)
  pygame.display.set_caption('炸弹人小游戏')
  # 开始界面
  Interface(screen, cfg, mode='game_start')
  # 游戏主循环
  font = pygame.font.SysFont('Consolas', 15)
  for gamemap_path in cfg.GAMEMAPPATHS:
      # -地图
      map_parser = mapParser(gamemap_path, bg_paths=cfg.BACKGROUNDPATHS, wall_paths=cfg.WALLPATHS, blocksize=cfg.BLOCKSIZE)
      # -水果
      fruit_sprite_group = pygame.sprite.Group()
      used_spaces = []
      for i in range(5):
          coordinate = map_parser.randomGetSpace(used_spaces)
          used_spaces.append(coordinate)
          fruit_sprite_group.add(Fruit(random.choice(cfg.FRUITPATHS), coordinate=coordinate, blocksize=cfg.BLOCKSIZE))
      # -我方Hero
      coordinate = map_parser.randomGetSpace(used_spaces)
      used_spaces.append(coordinate)
      ourhero = Hero(imagepaths=cfg.HEROZELDAPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='ZELDA')
      # -电脑Hero
      aihero_sprite_group = pygame.sprite.Group()
      coordinate = map_parser.randomGetSpace(used_spaces)
      aihero_sprite_group.add(Hero(imagepaths=cfg.HEROBATMANPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='BATMAN'))
      used_spaces.append(coordinate)
      coordinate = map_parser.randomGetSpace(used_spaces)
      aihero_sprite_group.add(Hero(imagepaths=cfg.HERODKPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='DK'))
      used_spaces.append(coordinate)
      # -炸弹bomb
      bomb_sprite_group = pygame.sprite.Group()
      # -用于判断游戏胜利或者失败的flag
      is_win_flag = False
      # -主循环
      screen = pygame.display.set_mode(map_parser.screen_size)
      clock = pygame.time.Clock()
      while True:
          dt = clock.tick(cfg.FPS)
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  pygame.quit()
                  sys.exit(-1)
              # --↑↓←→键控制上下左右, 空格键丢炸弹
              elif event.type == pygame.KEYDOWN:
                  if event.key == pygame.K_UP:
                      ourhero.move('up')
                  elif event.key == pygame.K_DOWN:
                      ourhero.move('down')
                  elif event.key == pygame.K_LEFT:
                      ourhero.move('left')
                  elif event.key == pygame.K_RIGHT:
                      ourhero.move('right')
                  elif event.key == pygame.K_SPACE:
                      if ourhero.bomb_cooling_count <= 0:
                          bomb_sprite_group.add(ourhero.generateBomb(imagepath=cfg.BOMBPATH, digitalcolor=cfg.YELLOW, explode_imagepath=cfg.FIREPATH))
          screen.fill(cfg.WHITE)
          # --电脑Hero随机行动
          for hero in aihero_sprite_group:
              action, flag = hero.randomAction(dt)
              if flag and action == 'dropbomb':
                  bomb_sprite_group.add(hero.generateBomb(imagepath=cfg.BOMBPATH, digitalcolor=cfg.YELLOW, explode_imagepath=cfg.FIREPATH))
          # --吃到水果加生命值(只要是Hero, 都能加)
          ourhero.eatFruit(fruit_sprite_group)
          for hero in aihero_sprite_group:
              hero.eatFruit(fruit_sprite_group)
          # --游戏元素都绑定到屏幕上
          map_parser.draw(screen)
          for bomb in bomb_sprite_group:
              if not bomb.is_being:
                  bomb_sprite_group.remove(bomb)
              explode_area = bomb.draw(screen, dt, map_parser)
              if explode_area:
                  # --爆炸火焰范围内的Hero生命值将持续下降
                  if ourhero.coordinate in explode_area:
                      ourhero.health_value -= bomb.harm_value
                  for hero in aihero_sprite_group:
                      if hero.coordinate in explode_area:
                          hero.health_value -= bomb.harm_value
          fruit_sprite_group.draw(screen)
          for hero in aihero_sprite_group:
              hero.draw(screen, dt)
          ourhero.draw(screen, dt)
          # --左上角显示生命值
          pos_x = showText(screen, font, text=ourhero.hero_name+'(our):'+str(ourhero.health_value), color=cfg.YELLOW, position=[5, 5])
          for hero in aihero_sprite_group:
              pos_x, pos_y = pos_x+15, 5
              pos_x = showText(screen, font, text=hero.hero_name+'(ai):'+str(hero.health_value), color=cfg.YELLOW, position=[pos_x, pos_y])
          # --我方玩家生命值小于等于0/电脑方玩家生命值均小于等于0则判断游戏结束
          if ourhero.health_value <= 0:
              is_win_flag = False
              break
          for hero in aihero_sprite_group:
              if hero.health_value <= 0:
                  aihero_sprite_group.remove(hero)
          if len(aihero_sprite_group) == 0:
              is_win_flag = True
              break
          pygame.display.update()
          clock.tick(cfg.FPS)
      if is_win_flag:
          Interface(screen, cfg, mode='game_switch')
      else:
          break
  Interface(screen, cfg, mode='game_end')


'''run'''
if __name__ == '__main__':
  while True:
      main(cfg)

 

三、效果展示

1.游戏界面

都是有音乐背景的啦!

Python Pygame实战之超级炸弹人游戏的实现

2.游戏开始

Python Pygame实战之超级炸弹人游戏的实现

3.游戏结束

Python Pygame实战之超级炸弹人游戏的实现

以上就是Python Pygame实战之超级炸弹人游戏的实现的详细内容,更多关于Python Pygame炸弹人游戏的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/xy258009/article/details/123537120

延伸 · 阅读

精彩推荐