c# - 状态机 - 如何将有关成功操作的信息传递给状态
问题描述
我在我的城市管理游戏中使用我自己的状态机作为我的人工智能,它运行得相当好。我使用了一个非常简单的界面:
public interface IState
{
int Id { get; set; }
void Enter();
void Execute();
void Exit();
}
改变状态:
public void ChangeState(IState newState)
{
if (currentState != null)
currentState.Exit();
if (currentState != newState)
{
currentState = newState;
currentState.Enter();
}
}
我唯一的问题是我发现自己重写了很多逻辑,以给出一个场景:
有面包师、铁匠、建筑工人等等。所有这些职业都有一个状态,可以找到最近的存储设施并去那里收集他们工作所需的材料。
所有这些都使用相同的逻辑,除了说明当你到达仓库时要做什么的那一行之外,即面包师想要得到小麦然后返回他们的面包店。铁匠会想要一些铁并返回给他们的铁匠。
基本上他们所做的是:
- 查找存储
- 去存储
- 如果存储有资源,则更改状态以返回工作场所
- 否则找到下一个最近的存储并查看该存储是否有资源
- 重复 3 直到找到资源。
正如你可以想象的那样,我对“回到工作场所”状态有完全相同的问题,除了在到达时要做什么之外,它在该状态下基本上是完全相同的逻辑。
有没有一些聪明的方法可以创建一个名为“FindStorageState”的单一状态,并在我的设备到达时向它传递信息?
这是一个很好的例子,说明了一个职业的样子:
解决方案
推荐阅读
- c++ - 在新版本的 Visual Studio 中构建后,可执行文件在 Azure 上无法正常工作
- php - 警告:mysqli::__construct(): php_network_getaddresses: getaddrinfo failed: No such host is known
- javascript - 通过 SCSS 以横向模式打印的页面格式样式
- json - URL 参数使用 OR 过滤 JSON
- r - 有没有办法在 R 中对 ChainLadder 损失三角形的列进行切片?
- python - sklearn kmeans忽略集群的数量
- firebase - Firestore 子集合 ID
- c++ - Does anybody know how to link against `ld` on `WSL`?
- javascript - 科尔多瓦如何告诉浏览器文件传输 CORS 许可
- excel - 变量在 VBA 中保持为空 Do while 迭代