You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:05:32