基于Python实现经典植物大战僵尸游戏
更新时间:2022年05月12日 08:18:16 作者:梦执.py
这篇文章主要介绍了如何利用Python实现植物大战僵尸游戏,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
游戏截图
动态演示
源码分享
state/tool.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | 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
1 2 3 4 5 6 7 8 9 10 11 12 | 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
1 2 3 4 5 6 | import pygame as pg from source.main import main if __name__ = = '__main__' : main() pg.quit() |
到此这篇关于基于Python实现经典植物大战僵尸游戏的文章就介绍到这了,更多相关Python植物大战僵尸内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
基于pycharm的beautifulsoup4库使用方法教程
这篇文章主要介绍了基于pycharm的beautifulsoup4库使用方法教程,对正在学习或者工作的你有一点的参考价值,需要的朋友可以参加一下2022-01-01Python使用Matplotlib模块的pie()函数实现绘制饼形图
这篇文章主要为大家详细介绍了 Python 如何使用 Matplotlib 模块的pie()函数绘制饼形图,文中有详细的代码讲解,对大家学习或工作有一定的帮助,感兴趣的可以了解一下2023-11-11
最新评论