循环中不受控制的迭代

时间:2014-03-13 03:40:32

标签: javascript jquery

这是我的代码:

var randomCoord = function(cells) {
    var step = $('.workplace').innerWidth()/cells;
    var xCord = (Math.floor(Math.random() * (cells+1)))*step;
    var yCord = (Math.floor(Math.random() * (cells+1)))*step;
    if(plants.length != 0) {
        for (var i=0; i<plants.length; i++) {
            if (plants[i].left != xCord && plants[i].top != yCord) {
                plants.push({"top": yCord, "left": xCord});
            }
        }
    } else {
        plants.push({"top": yCord, "left": xCord});
    }
};
var multiplayer = function(func, endIteration, cells) {
    for (var i=0; i<endIteration; i++) {
        func(cells);
    };
};
    multiplayer(randomCoord, 5, 10) // will iterate diferent times

功能,多人游戏必须运行“randomCoords”5次,但它不起作用。为什么迭代的数量是不受约束的?我该如何解决?

1 个答案:

答案 0 :(得分:1)

如果数组中尚不存在坐标,那么for中的randomCoord()循环似乎只是将一个条目推入数组中,但这不是你的逻辑方式作品。相反,你检查数组中的每一个项目,如果它不等于数组中的那个项目,你推它,你为数组中的每个项目做这个,所以你最终在数组中有很多重复项(确切地说是什么你试图阻止)。

所以,第一次调用randomCoord时,会得到一个项目。下次你打电话时,你会得到两件物品。你第三次调用它时会得到4个项目,然后是8个项目,然后是16个。这是一个相当简单的逻辑错误。

如果你只是想在每次调用randomCoord时添加一个唯一的项目,那么你可以使用这样的逻辑:

var randomCoord = function(cells) {
    var step = $('.workplace').innerWidth()/cells;
    var xCord = (Math.floor(Math.random() * (cells+1)))*step;
    var yCord = (Math.floor(Math.random() * (cells+1)))*step;
    var found = false;
    for (var i=0; i<plants.length; i++) {
        if (plants[i].left == xCord && plants[i].top == yCord) {
            found = true;
            break;
        }
    }
    if (!found) {
        plants.push({"top": yCord, "left": xCord});
    }
};

注意,您不需要单独的if (plants.length != 0),因为for循环已经检查过,而我们的新found变量处理数组最初为空的情况。

如果您碰巧生成了坐标冲突,那么在该函数调用中不会添加任何项目,尽管生成两个冲突的随机值的几率相当低,只要cells*step是一个合适的大小数字(范围为你的随机数发生器)。如果你想在这种情况下再试一次,那么如果发现冲突,你需要另一个循环再试一次。