for (var i = 0; i < 10; i++) {
bommen[i] = [
Math.floor(Math.random() * 10),
Math.floor(Math.random() * 10)];
}
这是我生成随机'炸弹坐标'的代码。它可以工作,但它可以在同一个地方放两枚炸弹。第一个Math.floor()
是X坐标,第二个是Y坐标。有没有人知道如何解决这个问题?
答案 0 :(得分:0)
这是你要找的?他们永远不会是同一个地方。
var locationOne = Math.floor(Math.random() * 10);
var locationTwo = Math.floor(Math.random() * 10);
while(locationOne === locationTwo){
locationTwo = Math.floor(Math.random() * 10);
}
for (var i = 0; i < 10; i++) {
bommen[i] = [
locationOne,
locationTwo];
}
答案 1 :(得分:0)
您可以循环显示之前的炸弹坐标,如果您找到了具有相同坐标的坐标,请重试。这样的事情应该有效:
for (var i = 0; i < 100; i++) {
var x = Math.floor(Math.random() * 10),
y = Math.floor(Math.random() * 10),
retry = false;
for (var j = 0; j < i; j++) {
if (bommen[j][0] == x && bommen[j][1] == y) {
retry = true;
break;
}
}
if (retry)
i--;
else
bommen[i] = [x, y];
}
答案 2 :(得分:0)
最简单的方法是按照
的方式添加一个关闭点for (var i = 0; i < 10; i++) {
if (bommen[i] != 0) // basically if there is already a bomb here
i--; //add another bomb
bommen[i] = [
Math.floor(Math.random() * 10),
Math.floor(Math.random() * 10)];
}
虽然效率不高,但确保你有十枚独特的炸弹。
答案 3 :(得分:0)
这是我的看法:
var bommen = [[]];
var bommenObj = {};
var numMines = 10;
var rows = 10;
var columns = 10;
while(Object.keys(bommenObj).length < numMines) {
var randX = Math.floor(Math.random() * rows);
var randY = Math.floor(Math.random() * columns);
bommenObj[[randX, randY]] = [randX,randY];
}
Object.keys(bommenObj).forEach(function(d,i) {
bommen[i] = bommenObj[d];
});
这个想法是利用Javascript的关联数组(a.k.a. Objects)来忽略重复的条目。
然后继续尝试,直到你有10个随机坐标。
一旦我们有10个坐标,我们只需将Object转换为数组。
答案 4 :(得分:0)
答案中存在一个问题,即检查之前的位置是否已被使用过。您有100个职位要使用。假设你已经使用了99个位置并随机选择下一个位置,那么这个位置从未被选中的可能性很小。一般来说,已经选择的职位越多,选择新职位所需的时间就越长。
请参阅这些答案,了解以随机顺序对可能位置进行排序的方法,然后按顺序阅读,这意味着每个新选择必须是唯一的,并且只选择一次而不重复。