I spent a ridiculous amount of time on this one.
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(1.0); // Global code will be evaluated once. const turtle = new Turtle(); turtle.penup(); turtle.goto(0,0); turtle.pendown(); function building(x, y, w, h){ turtle.penup(); turtle.goto(x,y); turtle.seth(0); turtle.down() turtle.left(90); turtle.forward(h); turtle.left(90); turtle.forward(w); turtle.left(90); turtle.forward(h); turtle.left(90); turtle.forward(w); // Windows let win_x = Math.floor(w/4); let win_y = Math.floor(h/7); turtle.penup(); let win_size = 2.0; turtle.goto(x,y); turtle.seth(0); turtle.left(90); turtle.forward(win_size * 1); turtle.left(90); turtle.forward(win_size * 1.4); for(let j = 0; j < win_x; j++){ for(let k = 0; k < win_y; k++){ let t = turtle.clone(); t.seth(0); t.up(); t.left(90); t.forward(k / (win_y) * (h-1)); t.left(90); t.forward(j / (win_x) * (w-1)); t.seth(0); t.pendown(); t.forward(win_size); t.left(90); t.forward(win_size); t.left(90); t.forward(win_size); t.left(90); t.forward(win_size); // Some darker windows if(not_random(k+j) < -0.4){ t.right(45); t.forward(-3); t.right(45); t.forward(1); t.left(45); t.forward(2); t.left(45); t.forward(1); t.left(90); t.forward(1); t.left(45); t.forward(2); } t.penup(); } } } let seed = 2; function not_random(i){ seed++; return Math.cos(i * 10 + seed * 20) + Math.sin(seed * 10); } let past_widths = 0; // Will contain building height for every horizontal pixel let building_heights = []; // The walk function will be called until it returns false. function walk(i) { let width_for_i = 10 * Math.abs(not_random(i)) + 10; past_widths += width_for_i; let height = 30 * Math.abs(not_random(i)) + 10; building( -100 + past_widths, 100, width_for_i, height ); let len = building_heights.length; for(let j = len; j < len + width_for_i; j++){ building_heights.push(height); } // Sky if(past_widths < 200){ return true; } else { let t = turtle.clone(); for(let j = 0; j < 100; j++){ t.up(); t.goto(-99,j); t.seth(0); for(let k = 0; k < 200; k+=2){ let mountain = 8.0 * Math.cos(k / 200 * 12 + 1); mountain += 4.0 * Math.cos(k / 200 * 2 + 1); mountain += 2.0 * Math.cos(k / 200 * 20); mountain += 1.0 * Math.cos(k / 200 * 30); let dim = (k + j) % (8 + Math.floor(j/20 - 5 + 0.3 * Math.cos(k * 0.1))); if(mountain < j - 10 && dim < 2 && building_heights[k+4] < 100-j){ t.down(); } t.forward(2); t.up(); } } return false; } }