Javascript 提高功能速度

Javascript 提高功能速度,javascript,performance,function,Javascript,Performance,Function,我正在用iio引擎用javascript做一个战舰游戏 我正试图与计算机对抗,所以我必须为飞船设置一个随机位置(我希望你知道这个游戏:)) 我有5艘船必须放置在一个网格中(10x10)。问题是函数速度非常慢,有时页面根本无法加载 我想知道这些函数的速度是否有一些改进,我有点新手:D function posShips(size){ // var size -> size of the ship var isOk = false; // flag var to check i

我正在用iio引擎用javascript做一个战舰游戏

我正试图与计算机对抗,所以我必须为飞船设置一个随机位置(我希望你知道这个游戏:))

我有5艘船必须放置在一个网格中(10x10)。问题是函数速度非常慢,有时页面根本无法加载

我想知道这些函数的速度是否有一些改进,我有点新手: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;
        }
    }
}
函数的容量(大小){
//变量大小->船舶大小
var isOk=false;//标记var以检查船舶是否处于正确位置
var isOk2=true;//如果单元格中已经填充了另一个ship,则标志var变为false
var i;
var j;
var side;//水平或垂直
而(!isOk){
i=iio.getRandomInt(1,11);
j=iio.getRandomInt(1,11);
side=iio.getRandomInt(0,2);
如果((j:i面)+size-1<11){//不在数组之外
对于(var k=0;k
  • 不要选择将落在网格之外的船舶位置。首先选择方向,然后根据
    大小限制
    x
    y
    初始位置。e、 g.如果大小为3,则变化坐标的初始值不会超过7

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

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

  • 如果先前的一个位置已经失败了,那么尽早打破循环,继续测试一个位置是没有意义的

  • 把你的大船放在第一位——把小船放在大船之间的空隙里比较容易

  • 有关我的实现,请参见,与您的函数等效的是:

    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;
        }
    };
    
  • 不要选择将落在网格之外的船舶位置。首先选择方向,然后根据
    大小限制
    x
    y
    初始位置。e、 g.如果大小为3,则变化坐标的初始值不会超过7

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

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

  • 如果先前的一个位置已经失败了,那么尽早打破循环,继续测试一个位置是没有意义的

  • 把你的大船放在第一位——把小船放在大船之间的空隙里比较容易

  • 有关我的实现,请参见,与您的函数等效的是:

    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;
        }
    };
    

    也许你可以读这篇文章:我想你可以用这种方法来放置这5艘船?我建议不要“再这样做”。也许,通过网格确定所有有效位置,然后随机选择一个。这更适合吗?警告:清除时,您应该转到
    k
    ,不要
    size
    否则你可能会清理已经放置的船只。也许你可以阅读这篇文章:我认为你可以使用这种方法放置这5艘船只?我建议不要“再次这样做”。也许,通过网格确定所有有效位置,然后随机选择一个。这更适合吗?警告:清理时,您应该转到
    k
    ,而不是
    size
    ,否则您可能会清理已放置的船舶。非常完美,非常感谢:)我也找到了解决方案,没有,但回顾相同的功能,只有2 for和2 if:D再次感谢您的建议,非常有用!非常完美,非常感谢:)我也找到了一个解决方案,没有同时回顾相同的函数,只有2 for和2 if:D再次感谢您的建议,非常有用!