2

我正在研究简单的进化人工智能。我需要动态生成一个匿名函数。为此,我有一个条件和操作列表:

   var conditions = [
    function () { return enemyNear(), }, 
    function () { return mySpeed() > 5; }, 
    function () { return 1 === 1; }];
   var actions = [
      function () { return alert('walk'); },
      function () { return alert('jump'); } 
      function () { return alert('attack'); } ]

代码选择其中一个来生成一个新函数:

condition = conditions [Math.floor(Math.random()*conditions .length)];
actions = conditions [Math.floor(Math.random()*actions .length)];

如果选择的条件是enemyNear()并且选择的动作是walk(),我如何生成简单的匿名函数?

behavior = function() {
    if(enemyNear()) {
        walk();
    }
}

如果需要,我可以更改数组的保存方式。如何才能做到这一点?

所有字符behaviors都在这样的循环中调用:

for(i=0,i<chars.length,i++) {
chars[i].behavior.call();
}
4

6 回答 6

4

最简单的方法是只将函数放在数组中:

var conditions = [
    enemyNear, 
    function () { return mySpeed() > 5; }, 
    function () { return 1 === 1; 
}];
var actions = [walk, attack, jump];

然后你可以定义behave为:

var behave = function(condition, action) {
    if(condition()) {
        action();
    }
}

并使用它,例如:

behave(conditions[2], actions[1]);

在这里,2并且1可能是一个随机生成的数字,如下所示:

var getRandomInt = function (min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

var actRandomly = function (conditions, actions) {
    behave(
        conditions[getRandomInt(0, conditions.length -1)],
        actions[getRandomInt(0, actions.length -1)]
    );
};

像这样称呼它:

actRandomly(conditions, actions);

当然,这只是提出想法,并没有整齐地组织。

为了好玩,我创建了一个Basic jsFiddle Demo Version


注意:var在定义变量时始终使用。不要污染全局范围。

于 2012-12-21T00:23:43.167 回答
3

从此更改您的数组:

conditions = [enemyNear(), mySpeed()>5, 1=1];

对此:

conditions = [
    function() { return enemyNear() },  // or just enemyNear
    function() { return mySpeed() > 5 },
    function() { return 1 == 1 } // 1 = 1?
];

使用您当前的代码,您的函数被调用并conditions成为这些函数的输出数组。

于 2012-12-21T00:22:05.287 回答
3

首先,在数组内部,您需要引用条件和操作函数。现在,您正在调用它们,因此它们基本上与无用的数组相同,例如:

conditions = [true, false, true];
actions = [undefined, undefined, undefined];

我会将其更正为:

var conditions = [enemyNear, 
  function() { return mySpeed() > 5 }, 
  function(){ return true; }];
var actions = [walk, attack, jump];

然后您可以创建一个生成行为的函数:

function generateBehavior(){
  var condition = conditions[Math.floor(Math.random() * conditions.length)];
  var action = actions[Math.floor(Math.random() * actions.length)];
  return function() {
    if(condition()) {
      action();
    }
  }
}

您可以在此JSFiddle 演示中看到它的实际效果。

于 2012-12-21T00:25:57.100 回答
1
condition = [
    enemyNear,
    function() { return mySpeed() > 5; },
    function() { return 1 == 1; }
];
于 2012-12-21T00:24:25.320 回答
0

您需要将函数存储在 中array,而不是调用它们,否则您将函数的结果存储在数组中。

function enemyNear() {}
function walk() {}

conditions = [enemyNear]
actions = [walk]

behaviour = function() {
  if(conditions[randomNumber]()) {
    actions[randomNumber]();
  }
}
于 2012-12-21T00:23:29.063 回答
-6

简单的。使用 eval()

var behavior;
eval("behavior = function() { if (enemyNear()) walk(); }");
behavior();
于 2012-12-21T00:23:18.907 回答