在二维网格中随机填充固定数量的单元格

时间:2015-12-23 21:03:56

标签: javascript arrays if-statement for-loop

我想尝试制作JavaScript Minesweeper并且我在pushBombs函数中遇到了一些问题。我试图把炸弹放在阵列中,有时它会输出确切的数字,但有时它会减少数量。

我的问题:

  1. 当条件为真时,它会将炸弹放入数组中,但是如果它是假的,它会通过这个itaration或者在数组中查找另一个索引是真的吗?
  2. Math.random()在条件和代码块中返回不同的值。
  3. 它把炸弹放在原来的地方但是为什么呢?
  4. 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';
                }
            }
        },
    

1 个答案:

答案 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 的值大于插槽的数量,则会变为无限循环。