Javascript 中的迷宫生成器未捕获类型错误

Maze Generator Uncaught Type Error in Javascript

我正在尝试创建一个随机迷宫,并且在大多数情况下,已经弄清楚了逻辑和代码。但是,每次迷宫随机生成时,我都会收到相同的错误:"Uncaught TypeError: Cannot read property '(insert number)' of undefined." 现在我将其设置为仅应访问已定义属性的位置(也就是迷宫内部),所以我无法看到问题出在哪里。

var canvas = document.getElementById('demo');
var ctx = canvas.getContext('2d');

var grid = [];

var MAZE_WIDTH = 25;
var MAZE_HEIGHT = 25;
var BLOCK_SIZE = 20;

var points={
    startpoint: {
        x1: 0,
        y1: 0
    },
    endpoint:{
        x2: 0,
        y2: 0
    },

    newPoint:{
        x3: 0,
        y3:0
    },

    currentPoint:{
        x4:0,
        y4:0
}
}

var thispoint = [];
var visited = [];
var traceback = [];

var count = 0;


function drawSquare(x, y, r, g, b){
    ctx.fillStyle = "rgb(" + r + "," + g + "," + b + ")"
    ctx.fillRect(x, y, BLOCK_SIZE-1, BLOCK_SIZE-1)
}


for(i = 0; i < MAZE_WIDTH; i++){
    grid[i] = [];
    for(j = 0; j <MAZE_HEIGHT; j++){
        grid[i][j] = 1;
    }

}


function drawMaze(){
    for(var y = 0; y < MAZE_HEIGHT; y++){
        for(var x = 0; x < MAZE_WIDTH; x++){
            if(x%2 == 1 && y%2 == 1){
                grid[x][y] = 0;
            }
            if(x%2 == 0 && y%2 == 0){
                grid[x][y] = 1;
            }
            if(grid[x][y]==1){
                drawSquare(x*BLOCK_SIZE, y*BLOCK_SIZE, 255, 255, 255);
            } 
            if(grid[x][y] == 0){
                drawSquare(x*BLOCK_SIZE, y*BLOCK_SIZE, 0,0,0);
            }
    }   


}
}

function startPath(){
   var done = false;
    do{
     var a={
        x: Math.floor(Math.random()*25),
        y: Math.floor(Math.random()*25)
        }
           if(grid[a.x][a.y] == 0){
                if(a.x-1 < 1 || a.y-1 < 1 ||  a.y+1 > 23|| a.x+1 >23) {
                    console.log("begin at " + a.x + "," + a.y);
                    points.startpoint.x1 = a.x;
                    points.startpoint.y1 = a.y;
                    points.currentPoint.x4 = points.startpoint.x1;
                    points.currentPoint.y4 = points.startpoint.y1;
                    visited.push([points.startpoint.x1,points.startpoint.y1]);
                    traceback.push([points.startpoint.x1,points.startpoint.y1]);
                    console.log("push");
                    done = true;
                }else if(a.x-1 > 1 && a.y-1 > 1 &&  a.y+1 < 23 && a.x+1 >23){
                    done = false;
                }
           }else if(grid[a.x][a.y] != 0){
            done = false;
            }
    }while(!done);
}

function buildMaze(){
    var done = false;
    do{
        if(count == 3){
            count = 0;
            //go back
            var tempTraceback = traceback.pop;
            points.currentPoint.x4 = tempTraceback[0];
            points.currentPoint.y4 = tempTraceback[1];
            console.log("Temp Trace: " + tempTraceback[0], tempTraceback[1]);
            if(points.currentPoint.x4 == points.startpoint.x1 && points.currentPoint.y4 == points.startpoint.y1){
                done = true;
            }else if(points.currentPoint.x4 != points.startpoint.x1 || points.currentPoint.y4 != points.startpoint.y1){
                fillMaze();
        }
        }else if(count!= 3){
            count = 0;
            fillMaze();
            console.log(traceback);
            console.log(visited);
        }

    }while(!done)

}





function fillMaze(){
    var a = Math.floor((Math.random() * 4)+1);
    switch(a){
        case 1:
                console.log("left");
                left();

        break;

        case 2:
                console.log("right");
                right();

        break;

        case 3:
            console.log("up");
                up();

        break;

        case 4: 
            console.log("down");
                down();

        break;
    }
}
    function fillSquare(x,y){
        drawSquare(x*BLOCK_SIZE, y * BLOCK_SIZE,0,0,0)
    }


