我正在研究简单的进化人工智能。我需要动态生成一个匿名函数。对于它,我有一个条件和操作的列表:
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();
}发布于 2012-12-21 08:25:57
首先,在数组内部,您需要有一个对条件和操作函数的引用。现在,您正在调用它们,所以它们基本上与无用的数组相同,如下所示:
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上看到它的实际效果。
发布于 2012-12-21 08:23:43
最简单的方法是只将函数放在数组中:
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。不要污染全局范围。
发布于 2012-12-21 08:22:05
从以下位置更改数组:
conditions = [enemyNear(), mySpeed()>5, 1=1];要这样做:
conditions = [
function() { return enemyNear() }, // or just enemyNear
function() { return mySpeed() > 5 },
function() { return 1 == 1 } // 1 = 1?
];使用您当前的代码,您的函数将被调用,conditions将成为这些函数输出的数组。
https://stackoverflow.com/questions/13982552
复制相似问题