2022-06-03 19:41:50 +08:00
2022-05-10 17:19:18 +08:00
2022-05-27 11:26:28 +08:00
2022-06-03 19:41:50 +08:00
2022-04-04 14:31:20 +08:00
2021-10-25 16:05:32 +08:00
2022-05-27 11:26:28 +08:00
2022-04-04 00:57:25 +08:00
2022-04-06 16:53:11 +08:00
2022-05-27 15:23:52 +08:00
2021-10-25 16:05:32 +08:00

Python版植物大战僵尸

植物大战僵尸游戏的Python实现基于marblexu的项目进行创作,部分代码也整合自callmebg的项目

本项目为个人python语言学习的练习项目仅供个人学习和研究使用不得用于其他用途。如果这个游戏侵犯了版权请联系我删除

  • 已有的植物:向日葵,豌豆射手,坚果墙,寒冰射手,樱桃炸弹,双发射手,三线射手,大嘴花,小喷菇,土豆雷,地刺,胆小菇,倭瓜,火爆辣椒,阳光菇,寒冰菇,魅惑菇,火炬树桩,睡莲,杨桃,咖啡豆,海蘑菇,高坚果,缠绕水草,毁灭菇,墓碑吞噬者,大喷菇
  • 已有的僵尸:普通僵尸,旗帜僵尸,路障僵尸,铁桶僵尸,读报僵尸,橄榄球僵尸,鸭子救生圈僵尸,铁门僵尸,撑杆跳僵尸,冰车僵尸,潜水僵尸
  • 使用 JSON 文件记录关卡信息数据
  • 支持选择植物卡片
  • 支持白昼模式,夜晚模式,泳池模式,传送带模式和坚果保龄球模式
  • 支持背景音乐播放
  • 支持音效
  • 支持全屏模式
    • F键进入全屏模式,按U键恢复至窗口模式
  • 支持用小铲子移除植物
  • 支持分波生成僵尸
  • 支持“关卡进程”进度条显示
  • 夜晚模式支持墓碑以及从墓碑生成僵尸
    • 含有泳池的模式也支持在最后一波时从泳池中自动冒出僵尸

环境要求

  • Python >= 3.7,最好使用最新版
  • Python-Pygame >= 1.9,最好使用最新版

开始游戏

使用仓库源代码

先克隆仓库内容,再运行main.py

git clone https://github.com/wszqkzqk/pypvz.git
cd pypvz
python main.py

使用Windows可执行文件

下载pypvz.exe文件,双击运行即可

  • 可以在仓库的Releases页面中下载最新版(点击跳转)(推荐):
    • 使用GCC编译
    • 程序包含名称、版本等信息
    • 得到的验证最多(相对)
    • 并非每次提交都会更新,更新可能不及时
    • 0.7.25.0之后的部分版本被标注成了pre-release,实际上仍然为普通版本,按需下载即可
  • 也可以直接下载GitHub Workflow自动利用Nuitka构建的版本点击跳转(推荐):
    • 使用MSVC编译
    • 每次提交均会更新,保证更新及时
    • 未进行任何测试存在bug的概率高于前者
    • 可看作本软件的测试版
  • 还可以下载GitHub Workflow自动利用Pyinstaller构建的版本点击跳转
    • 在程序闪退时有报错窗口弹出
    • 程序性能较差,不推荐
    • 其他特性同GitHub Workflow自动利用Nuitka构建的版本
  • 均仅支持64位操作系统
  • 不依赖python、pygame等外部环境开箱即用

方法

  • 使用鼠标收集阳光,种植植物
  • 你可以通过更改source/constants.py中的START_LEVEL_NUM的数值来更改冒险模式的起始关卡,更改START_LITTLE_GAME_NUM的数值来更改小游戏的起始关卡:
    • 冒险模式:
      • 1和2白昼模式
      • 3夜晚模式
      • 4和5泳池模式
      • 6: 浓雾模式(暂时没有雾)
    • 小游戏模式:
      • 1坚果保龄球模式
      • 2传送带模式白天
      • 3传送带模式黑夜
      • 4传送带模式泳池
    • 目前暂时按照以上设定,未与原版相符
  • 可以通过修改source/constants.py中的GAME_RATE来调节游戏速度倍率
  • 注意:目前单文件发布版本不支持自定义调整关卡和速度倍率

Windows单文件封装

使用Nuitka进行构建

编译依赖:

  • Python >= 3.7,最好使用最新版
  • Python-Pygame >= 1.9,最好使用最新版
  • Nuitka
  • MinGW-w64或其他C编译器
  • ccache
  • depends
  • python-zstandard(可选)

在编译环境安装不全时Nuitka可以自动安装MinGW-w64、ccache和depends

  • 由于目前Nuitka打包尚存bug无法自动封装pygame中用来解码音频的相关.dll文件,因此需要手动在编译命令中添加
    • 对于mp3编码,需要添加libmpg123-0.dll
    • 对于vorbis编码,需要添加libogg-0.dlllibvorbis-0.dlllibvorbisfile-3.dll
    • 对于opus编码,需要添加libogg-0.dlllibopus-0.dlllibopusfile-0.dll
  • 以添加opusvorbis编码的背景音乐支持为例,编译需执行以下命令:
