c# – 文本冒险中的编码交互

前端之家收集整理的这篇文章主要介绍了c# – 文本冒险中的编码交互前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
编辑:如果你不能麻烦地阅读这个庞大的问题,那么我最后总结一下.

我正在为C#编写一个文本冒险的“框架”,作为编码练习.在此框架中,可能的操作由“交互”类定义.

潜在的“可操作”物品是库存物品(棍,枪,剑),环保物品(墙壁,门,窗)和人物(人,动物).它们中的每一个具有作为交互列表的属性.目前,交互基本上是一个“动作/响应”名称值对.当您键入“粉碎窗口”时,它会查看播放器可用的所有可能的可操作项目,并与主题匹配(在本例中为“窗口”).然后,它的作用是“粉碎”,并在“窗口中的交互列表”(环境项目)中查找,以获取“粉碎”操作的响应,然后将其写入控制台.

这一切都完成了,但这里是我被困的一点:

一个行动有许多潜在的后果,每个潜在的互动不同.这些是:

– 通过查看交互作用来返回描述动作结果的响应,可能是第二个主题

无论是
– 行动(库存项目,环境项目或人物)的主题更改其描述
例如. “打墙”可以改变墙壁的描述来描述墙上的凹痕
要么
– 动作的主题被另一个项目所取代
例如. “粉碎瓶子”导致“瓶子”改为“破瓶”或“杀死约翰”,结果是John被“John’s corpse”环境项目所取代.

– 返回描述以前更改的响应
例如. “瓶子的破碎物散落在地板上.”

– 区域的描述已更改.
例如. “粉碎灯泡”导致房间的描述变化来描述一个沥青黑色房间

– 从库存或环境中添加/删除项目
例如. “拿起瓶子”.您现在在库存中有一个瓶子,瓶子从环境中移除.

– 可以移动的方向及其导致的区域发生变化
例如. “用钥匙解锁门”可以让你把东移到另一个房间

– 玩家移动到一个新的区域
例如. “去北”带你去另一个地方.

我需要以某种方式确定特定交互应该调用哪些后果,并调用它们.一个行动可能会潜在地使用这些后果,或只是一个.

例如,如果该项目是瓶子:

“用水填满瓶子”首先会回复一个描述你已经用水充满瓶子的回应.然后用“一瓶水”项目取代“瓶子”物品.
这是两个后果,返回一个响应并替换一个项目.

说你当时要做“在窗口扔一瓶水”.这更复杂.它会首先返回一个描述发生的事件的响应,瓶子和窗户都会粉碎,水会遍布各处.该瓶将从玩家的库存中移除.
接下来,“瓶子”将被“破瓶”所取代,“窗口”将被“破窗”所代替.区域描述也将改变以反映这一点.
这是五个后果,返回响应,从库存中删除一个项目,替换两个项目并更新当前区域的描述.

正如你所看到的,我需要一种通用的方式,可以在每个“交互”基础上定义,该操作的后果将如何,并更新其他对象,如物料,播放器(库存)和面积适当.

如果这不清楚,我很抱歉,如果有任何问题,我会尽力澄清.

编辑:有没有办法为我定义一个交互方法,我可以传递一些方法调用(和他们的参数)?返回的初始响应将是默认的强制性后果,然后如果指定可能会有额外的响应.

例如,在上面的例子中,对于第一次交互,“填充水”,我会告诉它返回一个响应(“你已经用水填充了瓶子”),还可以调用一个ReplaceItem方法来代替“瓶“主题与”一瓶水“.

对于第二次交互,我会告诉它返回响应(“瓶子通过空气进入…”),调用RemoveFromInventory对动作的主题,调用瓶子上的UpdateStatus(“瓶子被砸”)和窗口(“窗口被粉碎”),并调用UpdateAreaDescription来更改当前区域的描述(“您正在一个窗口中放置一个房间,玻璃碎片”).

这听起来很可行吗为了所有不同的可能的相互作用,我试图保持尽可能的通用.

