C#入门OOP项目:如何将方法参数作为对象引用调用对应方法
问题根因
你当前代码无法运行的核心原因是Quest方法中定义的alt1、alt2参数类型为object,C#所有类型的基类object本身没有Quest方法,自然无法直接调用。
优化后的正确实现
1. 调整Story类设计
将每个独立剧情节点的属性和行为封装,每个类实例对应一个剧情节点,直接内置跳转逻辑:
namespace Historia { public class StoryNode { // 当前节点的剧情文本 public string Content { get; set; } // 选1后跳转的下一个节点 public StoryNode Option1Next { get; set; } // 选2后跳转的下一个节点 public StoryNode Option2Next { get; set; } public void Run() { Console.WriteLine(Content); Console.WriteLine("请输入1或2选择对应选项:"); string input = Console.ReadLine()?.Trim() ?? ""; // 非法输入校验 while (input != "1" && input != "2") { Console.WriteLine("输入无效,请重新输入1或2:"); input = Console.ReadLine()?.Trim() ?? ""; } // 分支跳转逻辑 if (input == "1") { if (Option1Next != null) Option1Next.Run(); else Console.WriteLine("当前路线已结束,游戏完成"); } else { if (Option2Next != null) Option2Next.Run(); else Console.WriteLine("当前路线已结束,游戏完成"); } } } }
2. 调整主程序调用逻辑
先创建所有剧情节点,再配置节点间的跳转关系,最后从起始节点启动游戏即可:
namespace Historia { class Program { static void Main(string[] args) { // 创建所有剧情节点 StoryNode startNode = new StoryNode { Content = "Welcome, are you there?" }; StoryNode agreeNode = new StoryNode { Content = "你选择了回应,前方出现一扇铁门,要推开吗?" }; StoryNode silentNode = new StoryNode { Content = "你选择了沉默,雾气逐渐包裹了你,你失去了意识,坏结局达成" }; StoryNode goodEndNode = new StoryNode { Content = "你推开铁门,找到了出口,成功逃离,好结局达成" }; // 配置节点跳转关系 startNode.Option1Next = agreeNode; startNode.Option2Next = silentNode; agreeNode.Option1Next = goodEndNode; // 启动游戏 startNode.Run(); } } }
后续开发建议
- 可给
StoryNode增加IsEnding属性,专门标记结局节点,不需要再配置跳转逻辑 - 如果后续需要支持2个以上的选项,可把两个固定选项改为
List<(string 选项文本, StoryNode 跳转节点)>类型,支持自定义选项数量 - 剧情内容可以单独存储到JSON/CSV文件中,运行时自动加载生成节点,修改剧情不需要重新编译代码
- 可增加存档功能,将当前玩家所处的节点序号序列化存储,读档时直接跳到对应节点继续游戏
内容的提问来源于stack exchange,提问作者Simon Tuomi
相关产品推荐
相关产品推荐

