Add reset button and glider and pulsar on ctrl and shift click

This commit is contained in:
Fabian Schmidt 2025-02-24 11:45:23 +01:00
parent f68977a557
commit 922a7d3160
3 changed files with 118 additions and 1 deletions

View File

@ -165,6 +165,110 @@ impl Universe {
let idx = self.get_index(row, col); let idx = self.get_index(row, col);
self.cells[idx].toggle(); self.cells[idx].toggle();
} }
pub fn kill_all(&mut self) {
self.cells.iter_mut().for_each(|cell| *cell = Cell::Dead);
}
pub fn glider(&mut self, row: u32, col: u32) {
let glider_grid = [
Cell::Dead,
Cell::Dead,
Cell::Alive,
Cell::Alive,
Cell::Dead,
Cell::Alive,
Cell::Dead,
Cell::Alive,
Cell::Alive,
];
let glider_positions = [
(row - 1, col - 1),
(row, col - 1),
(row + 1, col - 1),
(row - 1, col),
(row, col - 1),
(row + 1, col),
(row - 1, col + 1),
(row, col + 1),
(row + 1, col + 1),
];
glider_grid
.iter()
.zip(glider_positions)
.for_each(|(state, (row, col))| {
let idx = self.get_index(row, col);
self.cells[idx] = *state;
});
}
pub fn pulsar(&mut self, row: u32, col: u32) {
let pulsar_grid = [
Cell::Alive,
Cell::Alive,
Cell::Alive,
Cell::Dead,
Cell::Dead,
Cell::Dead,
Cell::Alive,
Cell::Alive,
Cell::Alive,
Cell::Alive,
Cell::Dead,
Cell::Alive,
Cell::Dead,
Cell::Dead,
Cell::Dead,
Cell::Alive,
Cell::Dead,
Cell::Alive,
Cell::Alive,
Cell::Alive,
Cell::Alive,
Cell::Dead,
Cell::Dead,
Cell::Dead,
Cell::Alive,
Cell::Alive,
Cell::Alive,
];
let pulsar_positions = [
(row - 4, col - 1),
(row - 3, col - 1),
(row - 2, col - 1),
(row - 1, col - 1),
(row, col - 1),
(row + 1, col - 1),
(row + 2, col - 1),
(row + 3, col - 1),
(row + 4, col - 1),
(row - 4, col),
(row - 3, col),
(row - 2, col),
(row - 1, col),
(row, col),
(row + 1, col),
(row + 2, col),
(row + 3, col),
(row + 4, col),
(row - 4, col + 1),
(row - 3, col + 1),
(row - 2, col + 1),
(row - 1, col + 1),
(row, col + 1),
(row + 1, col + 1),
(row + 2, col + 1),
(row + 3, col + 1),
(row + 4, col + 1),
];
pulsar_grid
.iter()
.zip(pulsar_positions)
.for_each(|(state, (row, col))| {
let idx = self.get_index(row, col);
self.cells[idx] = *state;
});
}
} }
impl Universe { impl Universe {

View File

@ -23,6 +23,7 @@
<body> <body>
<canvas id="game-of-life-canvas"></canvas> <canvas id="game-of-life-canvas"></canvas>
<button id="play-pause"></button> <button id="play-pause"></button>
<button id="reset">Reset</button>
<script src="./bootstrap.js"></script> <script src="./bootstrap.js"></script>
</body> </body>

View File

@ -28,7 +28,13 @@ canvas.addEventListener("mousedown", event => {
const row = Math.min(Math.floor(canvasTop / (CELL_SIZE + 1)), height - 1); const row = Math.min(Math.floor(canvasTop / (CELL_SIZE + 1)), height - 1);
const col = Math.min(Math.floor(canvasLeft / (CELL_SIZE + 1)), width - 1); const col = Math.min(Math.floor(canvasLeft / (CELL_SIZE + 1)), width - 1);
universe.toggle_cell(row, col); if (event.ctrlKey) {
universe.glider(row, col);
} else if (event.shiftKey) {
universe.pulsar(row, col);
} else {
universe.toggle_cell(row, col);
}
drawGrid(); drawGrid();
drawCells(); drawCells();
@ -38,6 +44,12 @@ const ctx = canvas.getContext('2d');
const playPauseButton = document.getElementById("play-pause"); const playPauseButton = document.getElementById("play-pause");
const reset = document.getElementById("reset");
reset.addEventListener("click", event => {
universe.kill_all();
});
const drawGrid = () => { const drawGrid = () => {
ctx.beginPath(); ctx.beginPath();
ctx.strokeStyle = GRID_COLOR; ctx.strokeStyle = GRID_COLOR;