溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python?Pygame如何實(shí)現(xiàn)超級(jí)炸彈人游戲

發(fā)布時(shí)間:2022-03-17 10:07:04 來源:億速云 閱讀:349 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)Python Pygame如何實(shí)現(xiàn)超級(jí)炸彈人游戲的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

    一、環(huán)境安裝

    1.素材(圖片)

    Python?Pygame如何實(shí)現(xiàn)超級(jí)炸彈人游戲

    Python?Pygame如何實(shí)現(xiàn)超級(jí)炸彈人游戲

    2.環(huán)境安裝

    本文是由Pygame寫的小游戲。

    涉及運(yùn)行環(huán)境:Python3.7、Pycharm社區(qū)版、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']]
    '''爆炸和發(fā)射路徑'''
    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')
        # 游戲主循環(huán)
        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
            # -主循環(huán)
            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隨機(jī)行動(dòng)
                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:
                        # --爆炸火焰范圍內(nèi)的Hero生命值將持續(xù)下降
                        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則判斷游戲結(jié)束
                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如何實(shí)現(xiàn)超級(jí)炸彈人游戲

    2.游戲開始

    Python?Pygame如何實(shí)現(xiàn)超級(jí)炸彈人游戲

    3.游戲結(jié)束

    Python?Pygame如何實(shí)現(xiàn)超級(jí)炸彈人游戲

    感謝各位的閱讀!關(guān)于“Python Pygame如何實(shí)現(xiàn)超級(jí)炸彈人游戲”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI