// 题1. AI 对话系统
// 你要做一个 NPC 对话系统:
// 不同 NPC 有不同的对话脚本(村民、商人、战士)。
// 同时对话还会受玩家状态影响(任务是否完成、声望高低)。
// 👉 请结合 模板方法模式 和 策略模式,设计一下系统结构。
csusing System; // 抽象策略 public interface ISpeakStrategy { string Execute(); } // 具体策略 public class RespectStrategy : ISpeakStrategy { public string Execute() => "尊敬"; } public class StrangeStrategy : ISpeakStrategy { public string Execute() => "陌生"; } public class SeriousStrategy : ISpeakStrategy { public string Execute() => "严肃"; } public class AppreciateStrategy : ISpeakStrategy { public string Execute() => "赞赏"; } // 模板方法模式 ------ NPC基类 public abstract class NPC { // 模板方法:定义固定流程 public void Talk(ISpeakStrategy strategy) { Greet(); CoreDialogue(strategy); Farewell(); } protected abstract void Greet(); // 打招呼 protected abstract void CoreDialogue(ISpeakStrategy strategy); // 核心对话 protected abstract void Farewell(); // 告别 } // 具体NPC public class Villager : NPC { protected override void Greet() => Console.WriteLine("村民:你好啊!"); protected override void CoreDialogue(ISpeakStrategy strategy) => Console.WriteLine($"村民用「{strategy.Execute()}」的语气交谈。"); protected override void Farewell() => Console.WriteLine("村民:路上小心!"); } public class Merchant : NPC { protected override void Greet() => Console.WriteLine("商人:客官请进。"); protected override void CoreDialogue(ISpeakStrategy strategy) => Console.WriteLine($"商人用「{strategy.Execute()}」的语气讨价还价。"); protected override void Farewell() => Console.WriteLine("商人:欢迎下次光临!"); } public class Warrior : NPC { protected override void Greet() => Console.WriteLine("战士:哼,你找我吗?"); protected override void CoreDialogue(ISpeakStrategy strategy) => Console.WriteLine($"战士用「{strategy.Execute()}」的语气交流。"); protected override void Farewell() => Console.WriteLine("战士:走好,不要添麻烦。"); } // 玩家状态决定策略 public class Player { public bool IsCompletedTask { get; set; } public float Reputation { get; set; } public ISpeakStrategy ChooseStrategyByTask() => IsCompletedTask ? new SeriousStrategy() : new AppreciateStrategy(); public ISpeakStrategy ChooseStrategyByReputation() => Reputation >= 60f ? new RespectStrategy() : new StrangeStrategy(); } // 客户端测试 public class Client { public static void Main() { Player player = new Player { IsCompletedTask = true, Reputation = 80 }; NPC villager = new Villager(); NPC merchant = new Merchant(); NPC warrior = new Warrior(); villager.Talk(player.ChooseStrategyByReputation()); merchant.Talk(player.ChooseStrategyByReputation()); warrior.Talk(player.ChooseStrategyByTask()); } }
【设计模式】题目小练2
大飞pkz2025-09-14 14:52
相关推荐
北凉军5 分钟前
java连接达梦数据库,用户名是其他库的名称无法指定库,所有mapper查询的都是以用户名相同的库内的表wuk99815 分钟前
基于C#与三菱PLC通过TCPIP实现MC协议通信示例沛沛老爹22 分钟前
Web转AI架构篇 Agent Skills vs MCP:工具箱与标准接口的本质区别avi911131 分钟前
Unity 天命6源码- 商业游戏说明分析低频电磁之道1 小时前
编译C++的几种方式(MSVC编译器)Zsy_0510031 小时前
【C++】类和对象(一)星火开发设计2 小时前
Java面向对象三大特性:封装、继承与多态的深度解析及实战旅途中的宽~2 小时前
【Python】pip install -v e .命令不想自动更新torch版本lly2024062 小时前
Vue3 指令详解_OP_CHEN2 小时前
【从零开始的Qt开发指南】(二十三)Qt 界面优化之 QSS 实战指南:从入门到精通,让你的界面颜值飙升!