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

如何用事件序列编程游戏 我在C++中编写NDS代码。我计划写一个游戏,在这个游戏中,事件按顺序发生,并根据玩家的选择而变化,就像决策树一样。例如:,c++,updates,updating,sequential,game-theory,C++,Updates,Updating,Sequential,Game Theory,==位置=== 过道:玩家可以通过两扇门 浴室:有通往地下室的秘密入口 地下室:通向走廊 卧室:通向浴室 ==序列=== 在每个房间里,都会不断检查按键是否正确。因此,这是我最初想到的编码序列的基本且通常不好的方法: void drawText() { //writes the specified text to the screen depending on the room } void playGame() { //This function gets called to

==位置===

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

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

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

Hmmm,闻起来像一个状态机。你们的州被称为地点。门是到其他状态的过渡

有许多方法可以实现状态机:
开关
&
案例
如果
梯形图或查找表(或
映射
s)

为了开发前一个或两个状态,我使用
switch
if
语句。然而,在第二个状态之后,我通常转换为查找表

查找表允许您添加更多状态,而无需更改状态逻辑或我所称的查找引擎

查找表的外观如下所示:

+--------+--------------+--------------+-----+  
|Present | state for    | state for    | ... |  
| state  | transition 1 | transition 2 | ... |  
+--------+--------------+--------------+-----+  
一种实现是结构的常量数组。搜索当前状态ID,然后根据转换ID提取下一个状态值。简单

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

扩展它,您可以有一个状态表容器,例如每个“游戏级别”有一个状态表

尝试将您的视角从面向执行改为数据驱动。您可能能够使您的游戏桌的大部分驱动,并有一个小的“引擎”。嗯,看起来这可以扩展到使用故事板和

编辑1:地图和数据库
如果选择使用类似于
std::map
,则需要将查找表拆分为
{key,value}
对。一个键看起来像当前状态。该值类似于转换框。但是等等

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

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


但是,我离题了。一步一个脚印…

嗯,闻起来像个状态机。你们的州被称为地点。门是到其他状态的过渡

有许多方法可以实现状态机:
开关
&
案例
如果
梯形图或查找表(或
映射
s)

为了开发前一个或两个状态,我使用
switch
if
语句。然而,在第二个状态之后,我通常转换为查找表

查找表允许您添加更多状态,而无需更改状态逻辑或我所称的查找引擎

查找表的外观如下所示:

+--------+--------------+--------------+-----+  
|Present | state for    | state for    | ... |  
| state  | transition 1 | transition 2 | ... |  
+--------+--------------+--------------+-----+  
一种实现是结构的常量数组。搜索当前状态ID,然后根据转换ID提取下一个状态值。简单

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

扩展它,您可以有一个状态表容器,例如每个“游戏级别”有一个状态表

尝试将您的视角从面向执行改为数据驱动。您可能能够使您的游戏桌的大部分驱动,并有一个小的“引擎”。嗯,看起来这可以扩展到使用故事板和

编辑1:地图和数据库
如果选择使用类似于
std::map
,则需要将查找表拆分为
{key,value}
对。一个键看起来像当前状态。该值类似于转换框。但是等等

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

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


但是,我离题了。一步一个脚印…

您可能需要一个数据结构,该结构可以为每个房间定义以特定移动方向到达的房间。研究“状态”设计模式或状态机。您的图表看起来像是一个带有转换的状态机的图形。研究“关系数据库教程”和“数据库范式”。这可能会对您以后有所帮助。作为对Thomas Mathews答案的补充,请看一看:您可能需要一个数据结构,该结构可以为每个房间定义以特定移动方向到达的房间。研究“状态”设计模式或状态机。Y