Lig*_*ggi 10 .net c# text adventure
编辑:如果你不能阅读这个庞大的问题,我会在底部写一个摘要.
我目前正在研究一种用于C#的文本冒险的"框架",作为编码练习.在此框架中,可能的操作由"交互"类定义.
潜在的"可操作"对象是库存物品(棍子,枪,剑),环境物品(墙,门,窗)和角色(人,动物).其中每个都有一个属性,它是一个交互列表.目前,交互基本上是一个"动作/响应"名称值对.当您键入"粉碎窗口"时,它会查看播放器可用的所有可操作项目并匹配主题(在本例中为"窗口").然后确定操作是"粉碎"并在窗口上的交互列表(环境项)中查找以获得对Smash操作的响应,然后将其写入控制台.
这一切都已完成,但这就是我被困的观点:
一个行动有任何数量的潜在后果,每个潜在的互动都会有所不同.这些是:
- 通过查找交互,可能与第二个主题,返回描述操作结果的响应
EITHER - 动作的主题(库存项目,环境项目或角色)改变它的描述EG."冲墙"可以改变墙的描述来描述墙上的凹痕 或者 - 动作的主体被另一个项目EG替换."粉碎瓶子"导致"瓶子"变成"破瓶子"或"杀死约翰"导致角色约翰被环境项目"约翰的尸体"取代.
- 返回描述先前变化EG的响应."破碎的瓶子散落在地板上."
- 区域的描述已更改.例如."粉碎灯泡"导致房间的描述改变以描述黑色的房间
- 从库存或环境EG添加/删除项目."拿起瓶子".您现在在库存中有一个瓶子,瓶子已从环境中移除.
- 可以移动的方向和它们导致的区域改变EG."用钥匙解锁门"允许您将东移到另一个房间
- 将玩家移动到新区域EG."往北走"带你到另一个地方.
我需要以某种方式确定特定交互应该调用哪些后果,并调用它们.一项行动可能会使用其中的一些后果,或只是一种.
例如,如果项目是瓶子:
" 用水填充瓶子 "将首先返回一个回复,描述您已用水填充瓶子.然后它将用"瓶装水"物品替换"瓶子"物品.这是两个后果,返回响应并替换项目.
说你当时要" 在窗口扔一瓶水 ".这更复杂.它会首先返回一个描述发生事件的响应,瓶子和窗口都会粉碎,水会到处流动.瓶子将从玩家的库存中移除.接下来," 瓶装水 "将被"破瓶"取代,"窗户"将被"破窗"取代.区域描述也会改变以反映这一点.这是五个后果,返回响应,从库存中删除项目,替换两个项目并更新当前区域的描述.
正如您所看到的,我需要一种通用的方法,能够在每个"交互"的基础上定义该操作的后果,并适当地更新其他对象,例如Item,Player(用于库存)和Area.
如果不清楚我很抱歉,我会尽力澄清是否有人有任何疑问.
编辑:我有没有办法在交互上定义一个方法,我可以通过多种方法调用(及其参数)?返回的初始响应将是默认的强制结果,如果指定则可能有额外的响应.
例如,在上面的例子中,对于第一次交互,"填充水",我会告诉它返回一个响应("你已用水填充瓶子")并且还调用一个ReplaceItem方法来取代"瓶子"用"一瓶水".
对于第二次交互,我会告诉它返回一个响应("瓶子通过空气冲进......"),在动作主题上调用RemoveFromInventory,在瓶子上调用UpdateStatus("瓶子被粉碎")并且窗口("窗口被粉碎")并调用UpdateAreaDescription来更改当前区域的描述("你正站在一个单一窗口的房间里,玻璃碎成碎片").
这听起来可行吗?为了所有不同的可能交互,我试图尽可能保持通用.
编辑2:进一步澄清,并试图总结问题:
在我的游戏中,有Actionable对象(一个瓶子,一面墙,John).每个Actionable对象都有一个Interaction对象列表,描述了玩家如何与它们进行交互.此时,Interaction具有"Name"属性("throw","hit","break")并返回Response("You throw the").
我试图解决的问题是,交互还需要做许多其他事情,每个特定的交互都会有所不同.我们以一个玻璃瓶为例.
"扔玻璃瓶"
- 返回一个回复("你扔了玻璃瓶.")
- "瓶子",从玩家的库存中删除.
- 用新的替换来反映变化.("瓶子"替换为"破瓶子").
- 返回第二个响应("玻璃瓶的碎片散落在地板上").
"在窗口扔玻璃瓶"
- 返回一个响应("你把玻璃瓶扔在窗户上.")
- 从玩家的库存中删除对象"瓶子".
- 将对象替换为新对象以反映更改.("瓶子"替换为"破瓶子").
- 第二个可选对象替换为new以反映更改.("窗口"替换为"破窗").
- 更新当前Area的"Description"属性.("你站在一个房间里,只有一个破窗户.").
当我创建交互时,如何更改它们执行的其他操作,例如主题的状态更改或当前区域描述的更改?
如果你需要更多上述行动的例子,请告诉我,我会再做一些.
好吧,伙计们,这就是我的处理方式。这是我能想到的最通用的方式,我认为它适合我想要实现的目标。
我向 Interaction 类添加了一个“Invoke()”方法,一个名为 IActionResult 的新接口,它定义了一个“Initiate()”方法,并为每个可能的结果添加了许多不同的 ActionResult 类型。我还在交互中添加了一个 ActionResults 列表。Invoke 方法将简单地循环遍历所有 IActionResult 对象并调用 Initiate() 方法。
当您在项目上定义交互时,您将传入该交互的动词列表,然后根据该交互的结果添加多个 ActionResult 对象。
我还添加了一个 GlobalActionReference,每次执行操作时都会更新它,并且 ActionResult 将可以通过它适当地访问需要更新的对象。
我真的很感谢您的所有建议,如果我不清楚我的问题或我的评论(甚至这个答案),我很抱歉。感谢您的帮助。