簡體   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