首頁 > 軟體

Python Pygame實戰之超級炸彈人遊戲的實現

2022-03-17 10:00:44

前言

如今的玩家們在無聊的時候會玩些什麼遊戲呢?

王者還是吃雞是最多的選擇。但在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炸彈人遊戲的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com