feat: add heavy weight spaceship
This commit is contained in:
parent
4026c8093e
commit
3b3e5b9173
|
@ -3,7 +3,10 @@ import { Title } from '../components/header';
|
||||||
import '../styles/gol.css';
|
import '../styles/gol.css';
|
||||||
---
|
---
|
||||||
|
|
||||||
<Title />
|
<div id="title-and-gol">
|
||||||
<div id="board" class="board"></div>
|
<Title />
|
||||||
|
<div id="board" class="board"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button id="startButton">Start Game</button>
|
<button id="startButton">Start Game</button>
|
||||||
<script src="../scripts/gol.js"></script>
|
<script src="../scripts/gol.js"></script>
|
||||||
|
|
|
@ -1,20 +1,30 @@
|
||||||
const boardElement = document.getElementById('board');
|
const boardElement = document.getElementById('board');
|
||||||
const boardSize = 20;
|
const boardSize = 10;
|
||||||
const grid = [];
|
const grid = [];
|
||||||
let intervalId;
|
let intervalId;
|
||||||
|
|
||||||
|
const cells = ['30', '20', '51', '01', '62', '63', '03', '64', '54', '44', '34', '24', '14']
|
||||||
|
|
||||||
|
const heavyWeightSpaceshipCell = (x, y) => {
|
||||||
|
const coor = `${x}${y}`
|
||||||
|
return cells.includes(coor)
|
||||||
|
}
|
||||||
|
|
||||||
function initializeBoard() {
|
function initializeBoard() {
|
||||||
for (let y = 0; y < boardSize; y++) {
|
for (let y = 0; y < boardSize; y++) {
|
||||||
let row = [];
|
let row = [];
|
||||||
for (let x = 0; x < boardSize; x++) {
|
for (let x = 0; x < boardSize; x++) {
|
||||||
let cell = document.createElement('div');
|
let cell = document.createElement('div');
|
||||||
cell.classList.add('cell');
|
cell.classList.add('cell');
|
||||||
cell.addEventListener('click', () => {
|
if (heavyWeightSpaceshipCell(x, y)) {
|
||||||
cell.classList.toggle('alive');
|
cell.classList.add('alive');
|
||||||
grid[y][x] = grid[y][x] ? 0 : 1;
|
boardElement.appendChild(cell);
|
||||||
});
|
row.push(1)
|
||||||
boardElement.appendChild(cell);
|
} else {
|
||||||
row.push(0);
|
boardElement.appendChild(cell);
|
||||||
|
row.push(0);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
grid.push(row);
|
grid.push(row);
|
||||||
}
|
}
|
||||||
|
@ -40,7 +50,7 @@ function computeNextGeneration() {
|
||||||
cellElement.animate([
|
cellElement.animate([
|
||||||
{ backgroundColor: change.state ? 'black' : 'white' }
|
{ backgroundColor: change.state ? 'black' : 'white' }
|
||||||
], {
|
], {
|
||||||
duration: 300,
|
duration: 50,
|
||||||
fill: 'forwards'
|
fill: 'forwards'
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -51,11 +61,10 @@ function countAliveNeighbors(y, x) {
|
||||||
for (let yOffset = -1; yOffset <= 1; yOffset++) {
|
for (let yOffset = -1; yOffset <= 1; yOffset++) {
|
||||||
for (let xOffset = -1; xOffset <= 1; xOffset++) {
|
for (let xOffset = -1; xOffset <= 1; xOffset++) {
|
||||||
if (yOffset === 0 && xOffset === 0) continue;
|
if (yOffset === 0 && xOffset === 0) continue;
|
||||||
let newY = y + yOffset;
|
// Wrap around the edges
|
||||||
let newX = x + xOffset;
|
let newY = (y + yOffset + boardSize) % boardSize;
|
||||||
if (newY >= 0 && newY < boardSize && newX >= 0 && newX < boardSize) {
|
let newX = (x + xOffset + boardSize) % boardSize;
|
||||||
count += grid[newY][newX];
|
count += grid[newY][newX];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
|
@ -64,7 +73,7 @@ function countAliveNeighbors(y, x) {
|
||||||
function startGame() {
|
function startGame() {
|
||||||
console.log('starting')
|
console.log('starting')
|
||||||
if (intervalId) clearInterval(intervalId);
|
if (intervalId) clearInterval(intervalId);
|
||||||
intervalId = setInterval(computeNextGeneration, 100);
|
intervalId = setInterval(computeNextGeneration, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
const startButton = document.getElementById('startButton')
|
const startButton = document.getElementById('startButton')
|
||||||
|
|
|
@ -1,13 +1,20 @@
|
||||||
.board {
|
.board {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(20, 20px);
|
grid-template-columns: repeat(10, 5px);
|
||||||
grid-gap: 1px;
|
row-gap: 1px;
|
||||||
|
column-gap: 1px;
|
||||||
}
|
}
|
||||||
.cell {
|
.cell {
|
||||||
width: 20px;
|
width: 5px;
|
||||||
height: 20px;
|
height: 5px;
|
||||||
background-color: white;
|
background-color: white;
|
||||||
}
|
}
|
||||||
.alive {
|
.alive {
|
||||||
background-color: black;
|
background-color: black;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#title-and-gol {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user