简单的AI-JavaScript(使用jQuery动画)

| 首先,我想让您知道,我作为一种爱好已经编程了几年(主要是基于C的语言,iOS开发,Web东西等),现在对创建一个简单的AI感兴趣(大多数人们从打井字游戏开始,是的,但我有兴趣使用基因编程的原理制作东西。我希望读者知道这一点的原因是,如果答案不太复杂(因为我还没有上过大学计算机科学课程,对于一个孩子来说很难理解),我将不胜感激。 这是我的目标: 条款 organsim:CSS div 人口:一组生物(5或10) 食物来源:另一个CSS div 处理 生成了一个种群,每个种群最初看起来都具有相同的表型属性,但是其技能不同(为此,速度) 产生单个食物来源(每次相同) 在大约5秒钟的环境建立之后(步骤1和2),有机体种群需要找到一种竞争性地获取食物来源的方法 只有一种生物可以到达食物。到达环境后,环境将重置,除了上一次发现食物的生物现在会受益,其速度水平可能会提高,而其他表现特别糟糕的生物可能会变得更慢或被终止 重复过程;用户可以观察人口的特征,看看哪些在进化上是成功的,等等。 附加信息 如您所见,以上步骤几乎以一种非常简单的方式模拟了进化(与动物的实际生活情况相比,条件更少);现在,这就是为什么我在这里问的原因:我完全迷路了。我真的不知道从哪里开始(除了产生总体,我最有可能做到这一点以及通过jQuery动画让它们移动)。但是现在我无法做的就是让他们吸引食物。因此,我希望为此指出正确的方向。     
已邀请:
现场例子 请注意,这使用Raphael进行渲染,并使用下划线表示语义糖。 我写了一个非常小的程序,可以满足您的要求。 (好玩)。   1生成了一个种群,每个种群最初看起来都具有相同的表型属性,但是其技能不同(为此,速度)。
var Critter = function() {
    // default the speed to something random.
    this.speed = SPEED + Math.random()*SPEED;

    // logic module
    var logic = function() { ... }
}

...
// initialize an array of critters.
critters: _.map(_.range(0,COUNT), function() {
    return new Critter;    
})
为您的人口成员创建一个构造函数,然后填充这些家伙的数组。我已经将一个长度计数数组映射到一个生物数组。 (厚脸皮的循环)。 您创建的每个生物都将相似,但是具有不同的技能(基于
Math.random()
),但是它们将包含相同的逻辑单元。   2产生单个食物来源(每次相同)
// trivial Food object.
var Food = function() {
    // rectangle with random x, random y, and SIZE as width / height
    this.el = paper.rect(Math.random()*WIDTH, Math.random()*HEIGHT, SIZE, SIZE);    
};
食物对象构造函数只是在屏幕上随机放置一个正方形   3在大约5秒钟的环境建立之后(步骤1和2),有机体种群需要找到一种途径来竞争性地获取食物来源 设置环境:
_.invoke(this.critters, \"start\", this.food.el.getBBox(), out_of_bounds);
对于每个生物,您都调用其启动方法。
this.start = function(food) {
    // create a player (circle);
    this.el = paper.circle(Math.random()*WIDTH, Math.random()*HEIGHT, SIZE / 2);  
    // set an interval to run the logic over and over.
    loop = setInterval(_.bind(logic, this, food), 25);    
};
每个生物只是简单地将自己随机放置在屏幕上,然后在一个循环中反复调用自己的逻辑。   4只有一种生物可以到达食物。到达环境后,环境将重置,除了上一次发现食物的生物现在会受益,其速度水平可能会提高,而其他表现特别糟糕的生物可能会变得更慢或被终止
var logic = function(food) {
    // if you hit food you win
    if (this.el.collision(food)) {
        this.win();
    }
}

// you won
this.win = function() {
    console.log(\"win\");
    // increase speed
    this.speed += Math.random()*5;  
    // end round
    Game.end();
};
小动物将检测逻辑回路中是否有食物。一旦有了食物,它就会调用自己的胜利方法。这将结束当前的游戏回合。 当小动物获胜时,它可以提高速度。 当您拨打
.end
时,游戏将重新启动(在删除所有当前小生物之后)
end: function () {
    // tell all critters to end their round
    _.invoke(this.critters, \"remove\");
    // remove the food
    this.food.el.remove();
    // start again !
    this.start();
},
  5重复过程;用户可以观察人口的特征,看看哪些在进化上是成功的,等等。 观看直播示例:) 6接下来是什么: 调整全局数字和其他硬编码数字 在
logic
函数中实现一些AI。 从/ 1到/ 180遍历所有jsfiddles,看看它是如何构建的。 抱怨评论不够详细 现在,您已经看到了一个示例,将我的代码扔掉并从头开始。 出生代码仅创建一个“基本” Criter。它不是来自两个现有的 小动物,技能没有提高。这意味着没有发展。 奖金: 美食之旅 警告:以上链接的确指向食物,但做错了,我认为里面有一个躲闪的虫子。我认为我不会解决这个问题。 我将解释前往食物的逻辑
    // angle between critter and food
    var angle = Raphael.angle(
        this.el.getBBox().x,
        this.el.getBBox().y,
        food.x,
        food.y) - 135; // the 135 is the default direction (bottom right)
    // get a random speed
    var rand = Math.random()*this.speed;
    // travel towards the food box by rotating your vector by the angle
    var points = this.rotateVector([rand, rand], angle);

    // move towards the box
    this.el.translate(points[0], points[1]);
第一个
rand
创建一个随机向量,如下所示:
Math.random()
确定小动物移动的距离/速度。这指向右下角。 因为它指向右下角,所以我们必须从此向量的角度中删除
135
度 然后,我们必须计算小动物和食物之间的角度。为此,我们将两个点传递给
Raphael.angle
,并为我们计算角度。 现在我们有了角度,我们想将运动矢量旋转该角度。运动矢量当前指向上方(黑色),我们想将其旋转到新位置(红色)一个角度。在代码中,这是
this.rotateVector
现在正指向正确的方向!我们可以叫
this.el.translate(points[0], points[1])
    
您应该将问题分为两部分: 第1部分:有机体必须能够朝您指定的点移动。这将需要一个计时器,并且需要一些数学方法来确定必须移动每个生物体的坐标,以使其在计时器的每一个滴答声中都离其目标更近一步。 Google应该能够帮助您找出完成这项工作所需的数学运算。 第2部分:有机体需要选择一种食物来源(可能是最接近的食物)作为目标,然后使用第1部分所述的移动方法。 为此,您可以将每种生物和食物源存储在阵列中。然后,在计时器的每个滴答声中,循环遍历您的生物,然后在该循​​环内遍历食物源,寻找最接近的生物。 再次可以通过Google找到确定两组坐标之间距离的数学公式。 我认为我没有比这更简单的方法了,但是希望这可以使您了解下一步的发展方向。     
您可能会从Conway的LIFE的各种实现中获得启发。我相信您可能已经看过类似的东西? 有趣的阅​​读:元胞自动机     

要回复问题请先登录注册