这是我的代码:
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次,但它不能工作。为什么迭代的数量是不可控制的?我怎么才能修好它?
发布于 2014-03-13 03:48:02
看起来,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
是一个适当的大小数(随机数生成器的范围)。如果想在这种情况下再试一次,那么如果发现冲突,则需要另一个循环再试一次。
https://stackoverflow.com/questions/22368589
复制相似问题