[英]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]);
在這里, 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
。 不要污染全球范圍。
從此更改數組:
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.