3

我正在开发一款游戏,其概念类似于 Risk or Monopoly(本质上是一款棋盘游戏,尽管我的要求可以外推)。因此,假设我想要计算机对手,我需要编写一个 AI。

现在,我的问题是我是否需要直接在程序中对 AI 进行编程(硬编码),或者是否存在某种方式让我编写的程序从方向和行为规则列表中读取,对 AI 进行软编码。

我假设如果我要像之前描述的那样进行软编码,我需要对 AI 可以使用的所有可能的动作进行编程。我还假设我不能告诉软模型 AI 做任何事情,除非经过编程(例如,一些取决于多种因素的决策行动)。与硬编码特定的 AI 相比,软编码的改革(优点/缺点)是什么?

4

1 回答 1

0

一些 AI 技术是 CPU 密集型的,例如基于启发式的广度优先或深度优先搜索,适用于许多策略游戏。

像这样的搜索需要您建立 API,以便可以检索当前的“状态”(游戏状态的完整表示),以及该状态(或任何状态)的所有可能移动/更改的列表,以及这些移动/更改中的每一个都会导致的新状态。

完成此操作后,任何算法都可以进行适当的 API 调用,以查看可以移动到哪些状态,以及可以从这些状态移动到哪些状态等。可以达到的状态将呈指数增长越多你试图向前看的动作,以至于即使是 2 个动作对计算机来说也可能是一项可怕的任务。

由于这个困难,启发式分数被用来评估跟随某些分支的可能有用性,因此搜索算法可能会立即丢弃来自当前状态的第一个可能移动的 90%。

遵循这种获取状态、评估状态并查看从状态到后续状态的可能移动/变化模式的 AI,您显然可以对 AI 进行软编码,但 AI 为启发式评分状态所做的工作可能是任何事情,而且您的软代码就像一种迷你语言。就个人而言,除非你想实现一种迷你语言,否则这是一种相当艰苦的工作方式。此外,您的软代码将需要某种解释,这可能使其速度比代码慢两倍,或者慢 10 或 100 倍......并且任何指数难度的技术都意味着性能非常非常重要。如果选择的 AI 方法不是指数级困难或普通困难,则可以使用软代码,但您仍然必须实现一种迷你语言。

您当然可以将 AI 实现为一个单独的程序,通过网络与您的游戏程序进行通信。这可能只是本地主机到本地主机,但当然不必如此。其性能在某种程度上取决于网络延迟和带宽,但这可能是也可能不是一个重大问题。

您还可以将 AI 实现为动态可加载库(即您的游戏可能会在某个文件夹中查看,看到一堆 lib 文件并尝试在运行时加载它们(例如,对于 UNIX 使用 dlopen())。然后您可以将新的 AI 放入任何时候都无需触及游戏本身。如果您的主要要求是拥有插件 AI 并在性能很重要的情况下保持性能,那么这可能是要走的路。

于 2015-10-15T12:54:04.540 回答