如何读取Java游戏配置文本文件并为对应变量逐行赋值?
如何读取Java游戏配置文本文件并为对应变量逐行赋值?
嘿,这个需求其实挺常见的,我来给你捋捋怎么实现~本质上就是要读取配置文件的每一行,解析出键值对,再根据键把对应的值传给游戏里的变量,具体步骤和代码我给你写清楚:
第一步:读取配置文件的每一行
Java里读取文本文件的方式有好几种,比如用Files.readAllLines可以一次性把所有行读进列表里,操作起来很方便;如果你的配置文件特别大,也可以用BufferedReader逐行读取,避免占用太多内存。
第二步:解析每行的键值对
你的配置格式是Key = Value,所以我们需要把每行按=分割,还要处理等号前后可能存在的空格。比如用split("\\s*=\\s*"),这个正则表达式会匹配等号前后任意数量的空格,确保能正确拆分出键和值。
第三步:根据键处理对应的值
不同的键对应不同的 value 格式,比如PlayerSpawn是两个坐标,Block1Data是四个数值(坐标+尺寸),我们可以用switch-case来分别处理,解析后把值传给对应的游戏变量就行。
完整代码示例
下面是一个可直接参考的实现,我加了详细的注释,你可以直接套用到你的游戏里:
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class LevelConfigLoader { // 加载关卡配置的方法,传入配置文件路径 public static void loadLevelConfig(String filePath) { try { // 读取文件所有行到列表中 List<String> lines = Files.readAllLines(Paths.get(filePath)); for (String line : lines) { // 跳过空行或者以#开头的注释行(如果需要的话) String trimmedLine = line.trim(); if (trimmedLine.isEmpty() || trimmedLine.startsWith("#")) { continue; } // 拆分键和值,处理等号前后的空格 String[] keyValue = trimmedLine.split("\\s*=\\s*"); if (keyValue.length != 2) { System.err.println("跳过无效的配置行: " + line); continue; } String configKey = keyValue[0].trim(); String configValue = keyValue[1].trim(); // 根据不同的配置键处理对应的值 switch (configKey) { case "PlayerSpawn": // 拆分坐标值,处理逗号前后的空格 String[] spawnCoords = configValue.split("\\s*,\\s*"); if (spawnCoords.length == 2) { try { int spawnX = Integer.parseInt(spawnCoords[0]); int spawnY = Integer.parseInt(spawnCoords[1]); // 这里把解析好的坐标传给你的玩家出生点变量 // 比如:yourPlayer.setSpawnPosition(spawnX, spawnY); System.out.println("玩家出生点已设置:X=" + spawnX + ", Y=" + spawnY); } catch (NumberFormatException e) { System.err.println("PlayerSpawn 格式错误,请检查坐标是否为整数: " + configValue); } } else { System.err.println("PlayerSpawn 需要两个坐标值,当前值: " + configValue); } break; case "Block1Data": String[] blockInfo = configValue.split("\\s*,\\s*"); if (blockInfo.length == 4) { try { int blockX = Integer.parseInt(blockInfo[0]); int blockY = Integer.parseInt(blockInfo[1]); int blockWidth = Integer.parseInt(blockInfo[2]); int blockHeight = Integer.parseInt(blockInfo[3]); // 把方块数据传给你的方块对象 // 比如:blockList.add(new Block(blockX, blockY, blockWidth, blockHeight)); System.out.println("方块1数据已加载:X=" + blockX + ", Y=" + blockY + ", 宽=" + blockWidth + ", 高=" + blockHeight); } catch (NumberFormatException e) { System.err.println("Block1Data 格式错误,请检查数值是否为整数: " + configValue); } } else { System.err.println("Block1Data 需要四个数值(X,Y,宽,高),当前值: " + configValue); } break; // 如果有更多配置项,继续在这里加case就行 default: System.err.println("未知的配置项:" + configKey); } } } catch (IOException e) { System.err.println("读取配置文件失败:" + e.getMessage()); e.printStackTrace(); } } // 测试用的主方法,运行可以验证效果 public static void main(String[] args) { loadLevelConfig("Level1.txt"); } }
进阶小技巧
如果你的关卡里有很多方块(比如Block1Data、Block2Data...BlockNData),一个个写case太麻烦,可以用Java 12+的带条件的switch case来统一处理:
// 替换原来的Block1Data case,改成下面的逻辑 case String key when key.startsWith("Block") && key.endsWith("Data"): // 提取方块编号,比如从"Block3Data"里拿到数字3 String blockNum = key.replaceAll("[^0-9]", ""); String[] blockInfo = configValue.split("\\s*,\\s*"); if (blockInfo.length == 4) { try { int x = Integer.parseInt(blockInfo[0]); int y = Integer.parseInt(blockInfo[1]); int w = Integer.parseInt(blockInfo[2]); int h = Integer.parseInt(blockInfo[3]); System.out.println("方块" + blockNum + "数据已加载:X=" + x + ", Y=" + y + ", 宽=" + w + ", 高=" + h); // 同样添加到你的方块列表里 } catch (NumberFormatException e) { System.err.println(key + " 格式错误:" + configValue); } } else { System.err.println(key + " 需要四个数值,当前值:" + configValue); } break;
这样不管有多少个方块配置,都能一次性处理,不用重复写代码~
备注:内容来源于stack exchange,提问作者Kaas Sauz
相关产品推荐
相关产品推荐

