我最近一直在通过编写一个简单的基于文本的冒险游戏来娱乐自己,而我一直停留在看似非常简单的设计问题上。
简要概述一下:游戏分为Room
对象。每个对象都有该房间Room
中的Entity
对象的列表。每个对象Entity
都有一个事件状态,它是一个简单的string-> boolean映射,以及一个动作列表,它是一个string-> function映射。
用户输入采用形式[action] [entity]
。在Room
使用实体名称返回合适的Entity
对象,然后使用操作名称来找到正确的功能,并执行它。
为了生成房间描述,每个Room
对象显示其自己的描述字符串,然后附加每个的描述字符串Entity
。该Entity
描述可基于其状态(“门被打开”,“门关闭”,“门被锁定”,等等)。
问题出在这里:使用这种方法,我需要快速实现的描述和动作函数的数量就一发不可收拾。我的起居室仅在5个实体之间就具有约20种功能。
我可以将所有动作组合为一个函数,并通过if-else /进行切换,但是每个实体仍然是两个函数。我还可Entity
以为常见/通用对象(例如门和钥匙)创建特定的子类,但是到目前为止,这还不多。
编辑1:根据要求,这些动作函数的伪代码示例。
string outsideDungeonBushesSearch(currentRoom, thisEntity, player)
if thisEntity["is_searched"] then
return "There was nothing more in the bushes."
else
thisEntity["is_searched"] := true
currentRoom.setEntity("dungeonDoorKey")
return "You found a key in the bushes."
end if
string dungeonDoorKeyUse(currentRoom, thisEntity, player)
if getEntity("outsideDungeonDoor")["is_locked"] then
getEntity("outsideDungeonDoor")["is_locked"] := false
return "You unlocked the door."
else
return "The door is already unlocked."
end if
描述函数的行为几乎相同,检查状态并返回适当的字符串。
编辑2:修改了我的问题措辞。假设可能有大量游戏对象与其他对象没有共同的行为(对特定动作的基于状态的响应)。与为每个特定于实体的操作编写自定义函数相比,有没有一种方法可以以更简洁,更可维护的方式定义这些独特行为?