git clone https://github.com/wszqkzqk/pypvz.git
cd pypvz
nuitka --mingw64 --standalone --onefile --show-progress --show-memory --output-dir=out --windows-icon-from-ico=pypvz.ico --include-data-dir=resources=resources --include-data-file=C:\Users\17265\AppData\Local\Programs\Python\Python310\Lib\site-packages\pygame\libogg-0.dll=libogg-0.dll --include-data-file=C:\Users\17265\AppData\Local\Programs\Python\Python310\Lib\site-packages\pygame\libopus-0.dll=libopus-0.dll --include-data-file=C:\Users\17265\AppData\Local\Programs\Python\Python310\Lib\site-packages\pygame\libopusfile-0.dll=libopusfile-0.dll --include-data-file=C:\Users\17265\AppData\Local\Programs\Python\Python310\Lib\site-packages\pygame\libvorbisfile-3.dll=libvorbisfile-3.dll --include-data-file=C:\Users\17265\AppData\Local\Programs\Python\Python310\Lib\site-packages\pygame\libvorbis-0.dll=libvorbis-0.dll --windows-disable-console --windows-product-name=pypvz --windows-company-name=null --windows-file-description="pypvz" --windows-product-version=0.6.9.0 main.py
  • 其中C:\Users\17265\AppData\Local\Programs\Python\Python310\Lib\site-packages\pygame\xxx.dll应当替换为xxx.dll实际所在路径
  • 由于仅复制了opusvorbis的解码器故要求所有背景音乐都要以opus或vorbis编码
  • --windows-product-version=表示版本号信息,所跟内容格式必须为x.x.x.x

可执行文件生成路径为./out/main.exe

使用pyinstaller进行构建

使用Github Workflow进行自动构建

已知bug

以下问题囿于个人目前的能力与精力,没有修复:

  • 冷冻的僵尸未用蓝色滤镜标识
    • 这个想不到很好的实现方法,可能会想一种替代方案
  • 魅惑的僵尸未用红色滤镜标识
    • 这个可能会作为一种“特性”

欢迎提供Pull requests或修复方法建议也欢迎在这里反馈新的bug()

画大饼计划(不保证实施)

  • 增加关卡进程进度条
    • 该功能自0.5.4已实现
  • 增加保存数据文件以存储用户进度的功能
  • 增加调整音量的功能
    • pg.mixer.music.set_volume()
    • 可以用音量+音量-按钮实现
    • 注意字体颜色渲染
  • 关卡开始前增加预览界面
  • 增加解锁与选关功能
    • 目前的设想与原版不同,在完成两轮冒险模式(初始冒险模式 + 戴夫选关的冒险模式)后可以自主选关~~(当然现在只是画饼)~~
  • 更改僵尸生成方式
    • 使僵尸生成更随机化由JSON记录改为随机数生成
      • 该功能自0.5.0已经基本实现
      • 使用原版设定每面旗帜出10波僵尸9个小波1个大波
      • 采用手机版设定无尽模式没有红眼计数和变速设定每波红眼权重为1000平均分布
    • 增加僵尸死亡后有概率掉落奖励的机制
  • 增加更多植物、僵尸类型与游戏功能、模式,尽量符合原版基本设计
  • 细分伤害种类
    • 实体
      • 一般子弹实体——普通伤害且无特殊效果
        • 豌豆
          • 已实现
        • 孢子
          • 已实现
        • 星星
          • 已实现
        • 尖刺
      • 特殊子弹实体——非普通伤害或有特殊效果
        • 冰豌豆(减速)
          • 已实现
        • 火豌豆2倍伤害、带有1x1溅射
          • 已实现
      • 投掷
        • 西瓜4倍伤害带有3x3溅射
        • 冰瓜4倍伤害带有3x3溅射伤害与减速
        • 玉米粒
        • 黄油2倍伤害定格
        • 卷心菜2倍伤害
      • 烟雾
        • 线形范围烟雾
          • 自0.7.10.0起已实现
        • 圆形范围烟雾
      • 碾压
        • 倭瓜
          • 已实现
    • 爆炸
      • 一般爆炸
        • 樱桃炸弹、爆炸坚果与玉米加农炮炮弹
          • 已实现
        • 毁灭菇
          • 自0.7.6.0已实现
      • 火焰爆炸
        • 火爆辣椒
          • 已实现
      • 非灰烬类爆炸
        • 土豆雷
          • 已实现
    • 从地面刺伤
      • 已实现
    • 缠绕与拖拽
      • 自0.7.5.0已实现
      • 与原版有所区别,设定上秒杀任意僵尸
    • 吞噬
      • 已实现
      • 与原版有所区别,设定上秒杀任意僵尸
    • 特殊
      • 魅惑
        • 已实现
      • 移除铁制防具
      • 全场伤害与冰冻
        • 已实现
      • 撞击
        • 坚果保龄球撞击
          • 已实现
        • 巨型坚果保龄球撞击
      • 吹走
  • 增加部分音效
    • 如爆炸、打击等
    • 自0.6.9已部分实现

截屏

截屏1 截屏2 截屏3 截屏4 截屏5 截屏6 截屏7 截屏8 截屏9 截屏10 截屏11 截屏12 截屏13 截屏14 截屏15

Description
植物大战僵尸的开源Python实现 (An open-source python implementation of Plants vs. Zombies)
https://wszqkzqk.github.io/2022/04/05/pypvz/ Readme 42 MiB
Languages
Python 100%