Generates a minesweeper grid where the big circles are the bombs. Then a line steps through it and turns whenever it hits a number and splits whenever it hits a bomb.
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(); let seed = 1000; // min=1 max=1000000 step=1 const bits = 20; const samples = 150000; const mod = 1<<bits; let grid_size = 39; // min = 1 max = 50 step = 2 let num_bombs = 58; // min = 1 max = 100 step = 1 let steps = 230; // min = 0 max = 300 step = 1 if(num_bombs > grid_size*grid_size) { num_bombs = grid_size*grid_size; } grid = []; for(let i = 0; i < grid_size; i++) { grid_row = [] for(let j = 0; j < grid_size; j++) { grid_row.push(0); } grid.push(grid_row); } for(let i = 0; i < num_bombs; i++) { bomb_has_been_placed = false; while(!bomb_has_been_placed) { x_pos = Math.floor(random() * grid_size); y_pos = Math.floor(random() * grid_size); if(grid[x_pos][y_pos] == 0) { grid[x_pos][y_pos] = "bomb"; bomb_has_been_placed = true; } } } for(let i = 0; i < grid_size; i++) { for(let j = 0; j < grid_size; j++) { if(grid[i][j]!="bomb") { if(i>0 && j>0 && grid[i-1][j-1] == "bomb") grid[i][j]++; if(i>0 && grid[i-1][j] == "bomb") grid[i][j]++; if(i>0 && j<grid_size-1 && grid[i-1][j+1] == "bomb") grid[i][j]++; if(j>0 && grid[i][j-1] == "bomb") grid[i][j]++; if(j<grid_size-1 && grid[i][j+1] == "bomb") grid[i][j]++; if(i<grid_size-1 && j>0 && grid[i+1][j-1] == "bomb") grid[i][j]++; if(i<grid_size-1 && grid[i+1][j] == "bomb") grid[i][j]++; if(i<grid_size-1 && j<grid_size-1 && grid[i+1][j+1] == "bomb") grid[i][j]++; } } } let circle_rad = 100/grid_size for(let i = 0; i < grid_size; i++) { for(let j = 0; j < grid_size; j++) { if(grid[i][j] == "bomb") { circle(circle_rad, 30, -100 + i*200/grid_size + circle_rad, -100 + j*200/grid_size + circle_rad) } else if(grid[i][j] == 1) { circle(circle_rad/2, 30, -100 + i*200/grid_size + circle_rad, -100 + j*200/grid_size + circle_rad) } else { circle(circle_rad, grid[i][j]+1, -100 + i*200/grid_size + circle_rad, -100 + j*200/grid_size + circle_rad) } } } let scatter_turtles = []; let scatter_turtle = new Turtle(); scatter_turtle.left(0); scatter_turtles.push(scatter_turtle); for(let i = 0; i < steps; i++) { console.log(scatter_turtles.length); for(j in scatter_turtles) { if(Math.round(scatter_turtles[j].h()) % 90 == 0) { scatter_turtles[j].forward(circle_rad * 2); } else { scatter_turtles[j].forward(circle_rad * 2 * Math.pow(2,0.5)); } let off_map = false; if(scatter_turtles[j].x() > 100 || scatter_turtles[j].x() < -100 || scatter_turtles[j].y() > 100 || scatter_turtles[j].y() < -100) { off_map = true; } if(!off_map) { current_pos = grid[Math.floor((scatter_turtles[j].x()+100)*grid_size/200)][Math.floor((scatter_turtles[j].y()+100)*grid_size/200)]; if(current_pos == "bomb") { let copy_turtle = new Turtle(); copy_turtle.jump(scatter_turtles[j].x(), scatter_turtles[j].y()); copy_turtle.setheading(scatter_turtles[j].h() - 90); let duplicate_turtle = false; for(k in scatter_turtles) { if(Math.round(copy_turtle.x()) == Math.round(scatter_turtles[k].x()) && Math.round(copy_turtle.y()) == Math.round(scatter_turtles[k].y()) && Math.round(copy_turtle.h()) == Math.round(scatter_turtles[k].h())) { duplicate_turtle = true; } } if(!duplicate_turtle) { scatter_turtles.push(copy_turtle); } scatter_turtles[j].right(90); } else { scatter_turtles[j].right(current_pos * 45); } } } } function circle(radius, steps, x_center, y_center) { theta = Math.PI * 2 / steps; turtle.penup(); turtle.goto(x_center + radius * Math.cos(theta * 0), y_center + radius * Math.sin(theta * 0)) turtle.pendown(); for(i = 0; i <= steps; i++) { x = x_center + radius * Math.cos(theta * i); y = y_center + radius * Math.sin(theta * i); turtle.goto(x,y); } } //////////////////////////////////////////////////////////////// // Pseudorandom number generator. Created by Reinder Nijhoff 2024 // https://turtletoy.net/turtle/a2274fd1fe //////////////////////////////////////////////////////////////// function random() { // returns a number [0, 1[ let r = 1103515245 * (((seed+=12345) >> 1) ^ seed); r = 1103515245 * (r ^ (r >> 3)); r = r ^ (r >> 16); return (r % mod) / mod; }