欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過Java修改游戲存檔的實現(xiàn)思路

 更新時間:2021年10月28日 11:11:09   作者:Dream_飛翔  
這篇文章主要介紹了通過Java修改游戲存檔的實現(xiàn)思路,實現(xiàn)方法也很簡單,因為植物大戰(zhàn)僵尸游戲的數(shù)據(jù)文件存儲在本地的存儲位置是已知的,因此我們可以將實現(xiàn)過程拆分為三個步驟,需要的朋友可以參考下

前言

植物大戰(zhàn)僵尸的數(shù)據(jù)文件是存儲在本地的dat文件當中,修改在本地的dat文件就可以修改到游戲中的數(shù)據(jù)。之前使用二進制編碼工具Hex Editor Neo實現(xiàn)了修改植物大戰(zhàn)僵尸的本地游戲數(shù)據(jù),現(xiàn)在嘗試不使用Hex Editor Neo二進制工具編輯游戲存檔,使用Java程序來編輯游戲在本地存儲的數(shù)據(jù)。在經(jīng)歷了幾次失敗以后成功的實現(xiàn)了在Java程序中修改植物大戰(zhàn)僵尸的本地數(shù)據(jù),在這里將實現(xiàn)的過程以及思路和錯誤記錄下來,便于以后返回溫習。

使用Hex Editor Neo修改游戲數(shù)據(jù)博客鏈接:C1任務01-修改游戲存檔

在這里插入圖片描述

提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

一、實現(xiàn)思路

不論是做大型的項目或者只是實現(xiàn)一個小的功能,都要先明確實現(xiàn)的思路,哪一步要做什么要事先明確,不然就會像無頭蒼蠅一樣不知所措。

Java版本:JDK1.8
使用工具:IntelliJ IDEA 2021.1.2
項目管理:maven

idea2021最新激活碼:

http://www.dbjr.com.cn/article/196349.htm

https://www.yuque.com/docs/share/b996d27e-c888-45f2-bb1e-f6db5efe2485?#

實現(xiàn)思路相對簡單,因為植物大戰(zhàn)僵尸游戲的數(shù)據(jù)文件存儲在本地的存儲位置是已知的,因此我們可以將實現(xiàn)過程拆分為以下三個步驟:

將.dat數(shù)據(jù)文件抽象為File對象,使用IO流將數(shù)據(jù)讀取到Java程序當中將相應位置的數(shù)據(jù)修改為用戶輸入的數(shù)據(jù)最后將Java程序中存儲的數(shù)據(jù)通過IO流寫回到本地的dat數(shù)據(jù)文件中

這里可以覆蓋回數(shù)據(jù)文件中也可以修改指定位置的數(shù)據(jù),在這里我采用的方法是覆蓋原文件的數(shù)據(jù)。

二、項目準備

在正式編寫代碼之前要先做一些準備工作

1. 創(chuàng)建maven工程

因為本身并不需要在瀏覽器端展示數(shù)據(jù),因此創(chuàng)建一個空的maven工程即可

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

到這里一個maven工程就創(chuàng)建完畢

2. 導入依賴

①. JSON依賴

在這個Java項目中如果出現(xiàn)異?;蚱渌e誤情況,我是以JSON形式輸出到控制臺,因此在這里我導入了阿里巴巴開發(fā)的fastjson依賴

在這里插入圖片描述

<!--  導入alibaba的Json依賴  -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.62</version>
</dependency>

②. Lombok依賴

導入lombok依賴的原因是為了減少實體類中的代碼量,使代碼更簡潔,可讀性更高

在這里插入圖片描述

<!--  導入lombok工具  -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.20</version>
</dependency>

③. Junit4單元測試

在寫代碼時確保所寫方法沒有問題的一種方式就是使用單元測試,在這里我導入了Junit4單元測試框架

在這里插入圖片描述

<!--  導入單元測試依賴  -->
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.13</version>
</dependency>

至此maven工程中的依賴全部導入完成

三、核心代碼

