使用Javascript生成迷宫&;帆布

使用Javascript生成迷宫&;帆布,javascript,html,canvas,maze,Javascript,Html,Canvas,Maze,我在为我的简历写迷宫生成程序时遇到了一个特殊的问题。我用的是画布,整个东西都很完美,只是最后画不出正确的正方形 它通过使用以下对象模板工作: {row:nRow, col:nCol, visited:false, left:true, right:true, top:true, bottom:true}; 我使用深度优先搜索来生成迷宫。为了打破墙,我检测邻居相对于当前瓷砖的位置,并关闭它们之间的墙 例如,如果我要破坏北边的邻居,我会执行以下操作: currentTi

我在为我的简历写迷宫生成程序时遇到了一个特殊的问题。我用的是画布,整个东西都很完美,只是最后画不出正确的正方形

它通过使用以下对象模板工作:

{row:nRow,
 col:nCol, 
 visited:false, 
 left:true, 
 right:true, 
 top:true, 
 bottom:true};
我使用深度优先搜索来生成迷宫。为了打破墙,我检测邻居相对于当前瓷砖的位置,并关闭它们之间的墙

例如,如果我要破坏北边的邻居,我会执行以下操作:

   currentTile.top = false;
   neighbor.bottom = false;
我用谷歌控制台进行了三次检查,这部分工作正常。但是,当我使用画布重新绘制它时,它无法正确移除墙,它看起来如下所示:

代码来源:

var画布;
var-ctx;
var-tiles=[];
var visitedStk=[];
init();
函数createPoint(nRow,nCol){
/*细胞类*/
var obj={
行:nRow,
上校:nCol,
访问:错误,
左:对,
对:对,
托普:没错,
底部:正确
};
返回obj;
}
函数init(){
/*初始化所需的变量*/
$(“#newMazeBtn”)。单击(重画迷宫);
画布=$(“#mazeCanvas”)[0];
ctx=canvas.getContext(“2d”);
退税();
}
功能抽绳(sX、sY、eX、eY){
/*从开始的X和Y位置到结束的X和Y位置绘制一条线*/
ctx.moveTo(sX,sY);
ctx.lineTo(eX,eY);
}
功能绘图单元(x、y、侧面、瓷砖){
/*基于墙特性绘制单元*/
var left=tile.left;
var right=tile.right;
var top=tile.top;
var bottom=tile.bottom;
变量大小=25;
ctx.beginPath();
如果(左){
抽绳(x,y,x,y+尺寸);
}
如果(右){
抽绳(x+尺寸,y,x+尺寸,y+尺寸);
}
如果(底部){
抽绳(x,y+尺寸,x+尺寸,y+尺寸)
}
如果(顶部){
抽绳(x,y,x+尺寸,y);
}
ctx.stroke();
}
函数缺陷(){
/*在画布上画瓷砖*/
var侧=25;
对于(变量i=0;i<10;i++){
瓦片[i]=[];
对于(var j=0;j<10;j++){
tiles[i].push(createPoint(i,j));
绘图单元(i*侧,j*侧,侧,瓷砖[i][j]);
}
}
generateMaze(0,0);
}
函数clearCanvas(){
clearRect(0,0,canvas.width,canvas.height);
}
函数redrawTiles(){
无功电流瓦;
clearCanvas();
var侧=25;
对于(变量i=0;i<10;i++){
对于(var j=0;j<10;j++){
currentTile=tiles[i][j];
绘图单元(i*侧、j*侧、侧、电流瓦);
}
}
}
函数重画迷宫(){
/*“新迷宫”的按钮手柄*/
var startCol=Math.floor(Math.random()*10)-1;
var startRow=Math.floor(Math.random()*10)-1;
clearCanvas();
退税();
}
函数生成器大小(行、列){
/*深度优先搜索*/
var currentTile=tiles[行][col];
var邻居=findNeighbor(行、列);
/*检查是否已访问该单元*/
如果(!currentTile.visited){
currentTile.visited=true;
访问测试推送(currentTile);
}
/*破案*/
if(visitedStk.length==0){
重画瓷砖();
返回;
}
/*如果找到邻居*/
else if(邻居!==未定义){
/*打破中间的墙*/
如果(neighbor.row>currentTile.row){/*Bottom*/
currentTile.bottom=false;
neighbor.top=false;
}
如果(neighbor.rowcurrentTile.col){/*正确*/
currentTile.right=false;
neighbor.left=false;
}
/*更新当前磁贴*/
currentTile=邻居;
}
/*如果没有找到邻居,则返回堆栈上的前一个单元格*/
否则{
var backtrack=visitedStk.pop();
generateMaze(backtrack.row,backtrack.col);
currentTile=回溯;
}
generateMaze(currentTile.row、currentTile.col);
}
函数findNeighbor(行、列){
/*使用tiles数组查找给定tile的邻居*/
var顶部、底部、左侧、右侧;
var stk=[]
var邻居=未定义;
var n;
/*检查左邻右舍*/
如果(行>=0&&col>0){
左=瓷砖[行][col-1];
(!左.已访问)?stk.push(左):未定义
}
/*检查右邻居*/
如果(行>=0&&col<9){
右=平铺[行][col+1];
(!right.visted)?stk.push(右):未定义;
}
/*检查最上面的邻居*/
如果(列>=0&&row>0){
顶部=瓷砖[第1行][col];
(!top.visted)?stk.push(top):未定义
}
/*检查底部邻居*/
如果(列>=0和行<9){
底部=瓷砖[行+1][列];
(!bottom.visitored)?stk.push(底部):未定义
}
瓦伦;
而(stk.length>0){
/*随机选择一个邻居*/
len=标准长度;
n=数学地板(数学随机()*stk.length);
邻居=stk[n];
如果(!邻居已访问){
打破
}否则{
stk.拼接(n,1);
}
}
/*返回,将返回你