我正在为名为Ogar的项目制作机器人,该项目是用Node.js编写的Agar.io服务器实现。

该机器人有一个障碍,一个绿色的尖刺细胞,称为病毒(参见插图)。我需要对该机器人进行编程以避免这种障碍,但是我没有运气。由于插图中有很多目标,因此它是基于更新的。

javascript - 计算绕过障碍物的 Angular-LMLPHP

这是我到目前为止使用的代码。

BotPlayer.prototype.avoidObstacles = function(cell, angle) {
    // Sum up all of the vector angles of obstacles to cell and react against it
    var angleSum = 0;
    var collided = this.collisionFromList(cell, this.obstacles);
    if (collided.length == 0) return angle; // Not to return NaN

    for (var i = 0; i < collided.length; i++) {
        angleSum += this.angle(cell.position, collided[i].position);
    }

    angleSum /= collided.length; // Average out the angle sum

    // TODO: Find closest available edge
    angleSum += Math.PI / 2;

    return angle + angleSum;
};


在大多数情况下,此方法确实有效,但是该漫游器有时会完全忽略障碍(this.collisionFromList(cell, this.obstacles);完全正常),并最终从字面上经过它(爆炸成很多单元)。

BotPlayer.prototype对于此类计算具有很多有用的功能。请参见this link

我不需要任何寻路之争,只需此简单的避免措施即可。

最佳答案

您尝试执行的操作有另一种方法。该方法是使用吸引子来描述系统中的实体。您的“机器人”是agent,它具有位置并且知道世界上其他实体及其吸引力。假设您的目的地具有+1 attraction力量,而障碍物具有-X attraction力量,则有效地排斥了“机器人”(agent)。

这是一个决策伪代码:

/**
* @param {Array.<{position:Vector2, attraction:Number}>} entities
*/
Agent.prototype.calculateDirectionVector = function(entities){
    var agentPosition = this.position;
    var result = new Vector2(0,0);

    entities.forEach(function(entity){
         //calculate separation between agent and entity
         var displacement = entity.position.clone().sub(agentPosition);
         //figure out distance between entities
         var distance = displacement.length();
         //dampen influence of attraction linearly with distance
         var influence = entity.attraction/distance;
         //produce force vector exerted by this entity on the agent
         var force = displacement.normalize().multiplyScalar(influence);
         //add up forces on the entity
         result.add(force);
    });

    //normalize the resulting vector
    result.normalize();

    return result;
}

10-05 20:51
查看更多