Javascript 让AI追逐最近的食物

Javascript 让AI追逐最近的食物,javascript,html,canvas,artificial-intelligence,Javascript,Html,Canvas,Artificial Intelligence,不久前我问了一个问题,关于如何让人工智能追踪我的Agar.io克隆中的食物,我最终自己弄明白了,但现在我不知道如何让它追踪最接近它的食物。我尝试创建两个数组,其中食物细胞和计算机之间的距离为(x,y)(如中所示,但人工智能仍在寻找更远的数组。以下是我代码的相关部分: 返回必要的值: var x = []; var y = []; x.push(cell.x - computerX); y.push(cell.y - computerY); return [Math.min.apply(null,

不久前我问了一个问题,关于如何让人工智能追踪我的Agar.io克隆中的食物,我最终自己弄明白了,但现在我不知道如何让它追踪最接近它的食物。我尝试创建两个数组,其中食物细胞和计算机之间的距离为(x,y)(如中所示,但人工智能仍在寻找更远的数组。以下是我代码的相关部分:

返回必要的值:

var x = [];
var y = [];
x.push(cell.x - computerX);
y.push(cell.y - computerY);
return [Math.min.apply(null, x), Math.min.apply(null, y)];
应用它们:

this.xxx = xy()[0];
this.yyy = xy()[1];
this.dist2 = Math.sqrt(this.xxx * this.xxx + this.yyy * this.yyy);
this.speedX = (this.xxx / this.dist2) * this.speed.x;
this.speedY = (this.yyy / this.dist2) * this.speed.y;
computerX += 28 * this.speedX / computerRadius;
computerY += 28 * this.speedY / computerRadius;
(注意:“xy”是返回值的函数)

我如何让AI尝试吃离它最近的食物,而不仅仅是任何细胞?

对它们进行排序:

food.sort(function(cell1, cell2){
    var a1 = cell1.x - computerX, b1 = cell1.y - computerY,
        a2 = cell2.x - computerX, b2 = cell2.y - computerY,
        cell1Dist = Math.sqrt(a1*a1 + b1*b1),
        cell2Dist = Math.sqrt(a2*a2 + b2*b2);
    return (cell1Dist > cell2Dist)? 1 : ((cell1Dist < cell2Dist)? -1 : 0)
})

您并没有像现在这样对代码中的点进行排序,而是独立地对x和y进行排序

return [Math.min.apply(null, x), Math.min.apply(null, y)];
不是最近食物的偏移量。最近的食物可能没有最小的x位移或最小的y位移,虽然细胞可能看起来是在寻找远处的食物,但它可能是在寻找一个与任何食物都不对应的点。这是我的意思的ascii图

X---A
| B
|
C
细胞
X
的明显正确选择是食物
B
,但最小X差为0,最小y差为0


将点作为坐标对存储在一个数组中,减少最小距离。

以下是如何找到离AI最近的食物

它通过应用以下距离公式计算AI(=本演示中的鼠标)与画布上100个测试食物点之间的距离:

var dx = foods[n].x - AI.x;
var dy = foods[n].y - AI.y;
// Performance point: no need to do Math.sqrt -- you can just compare the squares
var distanceSquared = dx*dx+dy*dy;
if(distanceSquared<anyOtherDistanceSquared){
    // this is the nearest food
}

移动鼠标,最近的“食物”变为红色

不过我已经在这么做了。问题是我不知道如何返回for循环中的最短距离,以便在我为AI设置动画时使用它。@Raiden,这对你有用吗?我修复了错误,并且它对单元格进行了正确排序。如果可行,那么如果你能给我投票,证明这个答案解决了你的问题,那会有所帮助,向未来的访客展示你是如何解决这个问题的。是的,对不起,我试图实现它,但我不太明白如何返回dx和dy值,因为a1、b1、a2和b2是如何存在的。啊-a1是x与cell1的差,a2是cell2,b1是y与cell1的差,b2是cell2 cell1是与cell1的距离,cell2是距离从Cell2投票否决。回答问题的相关部分不包含在问题中,并且“最小测试用例”也不包含在其中。您发布的代码看起来“奇怪”:return[Math.min.apply(null,x),Math.min.apply(null,y)];似乎返回[cell.x-computerX,cell.y-computery]每次,因为在
x
y
数组中只有一个条目对您有好处?如果您真的浏览了我的JSFIDLE,您会注意到前面提到的代码位于for循环中。而且,相关部分也在那里。@Raiden非常感谢您的投票反馈!请记住,没有必要这样做任何昂贵的分类——只需扫描一系列食物,并在最短距离内找到一种。;-@无论谁投了反对票,通常都会给出理由,谢谢。
var dx = foods[n].x - AI.x;
var dy = foods[n].y - AI.y;
// Performance point: no need to do Math.sqrt -- you can just compare the squares
var distanceSquared = dx*dx+dy*dy;
if(distanceSquared<anyOtherDistanceSquared){
    // this is the nearest food
}