1

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

===地点===

  • 走廊:玩家可以通过的两扇门
  • 浴室:地下室有秘密入口
  • 地下室:通往走廊
  • 卧室:通往浴室

===顺序===

在此处输入图像描述

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

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 语句中的位置,但结构似乎不可读或不合逻辑。

4

1 回答 1

4

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

实现状态机的方法有很多: switch& caseif梯形图或查找表(或maps)。

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

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

查找表看起来像:

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

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

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

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

尝试将您的观点从执行导向转变为数据驱动。您也许可以使您的大部分游戏桌被驱动并拥有一个小型“引擎”。嗯,看起来这可以扩展到使用故事板和......

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

转换看起来像一个关系或关联的容器。转换 ID与状态 ID 或状态函数相关联。闻起来就像另一张桌子或地图。

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

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

于 2014-09-12T23:51:22.013 回答