一些 AI 技术是 CPU 密集型的,例如基于启发式的广度优先或深度优先搜索,适用于许多策略游戏。
像这样的搜索需要您建立 API,以便可以检索当前的“状态”(游戏状态的完整表示),以及该状态(或任何状态)的所有可能移动/更改的列表,以及这些移动/更改中的每一个都会导致的新状态。
完成此操作后,任何算法都可以进行适当的 API 调用,以查看可以移动到哪些状态,以及可以从这些状态移动到哪些状态等。可以达到的状态将呈指数增长越多你试图向前看的动作,以至于即使是 2 个动作对计算机来说也可能是一项可怕的任务。
由于这个困难,启发式分数被用来评估跟随某些分支的可能有用性,因此搜索算法可能会立即丢弃来自当前状态的第一个可能移动的 90%。
遵循这种获取状态、评估状态并查看从状态到后续状态的可能移动/变化模式的 AI,您显然可以对 AI 进行软编码,但 AI 为启发式评分状态所做的工作可能是任何事情,而且您的软代码就像一种迷你语言。就个人而言,除非你想实现一种迷你语言,否则这是一种相当艰苦的工作方式。此外,您的软代码将需要某种解释,这可能使其速度比代码慢两倍,或者慢 10 或 100 倍......并且任何指数难度的技术都意味着性能非常非常重要。如果选择的 AI 方法不是指数级困难或普通困难,则可以使用软代码,但您仍然必须实现一种迷你语言。
您当然可以将 AI 实现为一个单独的程序,通过网络与您的游戏程序进行通信。这可能只是本地主机到本地主机,但当然不必如此。其性能在某种程度上取决于网络延迟和带宽,但这可能是也可能不是一个重大问题。
您还可以将 AI 实现为动态可加载库(即您的游戏可能会在某个文件夹中查看,看到一堆 lib 文件并尝试在运行时加载它们(例如,对于 UNIX 使用 dlopen())。然后您可以将新的 AI 放入任何时候都无需触及游戏本身。如果您的主要要求是拥有插件 AI 并在性能很重要的情况下保持性能,那么这可能是要走的路。