我是一名初学者程序员(虽然他具有C++基础知识和C++数据结构,但他具有大量与视频游戏有关的与设计相关的脚本编写经验,但几乎没有编程经验-只是诸如循环,流控制等基本知识)。和算法的类(class)在我的带领下)。我正在从事一个文本冒险的个人项目(实际上,早在很久以前我就已经在Python中写过它,然后才知道类是如何工作的-一切都是字典-太可耻了)。我正在用类在C++中对其进行“重新制作”,以摆脱仅完成家庭作业的麻烦。
我已经编写了我的播放器和房间类(这很简单,因为每个类只需要一个类)。我要讲的是物品类(物品是房间里的任何东西,例如火炬,火,标牌,容器等)。我不确定如何处理项目基类和派生类。这是我遇到的问题。
最佳答案
解决问题的一种可能方法是多态。通过使用多态,您可以(例如)拥有一个describe
函数,该函数在被调用时会导致该项目向玩家描述自己。您可以对use
和其他常见动词执行相同的操作。
另一种方法是实现更高级的输入解析器,该解析器可以识别对象并将动词传递给项目的某些(多态)功能,以供其自身处理。例如,每个项目都可以具有一个返回可用动词列表的函数,以及一个返回该项目的“名称”列表的函数:
struct item
{
// Return a list of verbs this item reacts to
virtual std::vector<std::string> get_verbs() = 0;
// Return a list of name aliases for this item
virtual std::vector<std::string> get_names() = 0;
// Describe this items to the player
virtual void describe(player*) = 0;
// Perform a specific verb, input is the full input line
virtual void perform_verb(std::string verb, std::string input) = 0;
};
class base_torch : public item
{
public:
std::vector<std::string> get_verbs() override
{
return { "light", "extinguish" };
}
// Return true if the torch is lit, false otherwise
bool is_lit();
void perform_verb(std::string verb, std::string) override
{
if (verb == "light")
{
// TODO: Make the torch "lit"
}
else
{
// TODO: Make the torch "extinguished"
}
}
};
class long_brown_torch : public base_torch
{
std::vector<std::string> get_names() override
{
return { "long brown torch", "long torch", "brown torch", "torch" };
}
void describe(player* p) override
{
p->write("This is a long brown torch.");
if (is_lit())
p->write("The torch is burning.");
}
};
然后,如果玩家输入
light brown torch
解析器浏览所有可用项(玩家 list 中的项,然后是房间中的项),获取每个项的名称列表(调用项get_names()
函数)并将其与brown torch
进行比较。如果找到匹配项,则解析器通过适当的参数(perform_verb
)调用items item->perform_verb("light", "light brown torch")
函数。您甚至可以修改解析器(和项)以单独处理形容词,甚至修改诸如
the
之类的文章,或者保存最后使用的项,以便可以使用it
进行引用。构造不同的房间和物品很繁琐,但是一旦完成了良好的设计,仍然是微不足道的(您确实应该花一些时间来创建需求,分析需求并创 build 计)。真正困难的部分是编写一个不错的解析器。
请注意,这只是在这种游戏中处理项目和动词的两种可能方式。还有许多其他方法,其中有很多都可以列出它们。
关于c++ - 文字冒险游戏-如何区分一种元素类型以及如何构造元素类/子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62278098/