<!DOCTYPE html> <html> <head> <style> div { transition: all 1s linear; } .fancy { color: red; overflow-y: scroll; height: 30vh; width: 100vw; } canvas { border: black 1px solid; } </style> <link rel="icon" type="image/x-icon" href="cat-memes-cats.gif"> </head> <body> <div class="fancy">This site is currently under construction! <br> If you are in need of entertainment in the mean time click <a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ">here</a>!</div> <canvas height="800px" width="800px"></canvas> <button id="but">Start / Stop</button> <button id="clear">Clear</button> <script> let divs = document.getElementsByTagName("div"); let size = parseInt(localStorage.getItem("size")); if(isNaN(size)) size = 15; for(let div of divs) { div.style.fontSize = size + "px"; } const max_size = 60; const min_size = 10; let growing = true; setInterval(() => { if(size > 100) growing = false; if(size < 20) growing = true; if(growing) size += 20; else size -= 20; for(let div of divs) { div.style.fontSize = size + "px"; } localStorage.setItem("size", size); }, 1000); let canvas = document.getElementsByTagName("canvas")[0]; const canvasSize = 800; const gridSize = 50; const pixelSize = canvasSize / gridSize; let ctx = canvas.getContext("2d"); ctx.fillStyle = "black"; let draw = true; let running = false; window.addEventListener("keypress", e => { if(e.key === "d") { draw = !draw; } }); let grid = []; for(let row = 0; row < gridSize; row++) { grid[row] = []; for(let col = 0; col < gridSize; col++) { grid[row][col] = false; } } let getMousePos = (canvas, evt) => { var rect = canvas.getBoundingClientRect(); return { x: evt.clientX - rect.left, y: parseInt(evt.clientY - rect.top) }; } let pressed = false; canvas.addEventListener('mousedown', () => { pressed = true; }); canvas.addEventListener('mouseup', () => { pressed = false; }); canvas.addEventListener('click', evt => { if(!running) { var pos = getMousePos(canvas, evt); let col = Math.floor(pos.x / pixelSize); let row = Math.floor(pos.y / pixelSize); grid[row][col] = true; ctx.fillRect(pixelSize * col,pixelSize * row,pixelSize,pixelSize); } }); canvas.addEventListener('mousemove', evt => { if(pressed && !running) { var pos = getMousePos(canvas, evt); let col = Math.floor(pos.x / pixelSize); let row = Math.floor(pos.y / pixelSize); if(draw) { ctx.fillStyle = "black"; grid[row][col] = true; } else { ctx.fillStyle = "white"; grid[row][col] = false; } ctx.fillRect(pixelSize * col,pixelSize * row,pixelSize,pixelSize); } }); let button = document.getElementById("but"); button.addEventListener("click", () => { running = !running; console.log(running); }); function getNeighbors(row, col) { let neighbors = []; for (let i = -1; i < 2; ++i) for (let j = -1; j < 2; ++j) if (row + i >= 0 && row + i < gridSize && col + j >= 0 && col + j < gridSize && !(i == 0 && j == 0)) neighbors.push([row+i,col+j]); return neighbors; } function conway() { setInterval(() => { if(running) { let new_grid = []; for(let row = 0; row < gridSize; row++) { new_grid[row] = []; for(let col = 0; col < gridSize; col++) { new_grid[row][col] = grid[row][col]; let alive = 0; neighbors = getNeighbors(row, col); for(let n of neighbors) { if(grid[n[0]][n[1]]) alive++; } if(grid[row][col]) { if(alive < 2 || alive > 3) new_grid[row][col] = false; } else { if(alive == 3) new_grid[row][col] = true; } } } grid = new_grid; for(let row = 0; row < gridSize; row++) { for(let col = 0; col < gridSize; col++) { if(grid[row][col]) ctx.fillStyle = "black"; else ctx.fillStyle = "white"; ctx.fillRect(pixelSize * col,pixelSize * row,pixelSize,pixelSize); } } } }, 100); } conway(); let c = document.getElementById("clear"); c.addEventListener("click", () => { if(!running) { ctx.fillStyle = "white"; for(let row = 0; row < gridSize; row++) { for(let col = 0; col < gridSize; col++) { grid[row][col] = false; ctx.fillRect(pixelSize * col,pixelSize * row,pixelSize,pixelSize); } } } }) </script> </body> </html>