gpt4 book ai didi

c++ - 在基于文本的冒险游戏中,如何防止长而困惑的条件代码?

转载 作者:可可西里 更新时间:2023-11-01 16:40:13 25 4
gpt4 key购买 nike

我正在创建一个基于文本的 C++ 冒险游戏。

在这个游戏中,你选择去哪里,你选择做什么等等,都会有很多的可能性。

我的问题是,如何防止这变得极其困惑。

示例:

假设在游戏的某一时刻,系统会询问您是去森林还是去沙漠。如果您选择沙漠,那将是与森林完全不同的故事情节。

那么我该如何防止我的代码看起来像这样。

if (player goes to the desert)advice? { 
/*Whole story line of the desert*/
else if (player goes to the forest) {
/*Whole story line of the forest */

在这些故事情节中,会有更多类似的条件,以及更详尽的故事情节,所以有什么方法可以让我在单独的文件中为一个故事情节编写代码,然后只针对该条件运行该文件?不管怎样,我可以单独做,而不是把所有的东西都写在条件语句中吗?如果我那样做,代码很快就会变得很长并且难以查看/编辑。

我正在考虑制作标题并在标题内制作函数来写出故事情节,所以我只需要输入函数,但如果我这样做了,那么我就无法访问游戏中的全局变量例如 playerNameplayerRace 等。

感谢任何和所有建议。我是 C++ 的新手,所以如果我错过了一些非常明显的东西,请原谅我。

最佳答案

我将对 Trevor Hickey 状态机命题进行一些扩展,因为这是个好主意。

首先你需要意识到你的故事情节可以使用一个很好的旧图来建模

  1. 独立故事是您认为完整且不可分离的游戏元素。例如有 DesertStory,ForestStory。它们是节点、顶点。你应该唯一地标识一个故事,例如通过它的名字
  2. 故事之间的关系是边缘。这些边缘需要是可序列化的,这意味着能够以对象和某种持久格式表示,并且您可以在它们之间加载和保存。因为您想自定义您的游戏,所以您可能希望允许持久格式基于文本,以便可以手动编辑它们并在游戏开始时加载它们。
  3. 现在状态机来自这样一个事实,即一个故事到另一个故事之间的转换是有条件的。

在编程术语中,它可能意味着:虚拟 Story 类

struct Story 
{
virtual std::string name() = 0;
virtual int play() = 0;
};

故事弧,故事之间的联系。它需要一个条件来触发,可以是上一个故事返回的内容

struct StoryConnection
{
std::string nameStorySource;
std::string nameStoryDestination;
int condition;
};

有了它,您可以在一侧编写单独的故事,然后分别编写故事弧。您还可以通过修改故事情节来调整和修改游戏逻辑。您可以玩多个游戏,每个游戏只是一组 StoryConnections。

逻辑很简单:

Story* s = new InitStateStory; 
while(!endOfGame(s))
{
int decision = s.play();
StoryConnection conn = getConnection(s.name(), decision);
Story* nextstory = creatNextStory(conn.nameStoryDestination);
delete s;
s = nextstory;
}

关于c++ - 在基于文本的冒险游戏中,如何防止长而困惑的条件代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39679878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com