用python实现植物大战僵尸(游戏截图+动态演示+源码分享)

04-18 1276阅读

大家好,我是梦执,对梦执着。希望能和大家共同进步!

下面给大家带来python实现植物大战僵尸的的源码分享,只含有冒险模式。

 

截图+动态演示+源码分享

  • 游戏截图
  • 动态演示
  • 源码分享
    • state/tool.py
    • state/constants.py
    • state/main.py
    • 主执行文件main.py

     

    游戏截图

    用python实现植物大战僵尸(游戏截图+动态演示+源码分享)

    用python实现植物大战僵尸(游戏截图+动态演示+源码分享)
    用python实现植物大战僵尸(游戏截图+动态演示+源码分享)

    动态演示

    用python实现植物大战僵尸(游戏截图+动态演示+源码分享)

    源码分享

    state/tool.py

    import os
    import json
    from abc import abstractmethod
    import pygame as pg
    from . import constants as c
    class State():
        def __init__(self):
            self.start_time = 0.0
            self.current_time = 0.0
            self.done = False
            self.next = None
            self.persist = {}
        
        @abstractmethod
        def startup(self, current_time, persist):
            '''abstract method'''
        def cleanup(self):
            self.done = False
            return self.persist
        
        @abstractmethod
        def update(self, surface, keys, current_time):
            '''abstract method'''
    class Control():
        def __init__(self):
            self.screen = pg.display.get_surface()
            self.done = False
            self.clock = pg.time.Clock()
            self.fps = 60
            self.keys = pg.key.get_pressed()
            self.mouse_pos = None
            self.mouse_click = [False, False]  # value:[left mouse click, right mouse click]
            self.current_time = 0.0
            self.state_dict = {}
            self.state_name = None
            self.state = None
            self.game_info = {c.CURRENT_TIME:0.0,
                              c.LEVEL_NUM:c.START_LEVEL_NUM}
     
        def setup_states(self, state_dict, start_state):
            self.state_dict = state_dict
            self.state_name = start_state
            self.state = self.state_dict[self.state_name]
            self.state.startup(self.current_time, self.game_info)
        def update(self):
            self.current_time = pg.time.get_ticks()
            if self.state.done:
                self.flip_state()
            self.state.update(self.screen, self.current_time, self.mouse_pos, self.mouse_click)
            self.mouse_pos = None
            self.mouse_click[0] = False
            self.mouse_click[1] = False
        def flip_state(self):
            previous, self.state_name = self.state_name, self.state.next
            persist = self.state.cleanup()
            self.state = self.state_dict[self.state_name]
            self.state.startup(self.current_time, persist)
        def event_loop(self):
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    self.done = True
                elif event.type == pg.KEYDOWN:
                    self.keys = pg.key.get_pressed()
                elif event.type == pg.KEYUP:
                    self.keys = pg.key.get_pressed()
                elif event.type == pg.MOUSEBUTTONDOWN:
                    self.mouse_pos = pg.mouse.get_pos()
                    self.mouse_click[0], _, self.mouse_click[1] = pg.mouse.get_pressed()
                    print('pos:', self.mouse_pos, ' mouse:', self.mouse_click)
        def main(self):
            while not self.done:
                self.event_loop()
                self.update()
                pg.display.update()
                self.clock.tick(self.fps)
            print('game over')
    def get_image(sheet, x, y, width, height, colorkey=c.BLACK, scale=1):
            image = pg.Surface([width, height])
            rect = image.get_rect()
            image.blit(sheet, (0, 0), (x, y, width, height))
            image.set_colorkey(colorkey)
            image = pg.transform.scale(image,
                                       (int(rect.width*scale),
                                        int(rect.height*scale)))
            return image
    def load_image_frames(directory, image_name, colorkey, accept):
        frame_list = []
        tmp = {}
        # image_name is "Peashooter", pic name is 'Peashooter_1', get the index 1
        index_start = len(image_name) + 1 
        frame_num = 0;
        for pic in os.listdir(directory):
            name, ext = os.path.splitext(pic)
            if ext.lower() in accept:
                index = int(name[index_start:])
                img = pg.image.load(os.path.join(directory, pic))
                if img.get_alpha():
                    img = img.convert_alpha()
                else:
                    img = img.convert()
                    img.set_colorkey(colorkey)
                tmp[index]= img
                frame_num += 1
        for i in range(frame_num):
            frame_list.append(tmp[i])
        return frame_list
    def load_all_gfx(directory, colorkey=c.WHITE, accept=('.png', '.jpg', '.bmp', '.gif')):
        graphics = {}
        for name1 in os.listdir(directory):
            # subfolders under the folder resources\graphics
            dir1 = os.path.join(directory, name1)
            if os.path.isdir(dir1):
                for name2 in os.listdir(dir1):
                    dir2 = os.path.join(dir1, name2)
                    if os.path.isdir(dir2):
                    # e.g. subfolders under the folder resources\graphics\Zombies
                        for name3 in os.listdir(dir2):
                            dir3 = os.path.join(dir2, name3)
                            # e.g. subfolders or pics under the folder resources\graphics\Zombies\ConeheadZombie
                            if os.path.isdir(dir3):
                                # e.g. it's the folder resources\graphics\Zombies\ConeheadZombie\ConeheadZombieAttack
                                image_name, _ = os.path.splitext(name3)
                                graphics[image_name] = load_image_frames(dir3, image_name, colorkey, accept)
                            else:
                                # e.g. pics under the folder resources\graphics\Plants\Peashooter
                                image_name, _ = os.path.splitext(name2)
                                graphics[image_name] = load_image_frames(dir2, image_name, colorkey, accept)
                                break
                    else:
                    # e.g. pics under the folder resources\graphics\Screen
                        name, ext = os.path.splitext(name2)
                        if ext.lower() in accept:
                            img = pg.image.load(dir2)
                            if img.get_alpha():
                                img = img.convert_alpha()
                            else:
                                img = img.convert()
                                img.set_colorkey(colorkey)
                            graphics[name] = img
        return graphics
    def loadZombieImageRect():
        file_path = os.path.join('source', 'data', 'entity', 'zombie.json')
        f = open(file_path)
        data = json.load(f)
        f.close()
        return data[c.ZOMBIE_IMAGE_RECT]
    def loadPlantImageRect():
        file_path = os.path.join('source', 'data', 'entity', 'plant.json')
        f = open(file_path)
        data = json.load(f)
        f.close()
        return data[c.PLANT_IMAGE_RECT]
    pg.init()
    pg.display.set_caption(c.ORIGINAL_CAPTION)
    SCREEN = pg.display.set_mode(c.SCREEN_SIZE)
    GFX = load_all_gfx(os.path.join("resources","graphics"))
    ZOMBIE_RECT = loadZombieImageRect()
    PLANT_RECT = loadPlantImageRect()
    

    state/constants.py

    START_LEVEL_NUM = 1
    ORIGINAL_CAPTION = 'Plant VS Zombies Game'
    SCREEN_WIDTH = 800
    SCREEN_HEIGHT = 600
    SCREEN_SIZE = (SCREEN_WIDTH, SCREEN_HEIGHT)
    GRID_X_LEN = 9
    GRID_Y_LEN = 5
    GRID_X_SIZE = 80
    GRID_Y_SIZE = 100
    WHITE        = (255, 255, 255)
    NAVYBLUE     = ( 60,  60, 100)
    SKY_BLUE     = ( 39, 145, 251)
    BLACK        = (  0,   0,   0)
    LIGHTYELLOW  = (234, 233, 171)
    RED          = (255,   0,   0)
    PURPLE       = (255,   0, 255)
    GOLD         = (255, 215,   0)
    GREEN        = (  0, 255,   0)
    SIZE_MULTIPLIER = 1.3
    #GAME INFO DICTIONARY KEYS
    CURRENT_TIME = 'current time'
    LEVEL_NUM = 'level num'
    #STATES FOR ENTIRE GAME
    MAIN_MENU = 'main menu'
    LOAD_SCREEN = 'load screen'
    GAME_LOSE = 'game los'
    GAME_VICTORY = 'game victory'
    LEVEL = 'level'
    MAIN_MENU_IMAGE = 'MainMenu'
    OPTION_ADVENTURE = 'Adventure'
    GAME_LOOSE_IMAGE = 'GameLoose'
    GAME_VICTORY_IMAGE = 'GameVictory'
    #MAP COMPONENTS
    BACKGROUND_NAME = 'Background'
    BACKGROUND_TYPE = 'background_type'
    INIT_SUN_NAME = 'init_sun_value'
    ZOMBIE_LIST = 'zombie_list'
    MAP_EMPTY = 0
    MAP_EXIST = 1
    BACKGROUND_OFFSET_X = 220
    MAP_OFFSET_X = 35
    MAP_OFFSET_Y = 100
    #MENUBAR
    CHOOSEBAR_TYPE = 'choosebar_type'
    CHOOSEBAR_STATIC = 0
    CHOOSEBAR_MOVE = 1
    CHOSSEBAR_BOWLING = 2
    MENUBAR_BACKGROUND = 'ChooserBackground'
    MOVEBAR_BACKGROUND = 'MoveBackground'
    PANEL_BACKGROUND = 'PanelBackground'
    START_BUTTON = 'StartButton'
    CARD_POOL = 'card_pool'
    MOVEBAR_CARD_FRESH_TIME = 6000
    CARD_MOVE_TIME = 60
    #PLANT INFO
    PLANT_IMAGE_RECT = 'plant_image_rect'
    CAR = 'car'
    SUN = 'Sun'
    SUNFLOWER = 'SunFlower'
    PEASHOOTER = 'Peashooter'
    SNOWPEASHOOTER = 'SnowPea'
    WALLNUT = 'WallNut'
    CHERRYBOMB = 'CherryBomb'
    THREEPEASHOOTER = 'Threepeater'
    REPEATERPEA = 'RepeaterPea'
    CHOMPER = 'Chomper'
    CHERRY_BOOM_IMAGE = 'Boom'
    PUFFSHROOM = 'PuffShroom'
    POTATOMINE = 'PotatoMine'
    SQUASH = 'Squash'
    SPIKEWEED = 'Spikeweed'
    JALAPENO = 'Jalapeno'
    SCAREDYSHROOM = 'ScaredyShroom'
    SUNSHROOM = 'SunShroom'
    ICESHROOM = 'IceShroom'
    HYPNOSHROOM = 'HypnoShroom'
    WALLNUTBOWLING = 'WallNutBowling'
    REDWALLNUTBOWLING = 'RedWallNutBowling'
    PLANT_HEALTH = 5
    WALLNUT_HEALTH = 30
    WALLNUT_CRACKED1_HEALTH = 20
    WALLNUT_CRACKED2_HEALTH = 10
    WALLNUT_BOWLING_DAMAGE = 10
    PRODUCE_SUN_INTERVAL = 7000
    FLOWER_SUN_INTERVAL = 22000
    SUN_LIVE_TIME = 7000
    SUN_VALUE = 25
    ICE_SLOW_TIME = 2000
    FREEZE_TIME = 7500
    ICETRAP = 'IceTrap'
    #PLANT CARD INFO
    CARD_SUNFLOWER = 'card_sunflower'
    CARD_PEASHOOTER = 'card_peashooter'
    CARD_SNOWPEASHOOTER = 'card_snowpea'
    CARD_WALLNUT = 'card_wallnut'
    CARD_CHERRYBOMB = 'card_cherrybomb'
    CARD_THREEPEASHOOTER = 'card_threepeashooter'
    CARD_REPEATERPEA = 'card_repeaterpea'
    CARD_CHOMPER = 'card_chomper'
    CARD_PUFFSHROOM = 'card_puffshroom'
    CARD_POTATOMINE = 'card_potatomine'
    CARD_SQUASH = 'card_squash'
    CARD_SPIKEWEED = 'card_spikeweed'
    CARD_JALAPENO = 'card_jalapeno'
    CARD_SCAREDYSHROOM = 'card_scaredyshroom'
    CARD_SUNSHROOM = 'card_sunshroom'
    CARD_ICESHROOM = 'card_iceshroom'
    CARD_HYPNOSHROOM = 'card_hypnoshroom'
    CARD_REDWALLNUT = 'card_redwallnut'
    #BULLET INFO
    BULLET_PEA = 'PeaNormal'
    BULLET_PEA_ICE = 'PeaIce'
    BULLET_MUSHROOM = 'BulletMushRoom'
    BULLET_DAMAGE_NORMAL = 1
    #ZOMBIE INFO
    ZOMBIE_IMAGE_RECT = 'zombie_image_rect'
    ZOMBIE_HEAD = 'ZombieHead'
    NORMAL_ZOMBIE = 'Zombie'
    CONEHEAD_ZOMBIE = 'ConeheadZombie'
    BUCKETHEAD_ZOMBIE = 'BucketheadZombie'
    FLAG_ZOMBIE = 'FlagZombie'
    NEWSPAPER_ZOMBIE = 'NewspaperZombie'
    BOOMDIE = 'BoomDie'
    LOSTHEAD_HEALTH = 5
    NORMAL_HEALTH = 10
    FLAG_HEALTH = 15
    CONEHEAD_HEALTH = 20
    BUCKETHEAD_HEALTH = 30
    NEWSPAPER_HEALTH = 15
    ATTACK_INTERVAL = 1000
    ZOMBIE_WALK_INTERVAL = 70
    ZOMBIE_START_X = SCREEN_WIDTH + 50
    #STATE
    IDLE = 'idle'
    FLY = 'fly'
    EXPLODE = 'explode'
    ATTACK = 'attack'
    ATTACKED = 'attacked'
    DIGEST = 'digest'
    WALK = 'walk'
    DIE = 'die'
    CRY = 'cry'
    FREEZE = 'freeze'
    SLEEP = 'sleep'
    #LEVEL STATE
    CHOOSE = 'choose'
    PLAY = 'play'
    #BACKGROUND
    BACKGROUND_DAY = 0
    BACKGROUND_NIGHT = 1
    

    state/main.py

    from . import tool
    from . import constants as c
    from .state import mainmenu, screen, level
    def main():
        game = tool.Control()
        state_dict = {c.MAIN_MENU: mainmenu.Menu(),
                      c.GAME_VICTORY: screen.GameVictoryScreen(),
                      c.GAME_LOSE: screen.GameLoseScreen(),
                      c.LEVEL: level.Level()}
        game.setup_states(state_dict, c.MAIN_MENU)
        game.main()
    

    主执行文件main.py

    import pygame as pg
    from source.main import main
    if __name__=='__main__':
        main()
        pg.quit()
    

    还有植物和僵尸的源码,实在太多了,需要的小伙伴直接私聊我领取!!

     

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]