编辑:如果您懒得阅读这个庞大的问题,我在底部做了一个总结。
我目前正在为我将在 C# 中进行的文本冒险开发一种“框架”,作为编码练习。在此框架中,可能的操作由“交互”类定义。
潜在的“可操作”对象是库存项目(棍子、枪、剑)、环境项目(墙、门、窗)和角色(人、动物)。其中每一个都有一个属性,即交互列表。目前,交互基本上是一个“动作/响应”名称值对。当您键入“粉碎窗口”时,它会查看播放器可用并匹配主题的所有可能的可操作项目(在本例中为“窗口”)。然后计算出该操作是“粉碎”,并在窗口(环境项)上的交互列表中查找以获取对粉碎操作的响应,然后将其写入控制台。
这一切都完成了,但这是我卡住的一点:
一个动作具有任意数量的潜在后果,这些后果因每个潜在的交互作用而异。这些是:
- 通过在交互中查找它来返回描述操作结果的响应,可能与第二个主题
EITHER - 动作的主题(物品栏物品、环境物品或角色)改变了它的描述 EG。“punch wall”可以改变墙壁的描述来描述墙上的凹痕 或 - 动作的主题被另一个项目 EG 替换。“粉碎瓶子”导致“瓶子”变为“破瓶子”或“杀死约翰”导致角色约翰被环境项目“约翰的尸体”取代。
- 返回描述先前更改 EG 的响应。“瓶子的碎片散落在地板上。”
- 更改了区域的描述。例如。“粉碎灯泡”导致房间的描述改变为描述漆黑的房间
- 从库存或环境 EG 中添加/删除项目。“捡瓶子”。现在,您的库存中有一个瓶子,并且该瓶子已从环境中移除。
- 可用于移动的方向和它们导致的区域已更改 EG。“用钥匙开锁”可以让你向东移动到另一个房间
- 玩家被移动到一个新的区域 EG。“往北走”带你到另一个区域。
我需要以某种通用方式确定特定交互应该调用这些后果中的哪一个,并调用它们。一个动作可能会使用许多这些后果,或者只是一个。
例如,如果该项目是一个瓶子:
“ fill bottle with water ”将首先返回一个描述您已将瓶子装满水的响应。然后它将用“bottle of water”项目替换“bottle”项目。这是两个后果,返回响应和替换项目。
假设你当时要做“向窗户扔瓶水”。这更复杂。它首先会返回一个描述所发生事件的响应,瓶子和窗户都会破碎,水会到处流。该瓶子将从玩家的库存中移除。接下来,将“瓶水”替换为“破瓶”,将“窗”替换为“破窗”。区域描述也会改变以反映这一点。那是五个后果,返回响应,从库存中删除一个项目,替换两个项目和更新当前区域的描述。
正如你所看到的,我需要一种通用的方式来定义每个“交互”的基础,该操作的后果是什么,并适当地更新其他对象,如项目、播放器(用于库存)和区域。
如果不清楚,我很抱歉,如果有人有任何问题,我会尽力澄清。
编辑:有没有办法让我在交互上定义一个方法,我可以将许多方法传递给调用(及其参数)?返回的初始响应将是默认的强制结果,如果指定,则可能会有额外的结果。
例如,在上面的示例中,对于第一个交互“加水”,我会告诉它返回一个响应(“你已经给瓶子装满了水”),并调用一个 ReplaceItem 方法来替换“瓶”主题与“瓶水”。
对于第二次交互,我会告诉它返回一个响应(“瓶子在空中飞驰而入......”),在动作主题上调用 RemoveFromInventory,在瓶子上调用 UpdateStatus(“瓶子被砸碎”)和窗户(“窗户被砸碎了”)并调用 UpdateAreaDescription 来更改当前区域的描述(“你站在一个只有一扇窗户的房间里,玻璃被砸得粉碎”)。
这听起来可行吗?为了所有不同的可能交互,我试图使其尽可能通用。
编辑2:进一步澄清,并试图总结问题:
在我的游戏中,有可操作的对象(瓶子、墙、约翰)。每个 Actionable 对象都有一个交互对象列表,描述玩家如何与它们交互。目前,Interaction 具有“Name”属性(“throw”、“hit”、“break”)并返回 Response(“You throw the”)。
我要解决的问题是交互还需要做许多其他事情,这些事情因每个特定的交互而异。让我们以玻璃瓶为例。
“扔玻璃瓶”
- 返回响应(“你扔了玻璃瓶。”)
- “瓶子”从玩家的物品栏中移除。
- 替换为新的以反映更改。(“瓶子”替换为“破瓶子”)。
- 返回第二个响应(“玻璃瓶碎片散落在地板上”)。
“throw glass bottle at window”
- 返回响应(“你将玻璃瓶扔到了窗口。”)
- 对象“Bottle”从玩家的物品栏中移除。
- 将对象替换为新对象以反映更改。(“瓶子”替换为“破瓶子”)。
- 第二个可选对象被替换为新对象以反映更改。(“窗口”替换为“破窗”)。
- 当前区域的“描述”属性已更新。(“你站在一个房间里,只有一扇破窗户。”)。
当我创建交互时,如何改变它们执行的其他操作,例如对主题的状态更改或对当前区域描述的更改?
如果您需要更多上述操作示例,请告诉我,我会再做一些。