我正致力于简单的进化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();
}
答案 0 :(得分:4)
最简单的方法是只将函数放在数组中:
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
。不要污染全球范围。
答案 1 :(得分:3)
从此更改阵列:
conditions = [enemyNear(), mySpeed()>5, 1=1];
对此:
conditions = [
function() { return enemyNear() }, // or just enemyNear
function() { return mySpeed() > 5 },
function() { return 1 == 1 } // 1 = 1?
];
使用当前代码,您的函数将被调用,conditions
将成为这些函数输出的数组。
答案 2 :(得分:3)
首先,在数组内部,您需要为条件和动作函数提供引用。现在,你正在调用它们,所以它们基本上和无用的数组相同,如:
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 demo上看到它。
答案 3 :(得分:1)
condition = [
enemyNear,
function() { return mySpeed() > 5; },
function() { return 1 == 1; }
];
答案 4 :(得分:0)
您需要将函数存储在array
中,而不是调用它们,否则您将存储函数的结果。
function enemyNear() {}
function walk() {}
conditions = [enemyNear]
actions = [walk]
behaviour = function() {
if(conditions[randomNumber]()) {
actions[randomNumber]();
}
}
答案 5 :(得分:-6)
简单。使用eval()
var behavior;
eval("behavior = function() { if (enemyNear()) walk(); }");
behavior();