文章目录
前言
上篇文章中我们通过二进制编辑器Hex Editor Neo实现通过修改游戏存储数据已到达修改游戏关卡和游戏中银币的功能,本章节将尝试使用Java程序来编辑游戏在本地存储的数据。
请参考文章:《植物大战僵尸》游戏数据修改
一、概述
1、游戏背景
《植物大战僵尸》是一款策略类游戏。 游戏分为 僵尸 与 植物 两方,僵尸将入侵房屋,而玩家则需要种上必要的植物来攻击,抑或抵挡入侵的僵尸。
此游戏内僵尸的种类有很多,面对不同种类的僵尸,玩家需要选择不同功能、不同攻击性、不同防御性的植物,以消灭所有入侵的僵尸,保护自己。
一个看似简单实则极富策略性的小游戏.可怕的 僵尸 即将入侵你的家庭,你唯一的防御方式就是您栽种的 植物 。
一款新奇的游戏即将登陆PC平台,名称为《 植物大战僵尸 》。 武装您的49种植物,切换他们不同的功能,诸如 樱桃炸弹 或强悍的 食人花
,更加快速有效的将僵尸阻挡在入侵的道路上。
不同的敌人,不同的玩法构成五种不同的游戏模式,加之夕阳、屋顶、浓雾以及泳池之类的障碍增加了其挑战性 奇特的游戏乐趣永无止境。
2、游戏图片
游戏首页
3、修改思路
上篇文章中我们用二进制编辑器对游戏数据进行修改,这里我们不妨用java将数据文件dat读出来,再用DataOutputStream将需要改动的数据写入到指定的基本输出流中。
4、工具准备
使用工具:IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBrains
游戏链接:植物大战僵尸-提取码:Huah
二、效果呈现
1、修改关卡
我们用java将关卡修改至5-1关,我们打卡游戏看看:
我们成功将游戏修改至5-1关!
2、修改游戏币
我们将游戏币修改至100000
我们看到游戏币已增加到100000了
三、java代码
1、修改关卡类
(1)导入包
import java.io.DataOutputStream;//数据输出流
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
(2)方法
public void level() {
String file = "C:\\ProgramData\\PopCap Games\\PlantsVsZombies\\userdata\\user1.dat";//游戏数据存储路径
byte[] data = new byte[1024];
Scanner sc = new Scanner(System.in);
System.out.println("请输入修改的关卡(1-5)");
int big = sc.nextInt();
System.out.println("请输入该关卡的小节(1-10)");
int small = sc.nextInt();
while (big < 1 || big > 5 || small < 1 || small > 10) {
System.out.println("您的输入有误");
System.out.println("请重新输入修改的关卡(1-5)");
big = sc.nextInt();
System.out.println("请重新输入该关卡的小节(1-10)");
small = sc.nextInt();
}
byte trans = (byte) ((big - 1) * 10 + small);//将输入的关卡转换为16进制存储到第04列
data[4] = trans;
System.out.println("成功修改至" + big + "-" + small + "关!");
try {
DataOutputStream dat = new DataOutputStream(new FileOutputStream(file));
try {
dat.write(data);
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
2、修改游戏币类
(1)导入包
import java.io.DataOutputStream;//数据输出流
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
(2)方法
public class GameCurrency {
public void silver(){
String file = "C:\\ProgramData\\PopCap Games\\PlantsVsZombies\\userdata\\user1.dat";
byte[] data = new byte[1024];
Scanner sc = new Scanner(System.in);
System.out.println("请输入您需要修改至多少银币");
int money = sc.nextInt() / 10;
while ( money < 0 || money > 999999999){
System.out.println("您的输入有误!");
System.out.println("请重新输入您需要修改至修改至多少银币");
money = sc.nextInt();
}
for (int i = 8; i < 12; i++) {//将修改金币的数量按16进制存储到08-11列
data[i] = (byte) (money % 256);
money /= 256;
}
System.out.println("修改成功!");
try {
DataOutputStream dat = new DataOutputStream(new FileOutputStream(file));
try {
dat.write(data);
dat.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
3、主方法
import java.util.Scanner;
/**
* @author Huahua
* @version 1.0
*/
public class Application {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
CheckPoint ch = new CheckPoint();/*将关卡类实例化*/
GameCurrency ga = new GameCurrency();/*将游戏币类实例化*/
System.out.println(" 欢迎修改植物大战僵尸游戏数据!");
System.out.println();
loop : while(true){
System.out.println(" PlantsVsZombies @Auther:Huahua");
System.out.println("===================================================");
System.out.println("************** 请输入1修改关卡 ****************");
System.out.println("************** 请输入2修改游戏币 ***************");
System.out.println("************** 输入exit退出程序 ****************");
System.out.println("===================================================");
System.out.print(":");
String in = sc.nextLine();
switch (in){
case"1":
/*修改关卡*/
ch.level();
break;
case"2":
/*修改游戏币*/
ga.silver();
break;
case"exit":
break loop;
default:
System.out.println("您的输入有误请重新输入");
}
}
System.out.println("感谢您的使用!");
}
}
四、总结
本次通过java实现修改游戏数据还是比较简单的,这边只介绍了修改关卡和游戏币,其实还能由更多的功能,大家可以参考我上篇文章,再试试通过java修改无限阳光等功能,只要肯尝试,相信大家做得会比我更好!