生成连接路径的随机网格

时间:2016-06-02 10:10:32

标签: javascript

我正在尝试生成连接路径的随机网格。下图显示了我设法得到它的程度:

enter image description here

网格需要遵守的规则如下:

  1. 所有路径必须以某种方式相互连接,但可能存在死角
  2. 没有没有连接的块(即无法到达)
  3. 边缘上的街区必须有向内而不是向外的路径。
  4. 正如您在我的图片中看到的,我的代码不太正确,但我找不到错误。

    以下是代码的小提琴:jsfiddle.net/thatOneGuy/jz5sfr00/1

    但我认为我的错误在于这个功能:

     function linkAll() {
        for (var x = 0; x < 9; x++) {
            for (y = 0; y < 9; y++) {
                //link up to each other
                var count = 0;
                if ((x > 0) && (y > 0)) {
                    if (hz[x - 1][y].right) {
                        hz[x][y].left = 1;
    
                    } else count++;
    
                    if (hz[x][y - 1].bottom) {
                        hz[x][y].top = 1;
    
                    } else count++;
                }
                if ((x < 9) && (y < 9)) {
                    if (hz[x + 1][y].left) {
                        hz[x][y].right = 1;
    
                    } else count++;
    
                    if (hz[x][y + 1].top) {
                        hz[x][y].bottom = 1;
    
                    } else count++;
                }
                if (count == 4) {
                    var newPath = getDirection(getRandomInt(0, 3));
                    if (newPath == 'top') {
                        hz[x][y - 1].bottom = 1
                        hz[x][y].top = 1;
                    } else if (newPath == 'left') {
                        hz[x - 1][y].right = 1;
                        hz[x][y].left = 1;
                    } else if (newPath == 'bottom') {
                        hz[x][y + 1].top = 1;
                        hz[x][y].bottom = 1;
                    } else if (newPath == 'right') {
                        hz[x + 1][y].left = 1;
                        hz[x][y].right = 1;
                    }
                }
            } //end for (y)
        } //end for (x)
    }
    

    更新: 我意识到我混淆了数组的xy值。他们应该被甩掉。

    所以我添加了一个linkEdges()函数,以便边缘阻止所有链接在一起:

    function linkEdges(){
        for(var x = 0; x < 10; x++){
            for(var y = 0; y < 10; y++){
    
                if((x==0) && (y > 0) && (y < 9)){  
    
                    if(hz[0][y-1].right){
                        //console.log(x + ' ' + y + ' y-1 = 1');
                        //console.log('Inside (y-1) ');
                        //console.log(hz[x][y]);
                        if (hz[0][y].left != null) 
                        {
                            hz[0][y].left = 1;
                        }
                    }
    
                }
                if ((y==0) && (x > 0)){
                    if(hz[x-1][0].bottom){
                        if(hz[x][0].top  != null)
                            hz[x][0].top = 1;
                    }
                }
    
                if ((y==9) && (x < 9) && (x > 0)){
                    if(hz[x+1][9].top){
                        if(hz[x][9].bottom != null)
                            hz[x][9].bottom = 1;
                    }
                }
    
                if ((x==9) && (y < 9)){
                    if(hz[9][y+1].left){
                        if(hz[9][y].right != null)
                            hz[9][y].right = 1;
                    }
                }
    
            } //end for(y)
        }//end for(x)
    }
    

    我还更新了linkAll()功能:

    function linkAll(){
        for(var x=0; x < 9; x++){
            for(var y=0; y < 9; y++){
                //link up to each other
                var count = 0;
    
                if((x > 0) && (y > 0)){
                    if(hz[x-1][y].bottom){                  
                        hz[x][y].top = 1;
    
                    }
                    else count++;
    
                    if(hz[x][y-1].right){
                        hz[x][y].left = 1;
    
                    }
                    else count++;   
                }
    
                if((x < 9) && (y < 9)){
                    if(hz[x+1][y].top){
                        hz[x][y].bottom = 1;    
    
                    }
                    else count++;
    
                    if(hz[x][y+1].left){
                        hz[x][y].right = 1;
    
                    }
                    else count++;
                }
    
    
                if(count == 4){
                    //console.log('x: ' + x + ' y: '+y);
                    var newPath = getDirection(getRandomInt(0, 3));
                    //console.log(newPath);
    
                    if(newPath == 'top'){
                        hz[x][y-1].right = 1
                        hz[x][y].left = 1;
                    }
                    else if(newPath == 'left'){
                        hz[x-1][y].bottom = 1;
                        hz[x][y].top = 1;
                    }
                    else if(newPath == 'bottom'){
                        hz[x][y+1].left = 1;        
                        hz[x][y].right = 1;             
                    }
                    else if(newPath == 'right'){
                        hz[x+1][y].top = 1; 
                        hz[x][y].bottom = 1;
                    }
    
                }
            }//end for (y)
        }//end for (x)
    }
    

    我的网格现在看起来像这样: enter image description here

    我只是不知道如何连接最后几条边。我认为这与我的linkEdges()功能有关。

0 个答案:

没有答案