2013-07-26 103 views
0

我正在用iio引擎在javascript中进行BattleShip游戏。提高功能速度

我想玩电脑,所以我必须把随机的位置(我希望你知道游戏:))。

我有5艘船必须放置在一个网格(10x10)。问题是这个函数很慢,有时这个页面根本没有加载。

我想知道是否有一些emprovement这些功能的速度,我有点新手:d

function posShips(size){ 
    // var size -> size of the ship 
    var isOk = false; // flag var to check if the ship is in a right position 
    var isOk2 = true; // flag var, become false if the cell is already fill with another ship 
    var i; 
    var j; 
    var side; // horizontal or vertical 
    while(!isOk){ 
     i = iio.getRandomInt(1,11); 
     j = iio.getRandomInt(1,11); 
     side = iio.getRandomInt(0,2); 
     if((side ? j : i)+size-1 < 11){ // Not out of the array 
      for (var k = 0; k < size; k++) { // Size of the ship 
       if(side){ 
        if(gridHit[i][j+k].stat == "empty"){ //If is empty put the ship 
         gridHit[i][j+k].stat = "ship"; 
         gridHit[i][j+k].setFillStyle("red") 
        }else{ // If not empty 
         isOk2 = false; //Position is not good, do all the thing again. 
         for (var a = 0; a < size; a++) { // Reset cell 
          gridHit[i][j+a].stat = "empty"; 
         } 
         k = 10; 
        } 
       }else{ 
        if(gridHit[i+k][j].stat == "empty"){ //If is empty put the ship 
         gridHit[i+k][j].stat = "ship"; 
         gridHit[i+k][j].setFillStyle("red") 
        }else{ // If not empty 
         isOk2 = false; //Position is not good, do all the thing again. 
         for (var a = 0; a < size; a++) { // Reset cell 
          gridHit[i+a][j].stat = "empty"; 
         } 
         k = 10; 
        } 
       } 
      }; 
      if(isOk2) 
       isOk = true; 
     } 
    } 
} 
+0

也许你可以阅读这篇文章:http://www.sitepoint.com/multi-threading-javascript /我认为你可以使用这种方法放置5艘船? – zeroke

+0

我建议反对'再做一遍'。也许,通过网格并确定所有有效位置,然后随机选择一个。 – sje397

+4

这是否适合http://codereview.stackexchange.com/? –

回答

4
  1. 不要挑船位置将落入外格。先选择方向,然后根据size限制xy的初始位置。例如如果大小为3,则变化坐标的初始值不超过7。

  2. 不要在搜索时更改数组。首先进行搜索,然后才更新数组。这避免了任何“清理”操作。

  3. 只要有可能,消除重复的深层对象引用。如果针对不同的x重复访问grid[y][x],请首先参考grid[y],然后将其用于后续访问。

  4. 提前打破循环,如果前一个失败已经没有意义了,那就没有意义了。

  5. 首先放置您的大船 - 将小船装入大船之间的缝隙更容易。

对我实施见http://jsfiddle.net/alnitak/Rp9Ke/,与你的函数是这样的等价物:

this.place = function(size) { 

    // faster array access 
    var g = this.grid; 

    // initial direction, and vector 
    var dir = rand(2); // 0 - y, 1 - x 
    var dx = dir ? 1 : 0; 
    var dy = dir ? 0 : 1; // or 1 - dx 

    LOOP: while (true) { 
     // initial position 
     var x = dir ? rand(10 - size) : rand(10); 
     var y = dir ? rand(10) : rand(10 - size); 

     // test points 
     var n = size, tx = x, ty = y; 
     while (n--) { 
      if (g[ty][tx]) continue LOOP; 
      tx += dx; 
      ty += dy; 
     } 

     // fill points 
     n = size; 
     while (n--) { 
      g[y][x] = size; 
      x += dx; 
      y += dy; 
     } 

     break; 
    } 
}; 
+0

非常完美,非常感谢你:)我找到了一个解决方案,没有时间,但回想起相同的功能,只有2和2如果:D再次感谢你的建议,真的很有用! –