嵌套switch-case的Java文本游戏代码优化及输入重试实现咨询
Java文本冒险游戏优化方案(解决嵌套过深+输入错误重试问题)
1. 用状态模式替代多层嵌套switch-case
彻底拆解嵌套结构,把每个游戏场景抽象为独立的状态类,每个类只负责自身的场景逻辑、输入处理和状态切换:
定义统一状态接口
public interface GameState { // 处理输入,返回下一个状态(返回自身则停留在当前场景) GameState handleInput(String input); // 显示当前场景的提示文本 void displayPrompt(); }
主游戏循环(无嵌套,仅维护当前状态)
public class AdventureGame { private GameState currentState; public AdventureGame() { // 初始化游戏起始状态 currentState = new StartState(); } public void run() { Scanner scanner = new Scanner(System.in); while (true) { currentState.displayPrompt(); String input = scanner.nextLine().trim(); GameState nextState = currentState.handleInput(input); if (nextState == null) { // 约定返回null时退出游戏 System.out.println("游戏结束"); break; } currentState = nextState; } scanner.close(); } }
实现单个场景状态(以起始场景为例)
每个状态类内部处理输入验证,错误输入时返回自身,自然实现当前场景重试:
public class StartState implements GameState { @Override public void displayPrompt() { System.out.println("=== 冒险游戏启动 ==="); System.out.println("1. 进入幽暗森林"); System.out.println("2. 查看游戏规则"); System.out.println("3. 退出游戏"); System.out.print("请输入选择:"); } @Override public GameState handleInput(String input) { switch (input) { case "1": return new ForestState(); // 切换到森林场景 case "2": System.out.println("规则:输入对应数字选择选项,错误输入会重复当前提问\n"); return this; // 停留在当前场景 case "3": return null; // 触发退出 default: System.out.println("输入无效,请重新输入!\n"); return this; // 重试当前场景 } } }
2. 提取通用输入工具类,避免重复do-while冗余
把重复的输入验证逻辑封装成工具方法,所有状态类复用:
public class InputHelper { private static final Scanner SCANNER = new Scanner(System.in); // 获取符合要求的输入,自动循环直到输入有效 public static String getValidInput(List<String> validOptions, String prompt, String errorMsg) { String input; do { System.out.println(prompt); input = SCANNER.nextLine().trim(); if (!validOptions.contains(input)) { System.out.println(errorMsg); } } while (!validOptions.contains(input)); return input; } }
在状态类中复用工具(以森林场景为例)
public class ForestState implements GameState { @Override public void displayPrompt() { // 空实现,因为输入工具会输出提示 } @Override public GameState handleInput(String input) { List<String> validOpts = Arrays.asList("1", "2", "3"); String validInput = InputHelper.getValidInput( validOpts, "\n=== 幽暗森林 ===\n1. 走左侧小径\n2. 走右侧洞穴\n3. 返回起点", "输入错误,请输入1/2/3!" ); switch (validInput) { case "1": return new PathState(); case "2": return new CaveState(); case "3": return new StartState(); default: return this; } } }
3. 额外优化:场景文本与代码解耦
把场景的提示文本、选项描述提取到.properties配置文件中,状态类读取配置,后续修改剧情无需改动代码:
# game.properties start.prompt==== 冒险游戏启动 ===\n1. 进入幽暗森林\n2. 查看游戏规则\n3. 退出游戏\n请输入选择: start.error=输入无效,请重新输入! forest.prompt=\n=== 幽暗森林 ===\n1. 走左侧小径\n2. 走右侧洞穴\n3. 返回起点
状态类读取配置示例
public class StartState implements GameState { private static final Properties PROPS = loadProperties(); private static Properties loadProperties() { Properties props = new Properties(); try (InputStream is = StartState.class.getResourceAsStream("/game.properties")) { props.load(is); } catch (IOException e) { e.printStackTrace(); } return props; } @Override public void displayPrompt() { System.out.print(PROPS.getProperty("start.prompt")); } // ... handleInput方法复用配置中的错误提示 }
优化效果总结
- 彻底消除多层嵌套switch,代码结构清晰,新增场景仅需添加新的
GameState实现类; - 输入错误自动重试当前场景,无需回到游戏开头;
- 通用工具类避免重复代码,冗余度大幅降低;
- 配置文件解耦剧情文本,便于后期维护和修改。
内容的提问来源于stack exchange,提问作者Ramm 4
相关产品推荐
相关产品推荐

