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

Javascript中的迷宫生成器未捕获类型错误,javascript,arrays,error-handling,maze,unhandled,Javascript,Arrays,Error Handling,Maze,Unhandled,我正在尝试创建一个随机迷宫,并且,在大多数情况下,我已经弄清楚了逻辑和代码。然而,每次迷宫随机生成“UncaughtTypeError:CannotReadProperty'(InsertNumber)”(未定义的),我都会得到相同的错误。现在我将它设置为只能访问已定义属性的位置(也称为迷宫内部),所以我很难看到问题所在 var canvas=document.getElementById('demo'); var ctx=canvas.getContext('2d'); var网格=[]; v

我正在尝试创建一个随机迷宫,并且,在大多数情况下,我已经弄清楚了逻辑和代码。然而,每次迷宫随机生成“UncaughtTypeError:CannotReadProperty'(InsertNumber)”(未定义的),我都会得到相同的错误。现在我将它设置为只能访问已定义属性的位置(也称为迷宫内部),所以我很难看到问题所在

var canvas=document.getElementById('demo');
var ctx=canvas.getContext('2d');
var网格=[];
var_宽度=25;
var迷宫高度=25;
var块大小=20;
var点={
起点:{
x1:0,
y1:0
},
终点:{
x2:0,
y2:0
},
新点:{
x3:0,
y3:0
},
当前点:{
x4:0,
y4:0
}
}
var thispoint=[];
var=[];
var回溯=[];
var计数=0;
函数drawSquare(x,y,r,g,b){
ctx.fillStyle=“rgb(“+r+”,“+g+”,“+b+”)
ctx.fillRect(x,y,块大小-1,块大小-1)
}
对于(i=0;i23){
日志(“从“+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;
push([points.startpoint.x1,points.startpoint.y1]);
traceback.push([points.startpoint.x1,points.startpoint.y1]);
控制台日志(“推”);
完成=正确;
}否则如果(a.x-1>1&&a.y-1>1&&a.y+1<23&&a.x+1>23){
完成=错误;
}
}如果(网格[a.x][a.y]!=0)为else{
完成=错误;
}
}而(!完成);
}
函数buildMaze(){
var done=false;
做{
如果(计数=3){
计数=0;
//回去
var=traceback.pop;
points.currentPoint.x4=返回[0];
points.currentPoint.y4=反向返回[1];
log(“临时跟踪:+EntertraceBack[0],EntertraceBack[1]);
if(points.currentPoint.x4==points.startpoint.x1&&points.currentPoint.y4==points.startpoint.y1){
完成=正确;
}else if(points.currentPoint.x4!=points.startpoint.x1 | | points.currentPoint.y4!=points.startpoint.y1){
fillMaze();
}
}否则如果(计数!=3){
计数=0;
fillMaze();
控制台日志(回溯);
console.log(已访问);
}
}而(!完成)
}
函数fillMaze(){
变量a=数学地板((数学随机()*4)+1);
开关(a){
案例1:
控制台日志(“左”);
左();
打破
案例2:
控制台日志(“右”);
对();
打破
案例3:
控制台。登录(“up”);
up();
打破
案例4:
控制台。登录(“关闭”);
向下();
打破
}
}
函数fillSquare(x,y){
drawSquare(x*块大小,y*块大小,0,0,0)
}
函数左(){
var-thiscont=0;
对于(变量i=1;i=1){
如果(网格[points.currentPoint.x4-i][points.currentPoint.y4]!=2){
访问.push([points.currentPoint.x4-i,points.currentPoint.y4]);
回溯推送([points.currentPoint.x4-i,points.currentPoint.y4]);
网格[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(网格[points.currentPoint.x4-i][points.currentPoint.y4]==2){
thiscount++;
}
}else if(points.currentPoint.x4-i<1){
thiscount++;
}
}
如果(thiscount==2){
该计数=1;
}
points.currentPoint.x4=points.currentPoint.x4-2;
计数=计数+此计数;
}
功能权限(){
var-thiscont=0;
对于(var i=1;i,在您的4个方法(上下左右)中,您有一行抛出错误:

if(grid[points.currentPoint.x4 + i][points.currentPoint.y4] != 2){
这是因为当您减去2时,如果不检查该索引是否仍然为正,并且在数组
网格

中作为索引存在,则其中2个函数(左/上)中的
points.currentPoint.x4+i
变为负值。在您的4种方法(上下右和左)中,您的这一行抛出了一错误:

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

这是因为当您减去2时,如果不检查该索引是否仍然为正并且作为索引存在于该数组
网格

中,您会让
points.currentPoint.x4+i
在其中的两个函数(左/上)中变为负?(控制台应将行号显示为一个链接,您可以单击该链接来显示有问题的行号。)@nnnnnn通常出现在168、192、244或217上。您可以用您的问题来标记这些行号吗?不要让我们自己计算或粘贴到外部编辑器来计算行号。错误发生在哪一行?(控制台应将行号显示为一个链接,您可以单击该链接来显示有问题的行号。)@nnnnnn通常出现在168、192、244或217上。请您通过提问来标记这些行号好吗?不要让我们自己计算或粘贴到外部编辑器中来计算行号。