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