植物大战僵尸如何解锁全部植物

忘机山人

发布于259天前
博客图片修整中,看不了可以先搜索公众号“忘机山人”看。

https://appstore.lazycat.cloud/#/shop/detail/cloud.lazycat.app.pvzge


### 一、背景起因

在《植物大战僵尸》这类游戏中,金币、钻石、植物解锁等信息,其实都存储在本地的存档文件里。上一次我们已经通过修改存档文件,成功实现了无限金币和钻石的解锁。当时的关键发现是:**导出的存档其实就是一个 JSON 文件**。

![b9b43544e1194fba9248ee95dee1d456.png](https://dl.playground.lazycat.cloud/guidelines/459/73e69e83-1514-434a-b15e-bf8498532475.png "b9b43544e1194fba9248ee95dee1d456.png")

这意味着存档本质上是一种结构化数据,可以直接用 Python 等编程语言进行解析和修改。只要找到相应的字段,就能批量调整游戏进度。

在进一步探索时,我注意到存档中有一个字段叫做 `plantProps`。从命名上看,`plant` 代表植物,`props` 代表属性。结合游戏机制,我猜测这里存储的就是每个植物的状态信息,比如是否解锁、解锁进度、是否拥有某些皮肤等等。

于是我决定写一段脚本,来验证并修改其中的进度字段,看看是否能一键解锁所有植物。

---

### 二、存档结构的分析

在导出的 JSON 文件中,我们可以看到类似这样的片段:

```json
{
  "plantProps": {
    "1": {
      "progress": 0,
      "level": 1,
      "otherProp": "xxx"
    },
    "2": {
      "progress": 1,
      "level": 1,
      "otherProp": "yyy"
    }
  }
}
```

从数据上可以推断:

* 每个植物都有一个独立的键(比如 `1`、`2`),可能代表植物的 ID。
* 每个植物对应一个字典,里面保存了它的属性。
* 其中 `"progress"` 字段就是解锁进度,数值不同代表不同状态。

根据测试结果,大致可以推测:

* `0` → 未解锁
* `1` → 解锁中/部分解锁
* `2` → 完全解锁

这就印证了我的猜想:只要把所有 `"progress"` 改成 `2`,就能解锁全部植物。

---

![image.png](https://dl.playground.lazycat.cloud/guidelines/459/dac3de2c-116c-4c24-915b-1f352587910a.png "image.png")
### 三、Python 脚本的设计

脚本的目标非常明确:

1. 读取原始存档 JSON。
2. 遍历 `plantProps`,找到所有 `"progress"` 字段。
3. 将其统一修改为 `2`。
4. 保存为新的存档文件,避免直接覆盖原始数据。

完整代码如下:

```python
import json

def main():
    input_file = "~/Downloads/save.json"   # 原始存档文件
    output_file = "save_mod.json"                  # 修改后的存档文件

    # 1. 读取 JSON
    with open(input_file, "r", encoding="utf-8") as f:
        data = json.load(f)

    # 2. 遍历并修改 progress
    if "plantProps" in data and isinstance(data["plantProps"], dict):
        for plant, props in data["plantProps"].items():
            if isinstance(props, dict) and "progress" in props:
                props["progress"] = 2

    # 3. 保存修改结果
    with open(output_file, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

    # 4. 完成提示
    print(f"plantProps 下所有 progress 已改为 2,结果保存在 {output_file}")

if __name__ == "__main__":
    main()
```

这个脚本很短,但涵盖了完整的存档解锁逻辑。接下来我会逐步拆解。

---

### 四、代码逐步解析

#### 1. 文件输入输出

```python
input_file = "~/Downloads/save.json"   # 原始存档
output_file = "save_mod.json"                  # 修改后的存档
```

* `input_file`:指向游戏导出的存档文件。
* `output_file`:修改后的文件存储位置,避免覆盖原文件。

养成好习惯,**不要直接修改原始存档**,否则一旦出错就没法恢复。

---

#### 2. 读取 JSON

```python
with open(input_file, "r", encoding="utf-8") as f:
    data = json.load(f)
```

这里使用 Python 内置的 `json` 模块:

* `json.load(f)` 会把 JSON 内容转换为 Python 字典。
* 从这一刻开始,存档就变成了我们可以自由操作的数据结构。

---

#### 3. 遍历并修改数据

```python
if "plantProps" in data and isinstance(data["plantProps"], dict):
    for plant, props in data["plantProps"].items():
        if isinstance(props, dict) and "progress" in props:
            props["progress"] = 2
```

* 先确认 `plantProps` 存在并且是字典。
* 遍历其中的所有植物,每个植物都有自己的属性字典。
* 如果属性字典中存在 `"progress"`,就直接改为 `2`。

这一步就是解锁的核心操作。

---

#### 4. 保存结果

```python
with open(output_file, "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)
```

* `json.dump()` 把修改过的字典重新写回 JSON 文件。
* `indent=2`:让输出文件缩进更清晰,方便阅读。
* `ensure_ascii=False`:保证中文不会被转义。

---

#### 5. 完成提示

```python
print(f"plantProps 下所有 progress 已改为 2,结果保存在 {output_file}")
```

程序执行完成后,会在命令行输出提示,确认修改成功。

---

### 五、实验验证与结果

实际测试时,我把修改后的 `save_mod.json` 覆盖回游戏存档,再次启动游戏,结果发现:

* 原本还在锁定的植物都已经变为解锁状态。
* 游戏内的解锁动画和进度条全部跳过,直接可以使用。

这说明 `"progress"` 字段确实是控制植物解锁进度的关键变量。


![e8a2bd98a9155301572516258e5f10ab.png](https://dl.playground.lazycat.cloud/guidelines/459/6ce61ab6-26ef-4e7c-b9e7-769d963485cc.png "e8a2bd98a9155301572516258e5f10ab.png")

评论

0

暂无评论

说点什么呢~
收藏
0
0
0