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

2022-07-16,,,,

前言

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

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

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

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

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

一、环境安装

1.素材(图片)

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.游戏界面

都是有音乐背景的啦!

2.游戏开始

3.游戏结束

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

《Python Pygame实战之超级炸弹人游戏的实现.doc》

下载本文的Word格式文档,以方便收藏与打印。