我想尝试制作JavaScript Minesweeper并且我在pushBombs
函数中遇到了一些问题。我试图把炸弹放在阵列中,有时它会输出确切的数字,但有时它会减少数量。
我的问题:
var grid = {
_grid: [],
createGrid: function (c) {
for (var i = 0; i < c; i++) {
this._grid.push([]);
for (var a = 0; a < c; a++) {
this._grid[i][a] = 'Empty';
}
}
},
pushBombs: function (b) {
for (var i = 0; i < b; i++) {
if (this._grid[Math.round(Math.random() * (this._grid.length - 1))][Math.round(Math.random() * (this._grid.length - 1))] == 'Empty') {
this._grid[Math.round(Math.random() * (this._grid.length - 1))][Math.round(Math.random() * (this._grid.length - 1))] = 'Bomb';
}
}
},
答案 0 :(得分:0)
每次调用Math.random()时,您都会得到不同的值。假设在您的代码中,您希望在检查和分配中查看相同的插槽,您只希望为网格的每个轴调用一次。下面,我称他们为xx和yy。
pushBombs: function (b) {
for (var i = 0; i < b; i++) {
var xx = Math.round(Math.random() * (this._grid.length - 1));
var yy = Math.round(Math.random() * (this._grid.length - 1));
if (this._grid[xx][yy] == 'Empty') {
this._grid[xx][yy] = 'Bomb';
}
}
}
修改强> 您可能想要考虑的一点是,此代码假定网格的两个维度的长度相等。基于createGrid()方法,看起来就是这种情况。提前考虑你可以选择一个矩形网格,在这种情况下,这个pushBombs()方法会破坏。一种选择是存储X和Y长度,以便xx和yy可以正确地随机化它们的值。或者,我可能会建议稍微更改上面的代码以使用:
//randmomize the length of the first dimension
var xx = Math.round(Math.random() * (this._grid.length - 1));
//randomize the second dimension. Notice, this is looking at the length
//of the first item in the grid (which is your second dimension).
var yy = Math.round(Math.random() * (this._grid[0].length - 1));
编辑2 如果你想确保你总是得到确切数量的炸弹,你应该使用@PierreDuc建议的while循环:
while(b > 0) {
var xx = Math.round(Math.random() * (this._grid.length - 1));
var yy = Math.round(Math.random() * (this._grid[0].length - 1));
if (this._grid[xx][yy] == 'Empty') {
this._grid[xx][yy] = 'Bomb';
b--;
}
}
请注意,如果 b 的值大于空插槽的数量,则会变为无限循环。