Python版【植物大战僵尸 +源码】_python植物大战僵尸
文章目录
-
- 粉丝 专属:
- 写在前面:
- 功能实现
- 环境要求
- 怎么玩
- 个性化定义
- 项目演示:
- 源码分享
-
- Map地图:
- Menubar.py
- 主菜单
- 主函数:
- 项目开源地址
粉丝 专属:
给大家分享一个非常不错的秋招神器—万马优才,扫码登录——》填写预期薪资、城市、岗位,帮你快速匹配,最近上线了AI面试、简历优化等黑科技,等你来体验!
写在前面:
今天给大家推荐一个Gtihub开源项目:PythonPlantsVsZombies,翻译成中就是植物大战僵尸。
《植物大战僵尸》是一款极富策略性的小游戏。可怕的僵尸即将入侵,每种僵尸都有不同的特点,例如铁桶僵尸拥有极强的抗击打能力,矿工僵尸可以挖地道绕过种植在土壤表面的植物等。玩家防御僵尸的方式就是栽种植物。49种植物每种都有不同的功能,例如樱桃炸弹可以和周围一定范围内的所有僵尸同归于尽,而食人花可以吃掉最靠近自己的一只僵尸。玩家可以针对不同僵尸的弱点来合理地种植植物,这也是胜利的诀窍。游戏根据玩法不同分为五种游戏模式:冒险模式、迷你模式、解谜模式、生存模式、禅境花园。加之黑夜、屋顶、浓雾以及泳池之类的障碍增加了其挑战性。该游戏近乎永无止境。
功能实现
-
支持的植物:向日葵、豌豆射手、胡桃、雪豌豆射手、樱桃炸弹、三豌豆射手、大嘴花、puffshroom、马铃薯胺、穗状杂草、南瓜、胆小菇、墨西哥胡椒、阳光菇、冰川菇、催眠蘑菇。
-
支持僵尸:普通僵尸,旗帜僵尸,路障僵尸,铁桶僵尸,报纸僵尸。
-
支持在关卡开始时选择植物卡片。
-
支持白天级别、夜间级别、移动卡选择级别和胡桃保龄球级别。
环境要求
-
1、python3.7
注意: Python3.7是最佳运行环境,但是不是强制性要求。对于Linux: 如果你的 Linux 有预装的 Python3+ 就可以运行了。LINUX Mint 操作系统直接升级到 Python 3.7 有可能导致系统自带的 python 版本无法执行。 -
2、Python-Pygame 1.9
怎么玩
使用鼠标收集阳光,选择植物卡片并播种植物
您可以通过更改 source/constants.py 中的START_LEVEL_NUM值来设置起始级别
级别 1 和 2:天级别
第 3 级:夜间级别
第 4 级:移动卡片选择级别
5级:墙果保龄球级别
个性化定义
游戏的关卡数据,存储在json文件里的。具体目录:PythonPlantsVsZombies-master\\source\\data。我们可以进行自定义配置,例如僵尸的位置和时间,背景信息。
项目演示:
源码分享
Map地图:
__author__ = \'marble_xu\'import randomimport pygame as pgfrom .. import toolfrom .. import constants as cclass Map(): def __init__(self, width, height): self.width = width self.height = height self.map = [[0 for x in range(self.width)] for y in range(self.height)] def isValid(self, map_x, map_y): if (map_x < 0 or map_x >= self.width or map_y < 0 or map_y >= self.height): return False return True def isMovable(self, map_x, map_y): return (self.map[map_y][map_x] == c.MAP_EMPTY) def getMapIndex(self, x, y): x -= c.MAP_OFFSET_X y -= c.MAP_OFFSET_Y return (x // c.GRID_X_SIZE, y // c.GRID_Y_SIZE) def getMapGridPos(self, map_x, map_y): return (map_x * c.GRID_X_SIZE + c.GRID_X_SIZE//2 + c.MAP_OFFSET_X, map_y * c.GRID_Y_SIZE + c.GRID_Y_SIZE//5 * 3 + c.MAP_OFFSET_Y) def setMapGridType(self, map_x, map_y, type): self.map[map_y][map_x] = type def getRandomMapIndex(self): map_x = random.randint(0, self.width-1) map_y = random.randint(0, self.height-1) return (map_x, map_y) def showPlant(self, x, y): pos = None map_x, map_y = self.getMapIndex(x, y) if self.isValid(map_x, map_y) and self.isMovable(map_x, map_y): pos = self.getMapGridPos(map_x, map_y) return pos
Menubar.py
__author__ = \'marble_xu\'import randomimport pygame as pgfrom .. import toolfrom .. import constants as cPANEL_Y_START = 87PANEL_X_START = 22PANEL_Y_INTERNAL = 74PANEL_X_INTERNAL = 53CARD_LIST_NUM = 8card_name_list = [c.CARD_SUNFLOWER, c.CARD_PEASHOOTER, c.CARD_SNOWPEASHOOTER, c.CARD_WALLNUT, c.CARD_CHERRYBOMB, c.CARD_THREEPEASHOOTER, c.CARD_REPEATERPEA, c.CARD_CHOMPER, c.CARD_PUFFSHROOM, c.CARD_POTATOMINE, c.CARD_SQUASH, c.CARD_SPIKEWEED, c.CARD_JALAPENO, c.CARD_SCAREDYSHROOM, c.CARD_SUNSHROOM, c.CARD_ICESHROOM, c.CARD_HYPNOSHROOM, c.CARD_WALLNUT, c.CARD_REDWALLNUT]plant_name_list = [c.SUNFLOWER, c.PEASHOOTER, c.SNOWPEASHOOTER, c.WALLNUT, c.CHERRYBOMB, c.THREEPEASHOOTER, c.REPEATERPEA, c.CHOMPER, c.PUFFSHROOM, c.POTATOMINE, c.SQUASH, c.SPIKEWEED, c.JALAPENO, c.SCAREDYSHROOM, c.SUNSHROOM, c.ICESHROOM, c.HYPNOSHROOM, c.WALLNUTBOWLING, c.REDWALLNUTBOWLING]plant_sun_list = [50, 100, 175, 50, 150, 325, 200, 150, 0, 25, 50, 100, 125, 25, 25, 75, 75, 0, 0]plant_frozen_time_list = [7500, 7500, 7500, 30000, 50000, 7500, 7500, 7500, 7500, 30000, 30000, 7500, 50000, 7500, 7500, 50000, 30000, 0, 0]all_card_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]def getSunValueImage(sun_value): font = pg.font.SysFont(None, 22) width = 32 msg_image = font.render(str(sun_value), True, c.NAVYBLUE, c.LIGHTYELLOW) msg_rect = msg_image.get_rect() msg_w = msg_rect.width image = pg.Surface([width, 17]) x