在创建文本冒险时使用 OOP
Using OOP when creating a text adventure
叫我钝或任何你喜欢的名字。我的大学从未正确地教过我 OOP,因此我更喜欢用 C 编写代码。但是,为了扩展和自学一些新技能,我决定尝试自学更多对象面向技能以及参与我的其他 passions/hobbies 文字冒险之一。我将在 C++ 中进行尝试,因为这是我大部分本科生使用的语言,所以我最了解它。我挂断的是我已经为 "location" 应该具有的基本属性和方法编写了一个通用的 .h 文件。如果我想做的只是创建一堆房间并能够去 N/S/E/W 到另一个普通房间并打印房间的描述,那就太好了。我不知道该怎么做是对该头文件进行更具体的实现。恐怕我没有很好地解释我的问题,所以让我用一个例子来说明:
我有一个房间,就叫它"Living Room"吧。它的北边是"Kitchen"。它的南面是 "Den"。 "Living Room"和"Den"之间有一扇门。用户可以说 "N" 并且 goNorth() 将被调用并且一切都将是完美的。但是,如果用户说 "S",我希望它给他们某种 "you can't go that way",直到他们打开门。这将要求我要么 1) 完全放弃我的 OOP 想法,只是将每个房间写成它自己的一组函数和变量(我过去是怎么做的)或 2) 对我包含的头文件进行特定的实现每个房间的所有这些功能和变量(理论上我想怎么做)但是我只是不知道这在技术上是否可行以及如何做到这一点。如果有人能给我指出正确的方向,尽量少用名字,我将非常感激。
如你所知,我很清楚有完整的语言和引擎专门用于此过程,我现在不想制作一款大型的全面游戏,我只想提高我的水平编程技能,这就是我走这条路的原因。
这可能会因为范围太广而被关闭,因为有很多方法可以解决它。以下是我在类似情况下所做的大致操作:
Room
有一个方法 GetConnection(direction)
和 returns 一个指向 Connection
对象的指针(或者一个空指针,如果没有办法的话)。
Connection
对象有一个虚拟 Traverse()
方法。基本的 Connection
有一个指向目的地的成员,而 Traverse()
方法只是将玩家的位置更新为目的地。
对于具有额外限制的 Connection
,派生的 class,比如说 ConnectionThroughDoor
有一个覆盖的 Traverse()
方法来检查门是否打开(或任何限制是)在调用基地 class Traverse()
以实际移动玩家之前。
总而言之,考虑编程接口并考虑是否需要额外的 classes 来表示其他概念(例如 Rooms
之间的 Connection
)。
叫我钝或任何你喜欢的名字。我的大学从未正确地教过我 OOP,因此我更喜欢用 C 编写代码。但是,为了扩展和自学一些新技能,我决定尝试自学更多对象面向技能以及参与我的其他 passions/hobbies 文字冒险之一。我将在 C++ 中进行尝试,因为这是我大部分本科生使用的语言,所以我最了解它。我挂断的是我已经为 "location" 应该具有的基本属性和方法编写了一个通用的 .h 文件。如果我想做的只是创建一堆房间并能够去 N/S/E/W 到另一个普通房间并打印房间的描述,那就太好了。我不知道该怎么做是对该头文件进行更具体的实现。恐怕我没有很好地解释我的问题,所以让我用一个例子来说明:
我有一个房间,就叫它"Living Room"吧。它的北边是"Kitchen"。它的南面是 "Den"。 "Living Room"和"Den"之间有一扇门。用户可以说 "N" 并且 goNorth() 将被调用并且一切都将是完美的。但是,如果用户说 "S",我希望它给他们某种 "you can't go that way",直到他们打开门。这将要求我要么 1) 完全放弃我的 OOP 想法,只是将每个房间写成它自己的一组函数和变量(我过去是怎么做的)或 2) 对我包含的头文件进行特定的实现每个房间的所有这些功能和变量(理论上我想怎么做)但是我只是不知道这在技术上是否可行以及如何做到这一点。如果有人能给我指出正确的方向,尽量少用名字,我将非常感激。
如你所知,我很清楚有完整的语言和引擎专门用于此过程,我现在不想制作一款大型的全面游戏,我只想提高我的水平编程技能,这就是我走这条路的原因。
这可能会因为范围太广而被关闭,因为有很多方法可以解决它。以下是我在类似情况下所做的大致操作:
Room
有一个方法 GetConnection(direction)
和 returns 一个指向 Connection
对象的指针(或者一个空指针,如果没有办法的话)。
Connection
对象有一个虚拟 Traverse()
方法。基本的 Connection
有一个指向目的地的成员,而 Traverse()
方法只是将玩家的位置更新为目的地。
对于具有额外限制的 Connection
,派生的 class,比如说 ConnectionThroughDoor
有一个覆盖的 Traverse()
方法来检查门是否打开(或任何限制是)在调用基地 class Traverse()
以实际移动玩家之前。
总而言之,考虑编程接口并考虑是否需要额外的 classes 来表示其他概念(例如 Rooms
之间的 Connection
)。