A turtle that dies without dying.
Freely inspired by Shadow of the Ego.
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(-0.05); const generations = 20000; //min = 100, max = 100000, step = 10 const forward = 0.05; //min = 0.01, max = 2, step = 0.01 const angle = 10; //min = 0, max = 45, step = 1 const size = 180; let turtles = []; let nests = []; let holes = []; function addTurtle(nest){ let turtle = new Turtle(); turtle.seth(Math.random() * 360); turtle.nest = nest; turtle.jump(nest.pos()); turtles.push(turtle); return turtle; } function addNest(x = 0, y = 0, qty = 5){ for (let i = 0; i < qty; i++){ let nt = addTurtle(x, y, Math.random() * 360) turtles.push(nt); } } class Hole{ constructor(x, y, w, h){ this.xmin = x - w / 2; this.xmax = x + w / 2; this.ymin = y - h / 2; this.ymax = y + h / 2; } isInHole(t){ let x = t.x(); let y = t.y(); return x > this.xmin && x < this.xmax && y > this.ymin && y < this.ymax; } } class Nest{ constructor(x, y){ this.x = x; this.y = y; addTurtle(this); } x(){ return this.x; } y(){ return this.y; } pos(){ return [this.x, this.y]; } } //nests.push(new Nest(0, 0)); //nests.push(new Nest(-10, -45)); //nests.push(new Nest(-10, 45)); /* holes.push(new Hole(-30, -60, 20, 20)); holes.push(new Hole(-30, -30, 20, 20)); holes.push(new Hole(-30, 0, 20, 20)); holes.push(new Hole(-30, 30, 20, 20)); holes.push(new Hole(-30, 60, 20, 20)); */ /* holes.push(new Hole(-30, -30, 30, 30)); holes.push(new Hole(-30, 30, 30, 30)); holes.push(new Hole(30, -30, 30, 30)); holes.push(new Hole(30, 30, 30, 30)); */ /* holes.push(new Hole(0, -30, 20, 20)); holes.push(new Hole(0, 0, 20, 20)); holes.push(new Hole(0, 30, 20, 20)); //nests.push(new Nest(60, 60)); //nests.push(new Nest(60, -60)); nests.push(new Nest(-60, 60)); nests.push(new Nest(-60, -60)); nests.push(new Nest(-60, 0)); */ nests.push(new Nest(0, 0)); holes.push(new Hole(-40, -40, 25, 25)); holes.push(new Hole(-40, 40, 25, 25)); holes.push(new Hole(40, -40, 25, 25)); holes.push(new Hole(40, 40, 25, 25)); holes.push(new Hole(-40, 0, 25, 25)); holes.push(new Hole(40, 0, 25, 25)); holes.push(new Hole(0, -40, 25, 25)); holes.push(new Hole(0, 40, 25, 25)); /* nests.push(new Nest(50, 0)); nests.push(new Nest(-50, 0)); nests.push(new Nest(0, 50)); nests.push(new Nest(0, -50)); holes.push(new Hole(-30, -30, 20, 20)); holes.push(new Hole(-30, 30, 20, 20)); holes.push(new Hole(30, -30, 20, 20)); holes.push(new Hole(30, 30, 20, 20)); holes.push(new Hole(-30, 0, 20, 20)); holes.push(new Hole(30, 0, 20, 20)); holes.push(new Hole(0, -30, 20, 20)); holes.push(new Hole(0, 30, 20, 20)); */ let gen = 0; // The walk function will be called until it returns false. function walk(i) { // revelation ! We can use a console for debugging ! // console.log(`iteration ${i}, ${turtles.length} turtles.`); for(let turtle of turtles){ turtle.right(Math.random() * 2 * angle - angle); turtle.forward(forward); turtle.age++; for(let hole of holes){ if(hole.isInHole(turtle)){ turtle.jump(turtle.nest.pos()); turtle.seth(Math.random() * 360); gen++; break; } } //remove out off canvas turtles. if(turtle.x() < -size/2 || turtle.x() > size/2 || turtle.y() < -size/2 || turtle.y() > size/2){ turtle.jump(turtle.nest.pos()); turtle.seth(Math.random() * 360); gen++; } } return gen < generations; }