我正在为学校项目制作遗传算法。目前,我正在为移动并拾取食物的“点”对象建立基础。我写了一些我认为应该可以做到的代码,经过一番尝试和错误后,我想到了这一点。 (这可能不是最干净的代码,我也希望听到一些有关此的提示)。该代码的唯一问题是该对象不仅可以拾取1种食物,而且可以拾取多个食物,我不知道为什么。


checkForTarget() {
    let inRange = new Array();
    let indexArray = new Array();
    for (let i = 0; i < food.length; i++) {
        let d = dist(food[i].pos.x, food[i].pos.y, this.pos.x, this.pos.y);
        if (d < this.sense) {
            inRange.push(food[i]);
            indexArray.push(i);
        }
    }

    if (!inRange.length == 0) {
        let closest = this.sense; // this.sense = radius
        let target, targetIndex;

        for (let i = 0; i < inRange.length; i++) {
            let d = dist(inRange[i].pos.x, inRange[i].pos.y, this.pos.x, this.pos.y);
            if (d < closest) {
                target = inRange[i];
                targetIndex = indexArray[i];
                closest = d;
            }
        }

        let targetpos = createVector(target.pos.x, target.pos.y); //fixed food removing from function (resetting position by using sub)
        let desired = targetpos.sub(this.pos);
        desired.normalize();
        desired.mult(this.maxspeed);
        let steeringForce = desired.sub(this.vel);
        this.applyForce(steeringForce);

        for (let i = 0; i < food.length; i++) {
            let d = dist(target.pos.x, target.pos.y, this.pos.x, this.pos.y);
            if (d < this.size) {
                console.log(targetIndex);
                this.food_eaten += 1;
                food.splice(targetIndex, 1);
            }
        }
    }
}

使用此代码没有收到任何错误消息,我使用console.log记录了targetIndex。这导致多次获得相同的输出。

最佳答案



当然可以,因为



条件d < this.size不依赖于food[i],如果条件满足,它将接受数组中的每个食物。

只需跳过for循环即可解决此问题。请注意,您要“食用”一种食物,因此足以验证一种食物是否在范围内。食物的索引已被识别并存储在targetIndex中:

//for (let i = 0; i < food.length; i++) {

let d = dist(target.pos.x, target.pos.y, this.pos.x, this.pos.y);
if (d < this.size) {
    console.log(targetIndex);
    this.food_eaten += 1;
    food.splice(targetIndex, 1);
}

//}

09-11 13:58