function left(){
    var thiscount = 0;
   for(var i = 1; i <= 2; i++){
    if(points.currentPoint.x4 - i >= 1){
        if(grid[points.currentPoint.x4 - i][points.currentPoint.y4] != 2){
    visited.push([points.currentPoint.x4 - i,points.currentPoint.y4]);
    traceback.push([points.currentPoint.x4 - i,points.currentPoint.y4]);
    grid[points.currentPoint.x4 -i][points.currentPoint.y4] = 2;
    fillSquare(points.currentPoint.x4-i,points.currentPoint.y4);  
        console.log(points.currentPoint.x4 + "," + points.currentPoint.y4);
        }else if(grid[points.currentPoint.x4 - i][points.currentPoint.y4] == 2){
            thiscount++;
        }
    }else if(points.currentPoint.x4 - i < 1){
        thiscount++;
    }
     }
    if(thiscount == 2){
        thiscount = 1;
    }
    points.currentPoint.x4 = points.currentPoint.x4 -2;
    count = count + thiscount;
}

function right(){
    var thiscount = 0;
     for(var i = 1; i <= 2; i++){
         if(points.currentPoint.x4 + i <= 23){
        if(grid[points.currentPoint.x4 + i][points.currentPoint.y4] != 2){
    visited.push([points.currentPoint.x4 + i,points.currentPoint.y4]);
    traceback.push([points.currentPoint.x4 + i,points.currentPoint.y4]);
    grid[points.currentPoint.x4 +i][points.currentPoint.y4] = 2;
         fillSquare(points.currentPoint.x4 +i,points.currentPoint.y4);
            console.log(points.currentPoint.x4 + "," + points.currentPoint.y4);
        }else if(grid[points.currentPoint.x4 + i][points.currentPoint.y4] == 2){
            thiscount++;
        }
         }else if(points.currentPoint.x4 + i > 23){
             thiscount++;
         }
     }
    if(thiscount == 2){
        thiscount = 1;
    }

    points.currentPoint.x4 = points.currentPoint.x4 +2;
    count = count + thiscount;
}

function up(){
    var thiscount = 0;
     for(var i = 1; i <= 2; i++){
        if(points.currentPoint.y4 - i >= 1){
            if(grid[points.currentPoint.x4][points.currentPoint.y4-i] != 2){
                visited.push([points.currentPoint.x4,points.currentPoint.y4-i]);
                traceback.push([points.currentPoint.x4,points.currentPoint.y4-i]);
                grid[points.currentPoint.x4][points.currentPoint.y4-i] = 2;
                fillSquare(points.currentPoint.x4,points.currentPoint.y4-i);
                console.log(visited);
                console.log(traceback);
        }else if(grid[points.currentPoint.x4][points.currentPoint.y4-i] == 2){
            thiscount++;
        }
          }else if(points.currentPoint.y4 - i < 1){
              thiscount++;
          }
}
    if(thiscount == 2){
        thiscount = 1;
    }

    points.currentPoint.y4 = points.currentPoint.y4-2;
    count = count + thiscount;
}


function down(){
    var thiscount = 0;
    for(var i = 1; i <= 2; i++){
         if(points.currentPoint.y4 + i <= 23){
        if(grid[points.currentPoint.x4][points.currentPoint.y4 + i] != 2){
            visited.push([points.currentPoint.x4,points.currentPoint.y4 +i]);
    traceback.push([points.currentPoint.x4,points.currentPoint.y4+i]);
    grid[points.currentPoint.x4][points.currentPoint.y4+i] = 2;
    fillSquare(points.currentPoint.x4,points.currentPoint.y4+i);
        }else if(grid[points.currentPoint.x4][points.currentPoint.y4 + i] == 2){
            thiscount++;
        }
         }else if(points.currentPoint.y4 + i > 23){
             thiscount++;
         }
    }
    if(thiscount == 2){
        thiscount = 1;
    }

    count = count + thiscount;
       points.currentPoint.y4 = points.currentPoint.y4 + 2;
}



drawMaze();
startPath();
buildMaze(); 

在你的 4 种方法中(从右上到左),你有这一行抛出错误:

if(grid[points.currentPoint.x4 + i][points.currentPoint.y4] != 2){

这是因为你让 points.currentPoint.x4 + i 在其中 2 个函数 (left/up) 中变为负数,当你减去 2 而没有检查该索引是否仍然为正并且作为该数组中的索引存在 grid