Canvas.setpenopacity(1); const divs = 40; const extent = 100; const step = 2*extent/divs; const turtle = new Turtle(); let pixels = [...Array(divs)].map(_ => [...Array(divs)].map(_ => false)); turtle.penup(); let x = Math.floor(divs/4+Math.random()*divs/2); let y = Math.floor(divs/4+Math.random()*divs/2); let h = Math.round(Math.random()*4)*90; let attempts = 0; let optimism = 5; let dirfn = turtle.left; turtle.goto(x*step-extent/2, y*step-extent/2+step/2); turtle.seth(h); function pixel(opacity) { turtle.goto(-extent+x*step+step/3, -extent+y*step+step/3); turtle.seth(0); turtle.forward(0.5); turtle.right(90); turtle.forward(0.5); turtle.right(90); turtle.pendown(); for (let i = turtle.y()-step; i < turtle.y()+step-2; i+=0.25/opacity) { turtle.forward(step-1); turtle.right(90); turtle.forward(0.125/opacity); turtle.right(90); turtle.forward(step-1); turtle.left(90); turtle.forward(0.125/opacity); turtle.left(90); } turtle.penup(); turtle.seth(h); } function attempt() { h = Math.round(360+turtle.h())%360; const oldx = x; const oldy = y; if (h === 270) { if (x+1 < divs && pixels[x+1][y+1] === true && pixels[x+1][y] === false) { h = (h + 90)%360; x++; } else { y--; } } else if (h === 0) { if (y+1 < divs && pixels[x-1][y+1] === true && pixels[x][y+1] === false) { h = (h + 90)%360; y++; } else { x++; } } else if (h === 90) { if (x-1 >= 0 && pixels[x-1][y-1] === true && pixels[x-1][y] === false) { h = (h + 90)%360; x--; } else { y++; } } else if (h === 180) { if (y-1 >= 0 && pixels[x-1][y-1] === true && pixels[x][y-1] === false) { h = (h + 90)%360; y--; } else { x--; } } turtle.seth(h); if (x >= divs || x <= 0 || y >= divs || y <= 0) { x = oldx; y = oldy; return false; } if (pixels[x][y]) { x = oldx; y = oldy; return false; } return true; } function walk(i) { attempts = 0; dirfn = Math.random() ? turtle.left : turtle.right; while (attempts < 3 && !attempt()) { attempts++; dirfn.call(turtle, 90); if (optimism < 0) { dirfn.call(turtle, 90); } if ((turtle.h()+180)%360 === h) { dirfn.call(turtle, 90); } h = Math.round(360+turtle.h())%360; } if (attempts === 3) { pixel(1); return false; } else { pixels[x][y] = true; pixel(i==0 ? 1 : 0.5); optimism--; if (optimism < 0) { optimism = 5; } } return true; }