[英]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.