我正在为我在 AS3 中开发的游戏创建 AI。为此,我需要能够通过多次检查来确定 AI 是否执行某项任务。
我需要能够存储比较运算符(例如 ==)或整个比较(例如 v1 == v2)。
我如何将其存储为变量或其他东西以允许类似的使用?
我正在为我在 AS3 中开发的游戏创建 AI。为此,我需要能够通过多次检查来确定 AI 是否执行某项任务。
我需要能够存储比较运算符(例如 ==)或整个比较(例如 v1 == v2)。
我如何将其存储为变量或其他东西以允许类似的使用?
v1 == v2
返回一个对象(一个布尔值),因此您可以使用它来存储它。
至于存储运算符,这不是(我认为)任何 OOP 语言都可以做到的......
在 AS3 中,您可以求助于该eval
函数,但这会损害性能,因此我建议您实现一个为您执行此操作的函数 -> 例如. 在糟糕的伪代码中:
const EQUAL:int = 0;
const LESS_THAN:int = 1;
etc...
function compare(v1, v2, op):Boolean
switch(op)
case EQUAL
return v1 == v2
etc...
因此,您将使用一个 int 变量来存储您的比较运算符。
如果您使用 ASC2 进行编译,还可以考虑内联此函数。
如果您打算对许多特定情况进行硬编码,我还建议您重新考虑您的 AI 逻辑:S(如果不是这种情况,请忽略这一点)。
您想了解基于约束的编程。既然我们在谈论人工智能,Prolog 就是这种编程的典型例子。从技术上讲,存在解决这类问题的不同算法,其中一大组被称为SAT isfiability 算法。以下是一些已知求解器的列表:http://en.wikipedia.org/wiki/Category: SAT_solvers
在处理此类问题时,您可能希望使用一些构造,尤其是当它们随着时间的推移而演变时:状态模式。通过仔细建模您的情况,您可以避免重复重新计算状态。即,例如,如果模型的某些特征仅在某些条件变为真后才被激活,那么您可以通过转换到隐含该条件为真的状态来对其进行建模。给你一个更具体的例子,假设你有一个系统,你有一个玩家角色和一天中的时间。如果一天中的时间是night
,那么角色可以执行一个sleep
动作,否则角色执行的动作是wonder around aimlessly
。然后,您可以创建状态day
和night
,如果进入游戏环境,它们都将具有功能characterAction
. 游戏循环在调用时characterAction()
将不知道环境的状态,但角色会执行正确的操作。
但是将系统的状态保存为例如定义状态的所有变量的向量可能会更有益。当您添加更多变量时,后者的扩展性更好。例如,您可以将游戏模型定义为可能的状态转换。
最重要的是,您需要开始做一些事情,并在实施时遇到问题时询问更具体的示例。我不认为好的解决方案仅限于我所提到的。他们很可能不是。