1. 使用的對象

在讀取dat數(shù)據(jù)文件中要使用到以下幾個Java對象,在此進行簡單的介紹

  • InputStream該抽象類是所有的類表示字節(jié)輸入流的父類
  • FileInputStream:從文件系統(tǒng)中的文件中獲得輸入的字節(jié)
  • DataOutputStream將數(shù)據(jù)寫入到指定的基本輸出流中

2. 讀取數(shù)據(jù)文件

我在讀取數(shù)據(jù)文件時將文件的存儲路徑定義成了全局變量,便于在每個方法中進行調(diào)用

在這里插入圖片描述

因為存儲植物大戰(zhàn)僵尸的數(shù)據(jù)文件user1.dat中數(shù)據(jù)是以二進制的方式進行存儲,因此我們在讀取文件內(nèi)容時也要使用二進制的方式進行讀取。
如果使用字符的方式進行讀取的話會出現(xiàn)讀取出的數(shù)據(jù)只有幾個字符的情況,用記事本打開dat文件就會發(fā)現(xiàn)在二進制數(shù)據(jù)文件中的內(nèi)容只有一行并且很多字符都是以空格形式存在的,因此使用字符讀入的方式就只能讀取到一行數(shù)據(jù),并且空格數(shù)據(jù)會被當成null進行處理,所以顯示的結果就只有幾個字符。

將讀取到的整數(shù)數(shù)據(jù)存儲到泛型約束為Integer類型的List集合當中,進行存儲

/**
 * 讀取文件內(nèi)容并將讀取到的內(nèi)容以List集合的格式返回
 *
 * @return 數(shù)據(jù)的List集合
 */
