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

命令行游戏C#命令分类优化:多带参命令与Help功能实现

推荐使用命令模式(Command Pattern)

这种模式能完美解决你要维护大量命令、处理参数和自动生成帮助的需求,彻底替代臃肿的if-else分支,同时符合开闭原则,新增命令无需修改原有核心逻辑。

具体实现步骤:

1. 定义命令接口

统一所有命令的行为规范,包含元数据(名称、描述、参数提示)和执行方法:

public interface ICommand
{
    // 命令名称(如"help"、"save")
    string Name { get; }
    // 命令功能描述
    string Description { get; }
    // 参数格式提示(可选,如"save [文件名]")
    string ArgumentHint { get; }
    // 执行命令逻辑,接收解析后的参数数组
    void Execute(string[] arguments);
}

2. 实现具体命令类

每个命令单独封装成类,职责单一:

// 帮助命令
public class HelpCommand : ICommand
{
    private readonly IEnumerable<ICommand> _allCommands;

    // 注入所有已注册的命令,用于生成帮助列表
    public HelpCommand(IEnumerable<ICommand> allCommands)
    {
        _allCommands = allCommands;
    }

    public string Name => "help";
    public string Description => "显示所有可用命令及说明";
    public string ArgumentHint => "";

    public void Execute(string[] arguments)
    {
        Console.WriteLine("=== 可用命令列表 ===");
        foreach (var cmd in _allCommands)
        {
            Console.WriteLine($"- {cmd.Name} {cmd.ArgumentHint}: {cmd.Description}");
        }
    }
}

// 保存命令(带可选参数)
public class SaveCommand : ICommand
{
    public string Name => "save";
    public string Description => "保存当前游戏进度";
    public string ArgumentHint => "[文件名]";

    public void Execute(string[] arguments)
    {
        // 处理参数:有输入则用指定文件名,否则用默认
        string saveFileName = arguments.Length > 0 ? arguments[0] : "default_save";
        // 这里替换为实际保存逻辑
        Console.WriteLine($"进度已保存到 {saveFileName}.sav");
    }
}

// 其他20-30个命令同理,各自实现ICommand接口即可

3. 实现命令管理器

负责注册命令、解析用户输入、分发执行:

public class CommandManager
{
    // 用字典存储命令映射,忽略大小写适配不同输入风格
    private readonly Dictionary<string, ICommand> _commandMap = new(StringComparer.OrdinalIgnoreCase);

    // 注册命令到管理器
    public void RegisterCommand(ICommand command)
    {
        _commandMap[command.Name] = command;
    }

    // 解析用户输入并执行对应命令
    public void ProcessInput(string input)
    {
        if (string.IsNullOrWhiteSpace(input)) return;

        // 拆分命令与参数(如需支持带空格的参数,可替换为更严谨的拆分逻辑)
        string[] inputParts = input.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
        string cmdName = inputParts[0];
        string[] args = inputParts.Skip(1).ToArray();

        if (_commandMap.TryGetValue(cmdName, out var command))
        {
            command.Execute(args);
        }
        else
        {
            Console.WriteLine($"未知命令:{cmdName},输入help查看所有可用命令");
        }
    }
}

4. 重构原有的命令输入逻辑

用命令管理器替代原有的Classify方法:

public static void Main()
{
    // 初始化所有命令
    var allCommands = new List<ICommand>
    {
        new HelpCommand(allCommands),
        new SaveCommand()
        // 依次添加其他命令实例
    };

    // 注册所有命令到管理器
    var commandManager = new CommandManager();
    foreach (var cmd in allCommands)
    {
        commandManager.RegisterCommand(cmd);
    }

    // 启动命令循环
    RunCommandLoop(commandManager);
}

public static void RunCommandLoop(CommandManager commandManager)
{
    string? input = Console.ReadLine();
    if (string.IsNullOrWhiteSpace(input))
    {
        RunCommandLoop(commandManager);
        return;
    }

    commandManager.ProcessInput(input);
    RunCommandLoop(commandManager); // 循环等待下一次输入
}

核心优势:

  • 扩展性极强:新增命令只需实现ICommand并注册到管理器,完全无需修改原有代码
  • 职责清晰:每个命令的逻辑封装在独立类中,避免Classify方法变成几百行的if-else地狱
  • 自动维护帮助:HelpCommand直接遍历所有注册命令生成帮助文本,无需手动更新帮助内容
  • 参数处理灵活:每个命令可根据自身需求处理参数,逻辑独立不耦合

内容的提问来源于stack exchange,提问作者hikariakio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:58:04