编辑2:进一步澄清,并试图总结问题:

在我的游戏中,有可动物体(瓶,墙,约翰).每个Actionable对象都有一个列表
描述玩家如何与他们互动的交互对象.目前,一个互动有一个
“Name”属性(“throw”,“hit”,“break”)并返回一个Response(“你抛出”).

我想要解决的问题是,互动也需要做许多其他事情,不同
通过每个特定的交互.以玻璃瓶为例.

“抛玻璃瓶”
回复(“你把玻璃瓶丢了”)
– “瓶”,从玩家的库存中删除.
– 用新的代替来反映变化. (“瓶”替换为“破瓶”).
– 返回第二个答复(“玻璃瓶的碎片分散在地板上”).

“把玻璃瓶扔在窗户”
– 返回答复(“你把玻璃瓶扔在窗边”)
– 对象“瓶”,从玩家的库存中删除.
– 对象被替换为一个新的对象来反映变化. (“瓶”替换为“破瓶”).
– 第二个可选对象被替换为新的以反映更改. (“窗口”替换为“破碎的窗口”).
– 当前区域的“说明”属性已更新. (“你站在一个房间,一个破碎的窗户”).

当我创建交互时,如何更改其执行的其他操作,例如状态更改
或者改变当前区域的描述?

如果您需要更多的上述操作示例,请告诉我,我会再做一些.

解决方法@H_403_86@
我想你应该决定一定数量的动词,你会认识到,然后每一个对象决定哪些动词能够响应.

锁定对象识别动词

>看
> UseItemOn(Key001,LockPicks,Sledgehammer,…)
>打孔

这样一来,您可以一般地处理它无法识别的动词,例如“您不能<动词>< object>,并处理它用事件或其他任何事物识别的动词.

编辑

根据你的评论,我显然只是扫描你的问题(对我来说太久了).不过,我看不出有什么区别,真的.关键是,一个对象参与一个事件.从瓶子的角度来看,它被墙壁撞击.从墙的角度来看,它被一瓶砸了.这两个对象都将有一个动词列表,他们将以某种方式响应.

所以如果你打算让墙壁响应任何被抛出的对象,那么你需要在它的列表中添加一个Collide动词.你会想要指定哪些对象应该关心碰撞,也可能是每个对象应该如何应对特定的力量等等.

但原则是一样的.对于任何事件,都有一些参与者,每个参与者都会有一些关心的刺激,对于那些刺激,它将具有某些刺激来源的对象.如果它是一个它关心的动词,但它的起源不是它关心的对象,那么它将有效地忽略它 – 或者以一些香草的方式做出回应.

瓶参与与墙的碰撞.瓶子在动词列表中列出了碰撞交互类型.它可能有一个单一的对象,它关心碰撞,或者它可能有一个值Any,或AnySolid,或任何.有一百万种建筑方式.在任何情况下,墙也参与并可能在动词列表中有碰撞交互类型.但是它只关心与大锤物体的碰撞 – 或者是具有10或更大质量的AnySolid …

你也可以用接口来做.你可以有一个LootableObject来实现ICollidible接口,或者什么.当任何可疑(例如,瓶子)执行其碰撞方法时,它将需要某些参数:它是多么脆弱,它接收多少力量,碰撞物体是否关心事物等等.

它可能充满液体,因此它将实现具有溢出方法的IContainer界面,以及具有Drink方法的IConsumeable界面.它可能是一个实现具有Unlock(obj Key)方法和Pick(int PickSkill)方法的ILockable接口的锁.这些方法中的每一种都可以在对象和其他参与者的交互中产生一些状态变化.如果你喜欢,你可以用Events来完成.

基本上你需要决定你想要的(un)可预测性水平,然后组成一个交互矩阵(不一定是物理学,而是你打算在一个锁定事件,一个碰撞事件,一个饮酒事件上进行的任何一种互动)涉及某些可预测的属性.

原文链接:https://www.f2er.com/csharp/93590.html

猜你在找的C#相关文章