首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态创建匿名函数?

动态创建匿名函数?
EN

Stack Overflow用户
提问于 2012-12-21 08:17:20
回答 6查看 859关注 0票数 2

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

代码语言:javascript
复制
   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'); } ]

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

代码语言:javascript
复制
condition = conditions [Math.floor(Math.random()*conditions .length)];
actions = conditions [Math.floor(Math.random()*actions .length)];

假设选择的条件是enemyNear(),选择的操作是walk(),我如何生成这个简单的匿名函数?

代码语言:javascript
复制
behavior = function() {
    if(enemyNear()) {
        walk();
    }
}

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

在一个循环中调用所有字符behaviors,如下所示:

代码语言:javascript
复制
for(i=0,i<chars.length,i++) {
chars[i].behavior.call();
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-12-21 08:25:57

首先,在数组内部,您需要有一个对条件和操作函数的引用。现在,您正在调用它们,所以它们基本上与无用的数组相同,如下所示:

代码语言:javascript
复制
conditions = [true, false, true];
actions = [undefined, undefined, undefined];

我会将其更正为如下所示:

代码语言:javascript
复制
var conditions = [enemyNear, 
  function() { return mySpeed() > 5 }, 
  function(){ return true; }];
var actions = [walk, attack, jump];

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

代码语言:javascript
复制
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 demo上看到它的实际效果。

票数 3
EN

Stack Overflow用户

发布于 2012-12-21 08:23:43

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

代码语言:javascript
复制
var conditions = [
    enemyNear, 
    function () { return mySpeed() > 5; }, 
    function () { return 1 === 1; 
}];
var actions = [walk, attack, jump];

然后,您可以将behave定义为类似于:

代码语言:javascript
复制
var behave = function(condition, action) {
    if(condition()) {
        action();
    }
}

并像这样使用它:

代码语言:javascript
复制
behave(conditions[2], actions[1]);

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

代码语言:javascript
复制
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)]
    );
};

它的名称如下:

代码语言:javascript
复制
actRandomly(conditions, actions);

当然,这只是一个想法,并没有组织得很整洁。

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

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

票数 4
EN

Stack Overflow用户

发布于 2012-12-21 08:22:05

从以下位置更改数组:

代码语言:javascript
复制
conditions = [enemyNear(), mySpeed()>5, 1=1];

要这样做:

代码语言:javascript
复制
conditions = [
    function() { return enemyNear() },  // or just enemyNear
    function() { return mySpeed() > 5 },
    function() { return 1 == 1 } // 1 = 1?
];

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13982552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档