植物大战僵尸 进制转换 使用JAVA 更改关卡 和金钱

本文详细介绍了如何通过进制转换修改植物大战僵尸游戏的关卡和金钱数据。讲解了二进制、八进制、十六进制与十进制之间的转换方法,并提供了Java代码示例。同时,分享了查找和修改游戏数据的步骤,包括使用十六进制编辑器定位和替换特定关卡与金钱的数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

植物大战僵尸作为一个集趣味性和益智性为一身的经典塔防类游戏,在推出之初便收获了广泛的关注及好评。推出十年间,不断有围绕该游戏不同的攻略,不同的二创、三创作品。使得人们对该游戏的热度不减。然而,作为经典单机游戏,它的有趣性不仅体现在于其本身画面设计精美、游戏数据设计合理,还在与其有强大的可再修改性。通过修改当中完全开源的内容,玩家可以自行升高或降低难度,自行调节关卡进度,自行查看场地数据,达到了十足的可玩性。本文从最基本的关卡和金币修改出发,探究植物大战僵尸游戏中蕴藏的数据原理。


一、进制转换

不同进制之间的转换在编程中经常会用到,尤其是C语言。

将二进制、八进制、十六进制转换为十进制

二进制、八进制和十六进制向十进制转换都非常容易,就是“按权相加”。所谓“权”,也即“位权”。

假设当前数字是N进制,那么:

对于整数部分,从右往左看,第i位的位权等于Ni-1

对于小数部分,恰好相反,要从左往右看,第j位的位权为N-j。

更加通俗的理解是,假设一个多位数(由多个数字组成的数)某位上的数字是1,那么它所表示的数值大小就是该位的位权。

例如,将八进制数字53627转换成十进制:

53627 = 5×84 + 3×83 + 6×82 + 2×81 + 7×80 = 22423(十进制)

从右往左看,第1位的位权为 80=1,第2位的位权为 81=8,第3位的位权为 82=64,第4位的位权为 83=512,第5位的位权为 84=4096 …… 第n位的位权就为 8n-1。将各个位的数字乘以位权,然后再相加,就得到了十进制形式。

注意,这里我们需要以十进制形式来表示位权。

再如,将十六进制数字9FA8C转换成十进制:

9FA8C = 9×164 + 15×163 + 10×162 + 8×161 + 12×160 = 653964(十进制)

从右往左看,第1位的位权为160=1,第2位的位权为 161=16,第3位的位权为 162=256,第4位的位权为 163=4096,第5位的位权为 164=65536 …… 第n位的位权就为16n-1。将各个位的数字乘以位权,然后再相加,就得到了十进制形式。

将二进制数字转换成十进制也是类似的道理:

11010 = 1×24 + 1×23 + 0×22 + 1×21 + 0×20 = 26(十进制)

从右往左看,第1位的位权为20=1,第2位的位权为21=2,第3位的位权为22=4,第4位的位权为23=8,第5位的位权为24=16 …… 第n位的位权就为2n-1。将各个位的数字乘以位权,然后再相加,就得到了十进制形式。

将二进制、八进制、十六进制转换为十进制

将十进制转换为其它进制时比较复杂,整数部分和小数部分的算法不一样。

  1. 整数部分
    十进制整数转换为 N 进制整数采用“除 N 取余,逆序排列”法。具体做法是:
    将 N 作为除数,用十进制整数除以 N,可以得到一个商和余数;
    保留余数,用商继续除以 N,又得到一个新的商和余数;
    仍然保留余数,用商继续除以 N,还会得到一个新的商和余数;

如此反复进行,每次都保留余数,用商接着除以 N,直到商为 0 时为止。

把先得到的余数作为 N 进制数的低位数字,后得到的余数作为 N 进制数的高位数字,依次排列起来,就得到了 N 进制数字。
例如 将十进制数字 36926 转换成八进制:

从图中得知,十进制数字 36926 转换成八进制的结果为 110076。将例如 将十进制数字 42 转换成二进制:
10进制转换

