c-c-c-combo!
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax
Canvas.setpenopacity(-1);
// Global code will be evaluated once.
const turtle = new Turtle();
// adjustments
var lim = 100; // dimensional (100 = full)
var extent = 90; // (100 best) less frame, more is off screen
var interations = 6*lim*lim; // (maze fullness)
var darken = false; // redraw lines to darken them
var staying = .92 // 0 (curvy) to 1 (straight)
var Letter = new Array();
Letter['A'] = new Array(0,0,0.5,1,0.75,0.5,0.25,0.5,0.75,0.5,1,0);
Letter['B'] = new Array(0,0,0,1,0.625,1,0.75,0.875,0.75,0.625,0.625,0.5,0,0.5,0.625,0.5,0.75,0.375,0.75,0.125,0.625,0,0,0);
Letter['C'] = new Array(0.75,0.125,0.625,0,0.125,0,0,0.125,0,0.875,0.125,1,0.625,1,0.75,0.875);
Letter['D'] = new Array(0,0,0,1,0.625,1,0.75,0.875,0.75,0.125,0.625,0,0,0);
Letter['E'] = new Array(0.75,0,0,0,0,0.5,0.75,0.5,0,0.5,0,1,0.75,1);
Letter['F'] = new Array(0,0,0,0.5,0.75,0.5,0,0.5,0,1,0.75,1);
Letter['G'] = new Array(0.75,0.5,0.625,0.5,0.75,0.5,0.75,0.125,0.625,0,0.125,0,0,0.125,0,0.875,0.125,1,0.625,1,0.75,0.875);
Letter['H'] = new Array(0,0,0,1,0,0.5,0.75,0.5,0.75,1,0.75,0);
Letter['I'] = new Array(0,0,0.25,0,0.125,0,0.125,1,0,1,0.25,1);
Letter['J'] = new Array(0,0.125,0.125,0,0.375,0,0.5,0.125,0.5,1);
Letter['K'] = new Array(0,0,0,1,0,0.5,0.75,1,0,0.5,0.75,0);
Letter['L'] = new Array(0,0,0,1,0,0,0.75,0);
Letter['M'] = new Array(0,0,0,1,0.5,0,1,1,1,0);
Letter['N'] = new Array(0,0,0,1,0.75,0,0.75,1);
Letter['O'] = new Array(0.75,0.125,0.625,0,0.125,0,0,0.125,0,0.875,0.125,1,0.625,1,0.75,0.875,0.75,0.125);
Letter['P'] = new Array(0,0,0,1,0.625,1,0.75,0.875,0.75,0.625,0.625,0.5,0,0.5);
Letter['Q'] = new Array(0.75,0.125,0.625,0,0.125,0,0,0.125,0,0.875,0.125,1,0.625,1,0.75,0.875,0.75,0.125,0.875,0);
Letter['R'] = new Array(0,0,0,1,0.625,1,0.75,0.875,0.75,0.625,0.625,0.5,0,0.5,0.625,0.5,0.875,0);
Letter['S'] = new Array(0,0.125,0.125,0,0.625,0,0.75,0.125,0.75,0.375,0.675,0.5,0.125,0.5,0,0.625,0,0.875,0.125,1,0.625,1,0.75,0.875);
Letter['T'] = new Array(0,1,0.5,1,0.5,0,0.5,1,1,1);
Letter['U'] = new Array(0,1,0,0.125,0.125,0,0.625,0,0.75,0.125,0.75,1);
Letter['V'] = new Array(0,1,0.375,0,0.75,1);
Letter['W'] = new Array(0,1,0.25,0,0.5,1,0.75,0,1,1);
Letter['X'] = new Array(0,0,0.375,0.5,0,1,0.375,0.5,0.75,1,0.375,0.5,0.75,0);
Letter['Y'] = new Array(0,1,0.375,0.5,0.375,0,0.375,0.5,0.75,1);
Letter['Z'] = new Array(0,1,0.75,1,0,0,0.75,0);
Letter[' '] = new Array();
function drawLetter(let, x, y, size) {
var points = Letter[let];
if (typeof points == 'undefined' || points.length < 1) return;
turtle.penup();
for (var i = 0; i < points.length - 1; i = i+2) {
turtle.goto(x+points[i]*size,y-points[i+1]*size);
if (i == 0) turtle.pendown();
}
}
function drawWord(word, x, y, size) {
word = word.toUpperCase();
for (var i = 0; i < word.length; i++) {
// repeat the letter shifted to darken/shadow
[0,0.1,0.2,0.3,0.4,0.5,-0.1,-0.2].forEach(function(shift) {
drawLetter(word[i], x+shift, y+shift, size);
});
// letter spacing
if (word[i] == 'I') { x += size-3 } else
if (word[i] == 'M' || word[i] == 'T') { x += size+3 } else
x += size+1;
}
}
// keeping track of where it has been
var hit = new Array();
var max = Math.max(lim, extent);
for (var x = -max; x <= max; x++) {
hit[x] = new Array();
for (var y = -max; y <= max; y++) {
hit[x][y] = false;
}
}
function logHit() {
hit[turtle.x()][turtle.y()] = true;
}
function isValidDestination(x,y) {
console.log('is '+x+','+y);
if (x < -extent || x > extent ||
y < -extent || y > extent ||
hit[x][y]) return false;
return true;
}
var lastdir;
function pickDirection() {
var okdirs = new Array();
if (isValidDestination(turtle.x()+1,turtle.y())) okdirs.push(1);
if (isValidDestination(turtle.x()-1,turtle.y() )) okdirs.push(2);
if (isValidDestination(turtle.x() ,turtle.y()+1)) okdirs.push(3);
if (isValidDestination(turtle.x() ,turtle.y()-1)) okdirs.push(4);
if (okdirs.length == 0) return 0;
if (Math.random() < staying && okdirs.indexOf(lastdir) != -1) {
return lastdir;
} else {
return okdirs[Math.floor(Math.random()*okdirs.length)];
}
}
function drawTo(x,y) {
var fromx = turtle.x();
var fromy = turtle.y();
turtle.goto(x,y);
if (darken) { //redraw at slight offset to darken lines
var offset = .2;
turtle.goto(fromx+offset,fromy+offset);
turtle.goto(x+offset,y+offset);
turtle.goto(x,y);
}
}
function move() {
var newdir = pickDirection();
if (newdir == 0) { restartTurtle(); return; }
lastdir = newdir;
var newx = turtle.x();
var newy = turtle.y();
switch(newdir) {
case 1:
newx += 1;
break;
case 2:
newx -= 1;
break;
case 3:
newy += 1;
break;
case 4:
newy -= 1;
break;
default:
console.log('move switch default ('+newdir+') hit oops!');
}
drawTo(newx, newy);
logHit();
}
function restartTurtle() {
turtle.penup();
turtle.setx(randInt(-lim, lim));
turtle.sety(randInt(-lim, lim));
logHit();
turtle.pendown();
}
// utils
function randInt(min, max) {
var pick = Math.floor(Math.random() * (max - min + 1) + min);
return pick;
}
function outline() {
turtle.penup();
turtle.goto(-extent,-extent);
turtle.pendown();
turtle.goto(extent,-extent);
turtle.goto(extent,extent);
turtle.goto(-extent,extent);
turtle.goto(-extent,-extent);
}
// init
outline();
drawWord("Merry", -40, -20, 17);
drawWord("Christmas", -78, 20, 17);
restartTurtle();
function walk(i) {
move();
return i < interations;
}