这是我的代码:
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次,但它不起作用。为什么迭代的数量是不受约束的?我该如何解决?
答案 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
是一个合适的大小数字(范围为你的随机数发生器)。如果你想在这种情况下再试一次,那么如果发现冲突,你需要另一个循环再试一次。