gpt4 book ai didi

c++ - 如何根据事件顺序编写游戏

转载 作者:行者123 更新时间:2023-11-30 01:51:41 24 4
gpt4 key购买 nike

我正在用 C++ 为 NDS 编码。我打算编写一个游戏,其中事件按顺序发生并根据玩家的选择而改变,就像决策树一样。示例:

===位置===

  • 走廊:玩家可以通过的 2 扇门
  • 浴室:有通往地下室的 secret 入口
  • 地下室:通向走廊
  • 卧室:通向浴室

===顺序===

enter image description here

在每个房间里,都会不断检查按键。所以这是我最初想到的编写序列的基本且通常不好的方法:

void drawText()
{
//writes the specified text to the screen depending on the room
}
void playGame()
{ //This function gets called to play through the whole game
drawText();
while(1)
{
updateKeys();
if (newPress()) //New key is pressed
{
if (getButtonInt()==BATHROOM_INT)
bathroom(); //it will launch the basement function as a subroutine
else //Bedroom
bedroom(); //it will launch the bathroom function as a subroutine
drawText();
}
//When returning from room function, the
}
}

这种方法的一些缺点是:

  • 几乎不可能实现多人游戏,因为所有内容都需要不断更新
  • 其他功能几乎不可能更新(例如帧/时间跟踪器)
  • 添加一个在房间之间移动的选项会导致递归并可能导致内存溢出

那么,问题是:可以解决这些缺点的最佳替代方案是什么?

是的,我可以在 switch 语句中编写所有内容,并在 playGame 函数外部设置一个变量来跟踪 switch 语句中的位置,但该结构似乎不可读或不合逻辑。

最佳答案

嗯,闻起来像一个状态机。您的状态称为位置。门是到其他状态的过渡。

状态机的实现方法有很多种:switch & case, if ladder, or lookup tables (or maps).

为了开发第一个或两个状态,我使用 switchif 语句。但是,在 2nd 状态之后,我通常会转换为查找表。

查找表允许您在不更改状态逻辑或我所说的查找引擎的情况下添加更多状态。

查找表看起来像这样:

+--------+--------------+--------------+-----+  
|Present | state for | state for | ... |
| state | transition 1 | transition 2 | ... |
+--------+--------------+--------------+-----+

一个实现是结构常量数组。搜索当前状态 ID,然后根据转换 ID 提取下一个状态值。简单。

为了获得更多乐趣,您可以用指针或对函数的引用代替“转换状态”框(字段)。这允许您根据转换执行功能。

对此进行扩展,您可以拥有一个状态表容器,例如每个“游戏关卡”都有一个状态表。

尝试将您的视角从以执行为导向转变为以数据为导向。您可以让大部分游戏 table 都被驱动,并拥有一个小型“引擎”。嗯,看起来这可以扩展到使用 Storyboard和...

编辑 1: map 和数据库
如果您选择使用类似 std::map 的东西,您需要将查找表拆分为 {key, value} 对。一个键看起来像现在的状态。该值看起来像过渡框。但是等等,...

转换看起来像是关系或关联的容器。转换 ID 与状态 ID 或状态函数相关联。闻起来就像另一张 table 或 map 。

所有这些数据通常称为数据库。您可以使用数据库 来包含您的状态。哇,它会为你处理存储和数据类型。

但是,我离题了。一步一步...

关于c++ - 如何根据事件顺序编写游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25818323/

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