gpt4 book ai didi

javascript - 确保我的 for 循环恰好生成 8 个唯一的数字对

转载 作者:行者123 更新时间:2023-12-03 09:33:49 26 4
gpt4 key购买 nike

这是一款扫雷游戏。这里的目标是生成准确数量的地雷。在本例中,我有一个 8x8 网格的盒子,里面有 10 个地雷(见底部)。因此,嵌套的 for 循环生成了 64 个带有 xy 坐标(用于稍后绘制网格)的对象,以及一个 state 属性来指示是否领域已布有地雷。然后,在 generateBombs 中,我使用 state:mined 生成 10 个对象,并使用随机的 xy 来覆盖其中的 8 个对象。盒子里的64个物体随机排列,从而埋下地雷。我的方法的问题在于,有可能生成 2 个非唯一的 xy 对象对,这样我最终会得到比原来的地雷数量要少,因为同一个对象会被覆盖两次。这里有什么好的方法?

此外,我的要求之一是生成器对地雷使用辅助函数,但它们采用相同的参数,因此该需求可能会被击败。

var minesweeper = {
boxes: [],
//rows
boxesNum: 0,
bombsNum: 0,

//creates a 8x8 grid
generateMap: function (width, height, bombsNum) {
for (i = 1; i < height; i++) {
this.boxes.push({
x: i,
y: 1,
state: "safe"
});
for (j = 1; j < width; j++) {
this.boxes.push({
x: 1,
y: j,
state: "safe"
});
}
}
this.generateBombs(width, height, bombsNum)
},
//mines random fields from the grid
generateBombs: function (width, height, bombsNum) {
for (k = 0; k < bombsNum; k++) {
this.boxes.push({
x: Math.floor(Math.random() * width + 1),
y: Math.floor(Math.random() * height + 1),
state: "mined"
});
}
}
}

minesweeper.generateMap(8, 8, 10);

最佳答案

你最好先处理盒子阵列本身,而不是先生成炸弹。

generateBombs: function (width, height, bombsNum) {
var bombCount = 0; // Count how many bombs we planted,
while(bombCount < 10){ // Loop until we have 10 bombs,
var index = parseInt(Math.random() * this.boxes.length + 1); // Get a random box id,
if(this.boxes[index].state === "safe"){ // If the box is safe, plant a bomb.
this.boxes[index].state = "mined";
bombCount++; // Increase bomb count with 1.
}
}
}

此方法将保证您在 10 个不同位置放置了 10 个炸弹。它可以选择同一个框两次,但如果这样做,它只会再试一次。

在最好的情况下,与需要为要生成的每个炸弹检查坐标数组的其他方法相比,您有 10 次循环迭代。

但是,这种随机选择炸弹位置的方法有一个问题:
如果增加炸弹数量,该方法将击中越来越多已放置炸弹的盒子,从而导致放置所需数量的炸弹所需的迭代次数呈指数级增长。基本上,磁场越密集,函数就越有可能随机选择一个已经有炸弹的单元格,因此必须重试。

不过,我预计这在炸弹数量为 50% 或更低时不会很明显。

<小时/>

你的generateMap函数也被破坏了。试试这个:

generateMap: function (width, height, bombsNum) {
for (var i = 0; i < width; i++) {
for (var j = 0; j < height; j++) {
this.boxes.push({
x: (i + 1),
y: (j + 1),
state: "safe"
});
}
}
this.generateBombs(width, height, bombsNum)
},

关于javascript - 确保我的 for 循环恰好生成 8 个唯一的数字对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31402442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com