命令行游戏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
相关产品推荐
相关产品推荐