public static List<Integer> readFile() {
    try {
        // 聲明文件對象
        File file = new File(filePath);
        // 將文件內(nèi)容讀取到文件讀取流當中
        InputStream in;
        // 將讀取的流進行封裝
        in = new FileInputStream(file);

        // 定義整數(shù)對象用于存儲讀取到的內(nèi)容
        int content;
        // 一次讀取一行,直到讀入的內(nèi)容為null時讀取文件的過程結束
        while ((content = in.read()) != -1) {
            // 將讀取到的內(nèi)容存儲到List集合中
            nums.add(content);
        }
         // 關閉流
        in.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    return nums;
}

2. 修改關卡信息

在之前修改游戲存檔數(shù)據(jù)時就明白,在user1.dat文件中,第4列中的十六進制內(nèi)容代表著關卡信息,因此在修改游戲的關卡信息時就要指定List集合中下標為4的集合數(shù)據(jù)值為用戶輸入的值。在這里用戶輸入的數(shù)據(jù)雖然是十進制的數(shù)據(jù),但是在將數(shù)據(jù)寫入user1.dat文件時不需要再進行十進制到十六進制的轉換了,因為最后在文件中存儲的形式都是二進制的0和1的形式進行存儲的。

/**
 * 修改關卡數(shù)據(jù)
 *
 * @param result 要修改的關卡(十六進制)
 */
public void writeFileCheckPoint(String result) {
    // 進行文件的讀取
    List<Integer> dataList = ReadUtil.readFile();
    // 將修改關卡列上的數(shù)據(jù)
    dataList.set(4, Integer.valueOf(result, 16));
    ReadUtil.writeFile(dataList);
    dataList.removeAll(dataList);
    System.out.println("關卡數(shù)據(jù)寫入完成!");
    
}

將數(shù)據(jù)輸出到數(shù)據(jù)文件的方法

/**
 * 將文件內(nèi)容寫入到user1.dat文件中,可以進行修改關卡和修改金幣數(shù)量
 *
 * @param dataList 傳來的整型數(shù)組
 */
public static void writeFile(List<Integer> dataList) {
    // 聲明要輸出到的文件對象
    File file = new File(filePath);
    try {
        // 定義數(shù)據(jù)輸出流
        DataOutputStream out = new DataOutputStream(new FileOutputStream(file));
        // 遍歷傳來的List集合
        for (Integer integer : dataList) {
            // 將List集合中的數(shù)據(jù)寫入到user1.dat文件中
            out.write(integer);
            // 刷新輸出流
            out.flush();
        }

        // 關閉輸出流
        out.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

3. 修改金幣信息

在這里還要注意到,雖然第八列和第九列的內(nèi)容代表著金幣信息,但是在這里的第九列的數(shù)據(jù)為高位,并不是按照慣性思維從第八列開始依次排列,因此在存儲金幣信息時要進行單獨的處理。
具體的處理方法就是,將十進制數(shù)轉換為十六進制數(shù)據(jù)時如果轉換后的十六進制數(shù)的長度為3位(在Java中十進制數(shù)轉換為十六進制數(shù)時,十六進制數(shù)是以String類型進行存儲和顯示的),則在轉換后的字符串的起始位置加0,這樣做的原因是要進行截取兩位,讓高位的數(shù)據(jù)在高位存儲,低位的數(shù)據(jù)在低位存儲。

例如:

在這里插入圖片描述

十進制數(shù)據(jù)轉換為十六進制數(shù)據(jù)的轉換方法如下:

/**
 * 將十進制整數(shù)轉換為16進制的字符串
 *
 * @param num 傳來的十進制整數(shù)
 * @return 轉換為16進制后的字符串
 */
 public static String intToHex(int num) {
    // 如果傳來的整數(shù)為0則直接返回
	if (num == 0) {
		return "0";
    }

    // 使用到StringBuilder效率會更高
    StringBuilder builder = new StringBuilder();

    // 定義16進制下的所有數(shù)字
    char[] hexChar = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    // 如果傳來的數(shù)不為0則一直進行除法運算
    while (num != 0) {
        builder = builder.append(hexChar[num % 16]);
        num = num / 16;
    }

    if (builder.length() == 1 || builder.length() % 2 != 0) {
        return "0" + builder.reverse();
    }

    // 最后將builder反轉并返回
    return builder.reverse().toString();
    
}

修改金幣數(shù)量的方法

/**
 * 修改金幣數(shù)據(jù)
 *
 * @param result 要修改的金幣數(shù)量(十六進制)
 */
public void writeFileMoney(String result) {
    // 進行文件的讀取
    List<Integer> dataList = ReadUtil.readFile();
    // 將傳來的字符長度進行除2運算
    int count = result.length() >> 1;
    if (count > 1) {
        // 以兩位為單位長度進行截取,一共有兩個數(shù)據(jù)
        String firstStr = result.substring(0, 2);  // 低位數(shù)據(jù)
        String secondStr = result.substring(2, 4);  // 高位數(shù)據(jù)
		
		// 設置低位的數(shù)據(jù)
        dataList.set(8, Integer.valueOf(secondStr, 16));
        // 設置高位的數(shù)據(jù)
        dataList.set(9, Integer.valueOf(firstStr, 16));
        // 將修改后的金幣數(shù)據(jù)數(shù)據(jù)寫入文件
        ReadUtil.writeFile(dataList);
        System.out.println("金幣數(shù)據(jù)寫入完成!");
        // 清空集合中的數(shù)據(jù)
        dataList.removeAll(dataList);

    } else {
        // 將修改關卡列上的數(shù)據(jù)
        dataList.set(8, Integer.valueOf(result, 16));
        // 當進入這里時第九位一定為0,當從很多的金幣修改到很少的金幣時要確保第九位為0
        dataList.set(9, 0);
        // 將修改后的整型List集合寫入到dat文件中
        ReadUtil.writeFile(dataList);
        System.out.println("金幣數(shù)據(jù)寫入完成!");
        // 清空集合中的數(shù)據(jù)
        dataList.removeAll(dataList);
    }

}

四、代碼測試

接下來對所寫的Java項目進行測試,首先是一個金幣為0且關卡數(shù)為0的空白存檔,在修改文件時先將植物大戰(zhàn)僵尸關閉,因為在修改數(shù)據(jù)文件時如果植物大戰(zhàn)僵尸游戲開著,雖然將數(shù)據(jù)文件的內(nèi)容做了修改,但是在關閉植物大戰(zhàn)僵尸后,游戲仍然會將當前游戲內(nèi)的數(shù)據(jù)信息覆蓋到dat文件中,因此就相當于沒有進行任何修改。

在這里插入圖片描述

現(xiàn)在關閉植物大戰(zhàn)僵尸游戲并且在IntelliJ IDEA中將主類啟動

在這里插入圖片描述

1. 讀取數(shù)據(jù)文件

首先讀取數(shù)據(jù)文件,查看第4列的數(shù)據(jù)是否為01(默認第一關)與第8列的數(shù)據(jù)是否為0(默認金幣為0)

在這里插入圖片描述

讀取到的數(shù)據(jù)文件內(nèi)容正確

2. 修改關卡位置

現(xiàn)在將關卡修改到第42關,即5-2關

在這里插入圖片描述

再讀取數(shù)據(jù)文件,查看第四列的值是否為2a

在這里插入圖片描述

現(xiàn)在進入到游戲中查看關卡是否改變

在這里插入圖片描述

關卡的數(shù)據(jù)和我們修改的內(nèi)容一樣,現(xiàn)在再查看商店中的金幣數(shù)量是否為0

在這里插入圖片描述

金幣數(shù)量也為0,說明只修改了關卡信息

3. 修改金幣數(shù)量

此時進行修改金幣的數(shù)量

在這里插入圖片描述

再讀取數(shù)據(jù)文件,查看第八列的數(shù)據(jù)是否為e8,第九列的數(shù)據(jù)是否為03

在這里插入圖片描述

進入游戲中查看金幣是否發(fā)生了變化

在這里插入圖片描述
在這里插入圖片描述

此時金幣數(shù)量修改為了10000

4. 退出修改器

在這里插入圖片描述

5. 輸入?yún)?shù)錯誤情況

在項目啟動時輸入的內(nèi)容不是修改器的功能選項時

在這里插入圖片描述

關卡位置和金幣數(shù)量越界情況

在這里插入圖片描述
在這里插入圖片描述

成功以JSON格式輸出,至此Java項目測試完畢

五、源碼

1. 項目結構

在這里插入圖片描述

2. 項目代碼

①. ResultInfo類,位于pojo包

package com.shijimo.game.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

/**
 * @author Dream_飛翔
 * @date 2021/10/26
 * @time 18:32
 * @email 1072876976@qq.com
 *
 * 輸出提示信息
 */
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class ResultInfo {
    private Integer code;   // 狀態(tài)碼
    private String msg;     // 提示信息
}

②. EditorService類,位于service包

package com.shijimo.game.service;

import com.shijimo.game.util.ReadUtil;

import java.util.List;

/**
 * @author Dream_飛翔
 * @date 2021/10/26
 * @time 18:29
 * @email 1072876976@qq.com
 */
public class EditorService {

    /**
     * 修改關卡數(shù)據(jù)
     *
     * @param result 要修改的關卡(十六進制)
     */
    public void writeFileCheckPoint(String result) {
        // 進行文件的讀取
        List<Integer> dataList = ReadUtil.readFile();
        // 將修改關卡列上的數(shù)據(jù)
        dataList.set(4, Integer.valueOf(result, 16));
        ReadUtil.writeFile(dataList);
        dataList.removeAll(dataList);
        System.out.println("關卡數(shù)據(jù)寫入完成!");
    }

    /**
     * 修改金幣數(shù)據(jù)
     *
     * @param result 要修改的金幣數(shù)量(十六進制)
     */
    public void writeFileMoney(String result) {
        // 進行文件的讀取
        List<Integer> dataList = ReadUtil.readFile();
        // 將傳來的字符長度進行除2運算
        int count = result.length() >> 1;
        if (count > 1) {
            // 以兩位為單位長度進行截取,一共有兩個數(shù)據(jù)
            String firstStr = result.substring(0, 2);
            String secondStr = result.substring(2, 4);

            dataList.set(8, Integer.valueOf(secondStr, 16));
            dataList.set(9, Integer.valueOf(firstStr, 16));
            // 將修改后的金幣數(shù)據(jù)數(shù)據(jù)寫入文件
            ReadUtil.writeFile(dataList);
            System.out.println("金幣數(shù)據(jù)寫入完成!");
            dataList.removeAll(dataList);

        } else {
            // 將修改關卡列上的數(shù)據(jù)
            dataList.set(8, Integer.valueOf(result, 16));
            // 當進入這里時第九位一定為0,如果從高位改到低位的話要確保第九位為0
            dataList.set(9, 0);
            ReadUtil.writeFile(dataList);
            System.out.println("金幣數(shù)據(jù)寫入完成!");
            dataList.removeAll(dataList);
        }

    }
}

③. NumUtil類,位于util包

package com.shijimo.game.util;

/**
 * @author Dream_飛翔
 * @date 2021/10/26
 * @time 16:32
 * @email 1072876976@qq.com
 * <p>
 * 本類用于將整數(shù)進行進制的轉換
 */
public class NumUtil {

    /**
     * 將十進制整數(shù)轉換為16進制的字符串
     *
     * @param num 傳來的整數(shù)
     * @return 轉換為16進制后的字符串
     */
    public static String intToHex(int num) {
        // 如果傳來的整數(shù)為0則直接返回
        if (num == 0) {
            return "0";
        }

        // 使用到StringBuilder效率會更高
        StringBuilder builder = new StringBuilder();

        // 定義16進制下的所有數(shù)字
        char[] hexChar = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

        // 如果傳來的數(shù)不為0則一直進行除法運算
        while (num != 0) {
            builder = builder.append(hexChar[num % 16]);
            num = num / 16;
        }

        if (builder.length() == 1 || builder.length() % 2 != 0) {
            return "0" + builder.reverse();
        }
//        else if (builder.length() >= 1 && builder.length() % 2 != 0) {
//            return builder.reverse() + "0";
//        }

        // 最后將builder反轉并返回
        return builder.reverse().toString();
    }


}

⑥. ReadUtil類,位于util包

package com.shijimo.game.util;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Dream_飛翔
 * @date 2021/10/26
 * @time 10:11
 * @email 1072876976@qq.com
 * <p>
 * 該類用于讀取二進制文件中的數(shù)據(jù),植物大戰(zhàn)僵尸的本地數(shù)據(jù)文件中只有一行數(shù)據(jù)
 * 1. 通過InputStream進行二進制方式讀取
 * 2. 對每一行的內(nèi)容進行特殊的處理
 */
public class ReadUtil {
    // 定義文件的路徑
    static String filePath = "C:\\ProgramData\\PopCap Games\\PlantsVsZombies\\userdata\\user1.dat";
    // 定義整型集合類用于存儲
    static List<Integer> nums = new ArrayList<>();

    /**
     * 讀取文件內(nèi)容并將讀取到的內(nèi)容以List集合的格式返回
     *
     * @return 數(shù)據(jù)的List集合
     */
    public static List<Integer> readFile() {
        try {
            // 聲明文件對象
            File file = new File(filePath);
            // 將文件內(nèi)容讀取到文件讀取流當中
            InputStream in;
            // 將讀取的流進行封裝
            in = new FileInputStream(file);

            // 定義整數(shù)對象用于存儲讀取到的內(nèi)容
            int content;
            // 一次讀取一行,直到讀入的內(nèi)容為null時讀取文件的過程結束
            while ((content = in.read()) != -1) {
                // 將讀取到的內(nèi)容存儲到List集合中
                nums.add(content);
            }
            // 關閉流
            in.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return nums;
    }

    /**
     * 將文件內(nèi)容寫入到user1.dat文件中,可以進行修改關卡和修改金幣數(shù)量
     *
     * @param dataList 傳來的整型數(shù)組
     */
    public static void writeFile(List<Integer> dataList) {
        // 聲明要輸出到的文件對象
        File file = new File(filePath);
        try {
            // 定義數(shù)據(jù)輸出流
            DataOutputStream out = new DataOutputStream(new FileOutputStream(file));
            // 遍歷傳來的List集合
            for (Integer integer : dataList) {
                // 將List集合中的數(shù)據(jù)寫入到user1.dat文件中
                out.write(integer);
                // 刷新輸出流
                out.flush();
            }
            // 刷新輸出流
            out.flush();
            // 關閉輸出流
            out.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 將指定的文件內(nèi)容輸出到控制臺上
     */
    public static void printFile() {
        // 定義整型集合類用于存儲
        List<Integer> dataList = new ArrayList<>();

        try {
            // 聲明文件對象
            File file = new File(filePath);
            // 將文件內(nèi)容讀取到文件讀取流當中
            InputStream in;
            // 將讀取的流進行封裝
            in = new FileInputStream(file);

            // 定義整數(shù)對象用于存儲讀取到的內(nèi)容
            int content;
            // 一次讀取一行,直到讀入的內(nèi)容為null時讀取文件的過程結束
            while ((content = in.read()) != -1) {
                // 將讀取到的內(nèi)容存儲到List集合中
                dataList.add(content);
            }
            // 關閉流
            in.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

        // 定義標志變量的初值為0
        int count = 0;
        // 將讀取到的內(nèi)容輸出
        System.out.println("00\t01\t02\t03\t04\t05\t06\t07\t08\t09\t0a\t0b\t0c\t0d\t0e\t0f");
        // 遍歷讀取到的整數(shù)集合
        for (Integer data : dataList) {
            // 如果標志變量的值對16做取余運算為0的話則進行換行操作
            if (count % 16 == 0)
                System.out.println();
            System.out.print(NumUtil.intToHex(data) + "\t");
            count++;
        }
    }
}

⑦. EditorApplication主啟動類,位于項目的最外層包中

package com.shijimo.game;

import com.alibaba.fastjson.JSONObject;
import com.shijimo.game.pojo.ResultInfo;
import com.shijimo.game.service.EditorService;
import com.shijimo.game.util.NumUtil;
import com.shijimo.game.util.ReadUtil;

import java.util.Scanner;

/**
 * @author Dream_飛翔
 * @date 2021/10/26
 * @time 17:01
 * @email 1072876976@qq.com
 */
public class EditorApplication {

    public static void main(String[] args) {
        // 將業(yè)務處理對象實例化
        EditorService editorService = new EditorService();

        System.out.println("**********************************************************");
        System.out.println("         ,---._                                         \n" +
                "       .-- -.' \\                                        \n" +
                "       |    |   :                                       \n" +
                "       :    ;   |                                       \n" +
                "       :        |                   .---.               \n" +
                "       |    :   :   ,--.--.       /.  ./|    ,--.--.    \n" +
                "       :           /       \\    .-' . ' |   /       \\   \n" +
                "       |    ;   | .--.  .-. |  /___/ \\: |  .--.  .-. |  \n" +
                "   ___ l           \\__\\/: . .  .   \\  ' .   \\__\\/: . .  \n" +
                " /    /\\    J   :  ,\" .--.; |   \\   \\   '   ,\" .--.; |  \n" +
                "/  ../  `..-    , /  /  ,.  |    \\   \\     /  /  ,.  |  \n" +
                "\\    \\         ; ;  :   .'   \\    \\   \\ | ;  :   .'   \\ \n" +
                " \\    \\      ,'  |  ,     .-./     '---\"  |  ,     .-./ \n" +
                "  \"---....--'     `--`---'                 `--`---'     ");
        System.out.println("\n                 老張寫的植物大戰(zhàn)僵尸修改器       version: 1.0");

        while (true) {
            System.out.println("**********************************************************");
            System.out.println("*     =======>       1. 修改關卡位置       <=======        *");
            System.out.println("*     =======>       2. 修改金幣數(shù)量       <=======        *");
            System.out.println("*     =======>       3. 讀取數(shù)據(jù)文件       <=======        *");
            System.out.println("*     =======>       4. 退出此修改器       <=======        *");
            System.out.println("**********************************************************");
            System.out.print("請輸入您的選擇:");

            // 定義Scanner對象用于接收從鍵盤上輸入的數(shù)字
            Scanner scanner = new Scanner(System.in);
            int choose = scanner.nextInt();

            switch (choose) {
                case 1: {
                    Scanner editor = new Scanner(System.in);
                    System.out.println("您的選擇是 => 選擇修改關卡的位置");
                    System.out.print("請輸入您想要跳到的關卡位置(最高50關):");
                    // 接收關卡的位置數(shù)據(jù)
                    int checkPoint = editor.nextInt();
                    // 進行越界判斷
                    if (checkPoint <= 0 || checkPoint > 50) {
                        System.out.println(JSONObject.toJSONString(new ResultInfo(500, "輸入數(shù)據(jù)有誤")));
                        break;
                    }
                    // 將提示信息輸出
                    System.out.println("正在修改關卡數(shù)據(jù)...");

                    // 如果輸入的數(shù)據(jù)合法,將其轉換為十六進制數(shù)據(jù)
                    String result = NumUtil.intToHex(checkPoint);
                    // 調(diào)用業(yè)務層的方法進行修改內(nèi)容
                    editorService.writeFileCheckPoint(result);

                    System.out.println("關卡數(shù)據(jù)修改成功!");
                }
                break;
                case 2: {
                    System.out.println("您的選擇是 => 修改游戲的金幣數(shù)量");
                    System.out.print("請輸入您想要修改的金幣數(shù)量(最高655350個):");
                    // 聲明輸入對象
                    Scanner editor = new Scanner(System.in);
                    // 接收輸入的金幣數(shù)量
                    int money = editor.nextInt();
                    // 進行越界判斷
                    if (money > 655350 || money < 0) {
                        System.out.println(JSONObject.toJSONString(new ResultInfo(500, "輸入數(shù)據(jù)有誤")));
                        break;
                    }
                    // 如果輸入的數(shù)據(jù)合法,將其轉換為十六進制數(shù)據(jù)
                    String result = NumUtil.intToHex(money / 10);
                    // 調(diào)用業(yè)務層的方法進行修改數(shù)據(jù)并返回修改結果
                    editorService.writeFileMoney(result);
                    // 如果金幣數(shù)量修改成功
                    System.out.println("金幣數(shù)據(jù)修改成功!");

                }
                break;
                case 3: {
                    System.out.println("您的選擇是 => 讀取游戲的數(shù)據(jù)文件");
                    System.out.println("開始讀取數(shù)據(jù)文件...");
                    // 讀取數(shù)據(jù)文件并打印
                    ReadUtil.printFile();
                    // 換行
                    System.out.println();
                    // 輸出提示信息
                    System.out.println("數(shù)據(jù)文件讀取成功!");
                } break;
                case 4: {
                    System.out.println("感謝您的使用,期待下次再見!");
                    System.exit(0);
                }
                default:
                    System.out.println(JSONObject.toJSONString(new ResultInfo(500, "輸入指令有誤")));
            }
        }
    }
}

⑧. pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>GameEditor</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>

        <!--  導入alibaba的Json依賴  -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>

        <!--  導入lombok工具  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>

        <!--  導入單元測試依賴  -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>

    </dependencies>

</project>

總結

以上便是使用Java修改植物大戰(zhàn)僵尸數(shù)據(jù)文件的過程,還記得當時在使用工具去修改游戲存檔數(shù)據(jù)時都感覺到不可思議與不敢相信!而此時通過Java代碼進行修改文件數(shù)據(jù)時都沒有一絲的感覺自己做不成功,對于自己來說,不僅僅是技術上的提高,更重要的是心態(tài)上的變化。當自己獨立寫過一定數(shù)量的代碼時內(nèi)心就會變得很有底氣,變得更加相信自己,可能就像很多人說的那樣,真正的技術一定是相當數(shù)量的代碼堆疊起來的!

自然界沒有風風雨雨,大地就不會春華秋實。若不嘗試著做些本事之外的事,就永遠不會成長!人生的價值并不在于成功后的榮光,而在于追求的本身,在于信念的樹立與堅持的過程。堅守信念,猶如在內(nèi)心撒下一顆種子,只要在適宜的條件下,種子自會生根發(fā)芽破土而出,總會有收獲果實的期望。有時需要外力輔助才可取得成果,但最終還要靠自我去完成,因為任何人也不可能把信念深植于你的心中。所以,我們要堅守自我的信念,播下期望的種子。做一名自信者,牢牢把住自我生命的羅盤!

在這里插入圖片描述

到此這篇關于通過Java修改游戲存檔的文章就介紹到這了,更多相關Java修改游戲存檔內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • spring boot 實現(xiàn)配置多個DispatcherServlet最簡單方式

    spring boot 實現(xiàn)配置多個DispatcherServlet最簡單方式

    這篇文章主要介紹了spring boot 實現(xiàn)配置多個DispatcherServlet最簡單方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 深入了解Java.Util.Date詳情

    深入了解Java.Util.Date詳情

    這篇文章主要介紹了Java.Util.Date,很少有類能像java.util.Date那樣在堆棧溢出方面引起如此多的類似問題,關于具體原因下文內(nèi)容詳細介紹,需要的朋友可以參考一下
    2022-06-06
  • SpringBoot中Mybatis注解一對多和多對多查詢實現(xiàn)示例

    SpringBoot中Mybatis注解一對多和多對多查詢實現(xiàn)示例

    這篇文章主要介紹了SpringBoot中Mybatis注解一對多和多對多查詢的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • 從零搭建Spring Boot腳手架整合OSS作為文件服務器的詳細教程

    從零搭建Spring Boot腳手架整合OSS作為文件服務器的詳細教程

    這篇文章主要介紹了從零搭建Spring Boot腳手架整合OSS作為文件服務器的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • ThreadPoolExecutor線程池原理及其execute方法(詳解)

    ThreadPoolExecutor線程池原理及其execute方法(詳解)

    下面小編就為大家?guī)硪黄猅hreadPoolExecutor線程池原理及其execute方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java實現(xiàn)excel大數(shù)據(jù)量導入

    Java實現(xiàn)excel大數(shù)據(jù)量導入

    這篇文章主要為大家詳細介紹了Java實現(xiàn)excel大數(shù)據(jù)量導入,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Java中的字符串常量池詳細介紹

    Java中的字符串常量池詳細介紹

    這篇文章主要介紹了Java中的字符串常量池詳細介紹,JVM為了減少字符串對象的重復創(chuàng)建,其維護了一個特殊的內(nèi)存,這段內(nèi)存被成為字符串常量池或者字符串字面量池,需要的朋友可以參考下
    2015-01-01
  • Java獲取Prometheus監(jiān)控數(shù)據(jù)的方法實現(xiàn)

    Java獲取Prometheus監(jiān)控數(shù)據(jù)的方法實現(xiàn)

    本文主要介紹了Java獲取Prometheus監(jiān)控數(shù)據(jù)的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • IDEA 格式化SQL代碼技巧分享

    IDEA 格式化SQL代碼技巧分享

    這篇文章主要介紹了IDEA 格式化SQL代碼技巧分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Idea工具中創(chuàng)建 SpringBoot工程及入門詳解

    Idea工具中創(chuàng)建 SpringBoot工程及入門詳解

    這篇文章主要介紹了Idea工具中創(chuàng)建 SpringBoot工程及入門分析詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02

最新評論