从图中得知,十进制数字 42 转换成二进制的结果为 101010。

二、获取数据修改关卡

用户玩游戏的数据一般 会存放到本地 通过百度可以发现植物大战僵尸的存放路径是(C:\ProgramData\PopCap Games\PlantsVsZombies\userdata)
当你通关几局游戏时你会发现 userdata文件里有几个文件,有.dat后缀的文件打开后都是特殊符号,任务文档有提示说有十六进制的转换
这里 作者使用的是 Hex Editor Neo 也可以使用Notepad++ 安装插件,或者 Sublime Text 3

为了了解通关后用户数据的变动,先用 Hex Editor Neo 打开需要观察的用户数据文件
植物大战僵尸数据
经过作者的不断尝试最终发现

关卡 10进制 16进制
1-1 01 01
1-2 02 02
2-1 11 0b
3-1 21 15
5-1 41 29
最终关 5-10 50 32

小技巧进制转换

作者也是经过不断的学习掌握的进制转换
在这个教大家个小技巧
可以通过电脑自带的计算机 切换成 程序员模式
小技巧

三、获取数据修改阳光

通过修改关卡 到 5-2 (42)2a 的时候商店已经开启了
再打打游戏收集一些钱(捡钱好难)当然 你也可以直接通过更改第一行 08的位置

作者通过 收集金币 收集到的金币数量是 230个 然后通过转换成16进制 e6 通过仔细查找 未查找到数据
通过作者不断地尝试发现 将23 转换成16进制 得到数据 17 成功查找到数据。那么钱数为十六进制转十进制后加一个0
经过尝试
作者 发现如果进制转换成 后二位的化 只需要更改成08 位置的数据就可以了但是地址08能存储的金币最大值是2550枚(ff的10倍),商店里有很多商品的价格都超过了2550,所以应该是使用了多位地址存储金币数量;

四、通过编码修改关卡和金钱

修改关卡

  // 修改关卡
  public void update() {
   
    Scanner input = new Scanner(System.in);
    System.err.println("格式 1-1 输入1 2-3 输入13 5-2 输入 42");
    System.out.println("请输入您现在的关卡");
    tempNum = decToHexStringDiv(Integer.parseInt(input.next()));
    System.out.println("您想更改的关卡:");
    tempNum2 = decToHexStringDiv(Integer.parseInt(input.next()));
    System.err.println("16进制当前关卡:" + tempNum);
    System.err.println("16进制更改的关卡:" + tempNum2);
    if (Integer.parseInt(tempNum2, 16) > 50) {
   
      System.out.println("对不起您输入的关数不存在");
      System.exit(0);
    }
    pattern = new String[][] {
   {
   tempNum, tempNum2}};
  }

十进制转十六进制,小于16的十进制前面补一个0

  /** 十进制转十六进制,小于16的十进制前面补一个0 */
  public static String decToHexStringDiv(int n) {
   
    int flag = n;
    StringBuffer s = new StringBuffer();
    String a;
    char[] b = {
   '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    while (n != 0) {
   
      s = s.append(b[n % 16]);
      n = n / 16;
    }
    a = s.reverse().toString();
    if (flag < 16) {
   
      a = 0 + a;
    }
    return a;
  }

当然也可 通过java 自带的方法进行修改
java内置转换

修改金钱

通过观察金钱的数据
在这里插入图片描述
发现金钱使用了多位地址存储金币数量; 这四个位置就是存储
例子
1a 0a 6666 存储位置 是在 08(0a) 09(1a) 通过规律发现 采用的 是高低字节来存储金币数量

// 修改金钱
  private void updateMoney() {
   
    Scanner input = new Scanner(System.in);
    System.out.println("请输入您当前拥有的金币:");
    tempNum = decToHexStringDiv(Integer.parseInt(input.next()));
    System.out.println("您想更改的金币数量:");
    tempNum2 = decToHexStringDiv(Integer.parseInt(input.next()));
    System.out.println
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值