繁体   English   中英

动态创建匿名函数?

[英]Create anonymous function dynamically?

我正在研究简单的进化AI。 我需要动态生成一个匿名函数。 为此,我列出了条件和操作:

   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();
}

最简单的方法是仅将函数放入数组中:

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]);

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

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 不要污染全球范围。

从此更改数组:

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

对此:

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

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

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

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演示中看到它的运行情况

condition = [
    enemyNear,
    function() { return mySpeed() > 5; },
    function() { return 1 == 1; }
];

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

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

conditions = [enemyNear]
actions = [walk]

behaviour = function() {
  if(conditions[randomNumber]()) {
    actions[randomNumber]();
  }
}

简单。 使用eval()

var behavior;
eval("behavior = function() { if (enemyNear()) walk(); }");
behavior();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM