Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1f16e96

Browse files
authored
Merge branch 'HackYourFuture:main' into main
2 parents 1946046 + 2e74f47 commit 1f16e96

14 files changed

+610
-0
lines changed

.DS_Store

-6 KB
Binary file not shown.

.gitignore

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
lerna-debug.log*
8+
.pnpm-debug.log*
9+
10+
# Diagnostic reports (https://nodejs.org/api/report.html)
11+
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12+
13+
# Runtime data
14+
pids
15+
*.pid
16+
*.seed
17+
*.pid.lock
18+
19+
# Directory for instrumented libs generated by jscoverage/JSCover
20+
lib-cov
21+
22+
# Coverage directory used by tools like istanbul
23+
coverage
24+
*.lcov
25+
26+
# nyc test coverage
27+
.nyc_output
28+
29+
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30+
.grunt
31+
32+
# Bower dependency directory (https://bower.io/)
33+
bower_components
34+
35+
# node-waf configuration
36+
.lock-wscript
37+
38+
# Compiled binary addons (https://nodejs.org/api/addons.html)
39+
build/Release
40+
41+
# Dependency directories
42+
node_modules/
43+
jspm_packages/
44+
45+
# Snowpack dependency directory (https://snowpack.dev/)
46+
web_modules/
47+
48+
# TypeScript cache
49+
*.tsbuildinfo
50+
51+
# Optional npm cache directory
52+
.npm
53+
54+
# Optional eslint cache
55+
.eslintcache
56+
57+
# Optional stylelint cache
58+
.stylelintcache
59+
60+
# Microbundle cache
61+
.rpt2_cache/
62+
.rts2_cache_cjs/
63+
.rts2_cache_es/
64+
.rts2_cache_umd/
65+
66+
# Optional REPL history
67+
.node_repl_history
68+
69+
# Output of 'npm pack'
70+
*.tgz
71+
72+
# Yarn Integrity file
73+
.yarn-integrity
74+
75+
# dotenv environment variable files
76+
.env
77+
.env.development.local
78+
.env.test.local
79+
.env.production.local
80+
.env.local
81+
82+
# parcel-bundler cache (https://parceljs.org/)
83+
.cache
84+
.parcel-cache
85+
86+
# Next.js build output
87+
.next
88+
out
89+
90+
# Nuxt.js build / generate output
91+
.nuxt
92+
dist
93+
94+
# Gatsby files
95+
.cache/
96+
# Comment in the public line in if your project uses Gatsby and not Next.js
97+
# https://nextjs.org/blog/next-9-1#public-directory-support
98+
# public
99+
100+
# vuepress build output
101+
.vuepress/dist
102+
103+
# vuepress v2.x temp and cache directory
104+
.temp
105+
.cache
106+
107+
# vitepress build output
108+
**/.vitepress/dist
109+
110+
# vitepress cache directory
111+
**/.vitepress/cache
112+
113+
# Docusaurus cache and generated files
114+
.docusaurus
115+
116+
# Serverless directories
117+
.serverless/
118+
119+
# FuseBox cache
120+
.fusebox/
121+
122+
# DynamoDB Local files
123+
.dynamodb/
124+
125+
# TernJS port file
126+
.tern-port
127+
128+
# Stores VSCode versions used for testing VSCode extensions
129+
.vscode-test
130+
131+
# yarn v2
132+
.yarn/cache
133+
.yarn/unplugged
134+
.yarn/build-state.yml
135+
.yarn/install-state.gz
136+
.pnp.*
137+
138+
.DS_Store
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/**
2+
* @typedef {Object} GridCell
3+
* @property {number} x
4+
* @property {number} y
5+
* @property {boolean} alive
6+
* @property {boolean} [nextAlive]
7+
*/
8+
9+
export default class Cell {
10+
static size;
11+
12+
constructor(x, y) {
13+
this.x = x;
14+
this.y = y;
15+
this.alive = Math.random() > 0.5;
16+
this.nextAlive = false;
17+
}
18+
19+
draw(context) {
20+
// Draw this background
21+
context.fillStyle = '#303030';
22+
context.fillRect(
23+
this.x * Cell.size,
24+
this.y * Cell.size,
25+
Cell.size,
26+
Cell.size
27+
);
28+
29+
if (this.alive) {
30+
// Draw living this inside background
31+
context.fillStyle = `rgb(24, 215, 236)`;
32+
context.fillRect(
33+
this.x * Cell.size + 1,
34+
this.y * Cell.size + 1,
35+
Cell.size - 2,
36+
Cell.size - 2
37+
);
38+
}
39+
}
40+
41+
liveAndLetDie(aliveNeighbors) {
42+
if (aliveNeighbors === 2) {
43+
// Living cell remains living, dead cell remains dead
44+
this.nextAlive = this.alive;
45+
} else if (aliveNeighbors === 3) {
46+
// Dead cell becomes living, living cell remains living
47+
this.nextAlive = true;
48+
} else {
49+
// Living cell dies, dead cell remains dead
50+
this.nextAlive = false;
51+
}
52+
}
53+
54+
update() {
55+
this.alive = this.nextAlive;
56+
}
57+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import Grid from './Grid.js';
2+
3+
const CELL_SIZE = 10;
4+
const NUM_COLUMNS = 75;
5+
const NUM_ROWS = 40;
6+
7+
export default class Game {
8+
constructor(canvas) {
9+
// Resize the canvas to accommodate the desired number of cell rows and
10+
// columns
11+
canvas.height = NUM_ROWS * CELL_SIZE;
12+
canvas.width = NUM_COLUMNS * CELL_SIZE;
13+
14+
// Obtain a context that is needed to draw on the canvas
15+
this.context = canvas.getContext('2d');
16+
if (!(this.context instanceof CanvasRenderingContext2D)) {
17+
throw new Error('Context not found');
18+
}
19+
20+
this.grid = new Grid(NUM_ROWS, NUM_COLUMNS, CELL_SIZE);
21+
}
22+
23+
gameLoop() {
24+
this.grid.render(this.context);
25+
this.grid.update();
26+
27+
setTimeout(() => {
28+
window.requestAnimationFrame(() => this.gameLoop());
29+
}, 200);
30+
}
31+
32+
start() {
33+
window.requestAnimationFrame(() => this.gameLoop());
34+
}
35+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import Cell from './Cell.js';
2+
3+
export default class Grid {
4+
rows = [];
5+
6+
constructor(numRows, numColumns, cellSize) {
7+
this.numRows = numRows;
8+
this.numColumns = numColumns;
9+
10+
Cell.size = cellSize;
11+
12+
// Create the grid as a two-dimensional array (i.e. an array of arrays)
13+
for (let y = 0; y < numRows; y++) {
14+
const row = [];
15+
for (let x = 0; x < numColumns; x++) {
16+
const cell = new Cell(x, y);
17+
row.push(cell);
18+
}
19+
this.rows.push(row);
20+
}
21+
}
22+
23+
isAlive(x, y) {
24+
// Out-of-border cells are presumed dead
25+
if (x < 0 || x >= this.numColumns || y < 0 || y >= this.numRows) {
26+
return 0;
27+
}
28+
29+
const cell = this.rows[y][x];
30+
return cell.alive ? 1 : 0;
31+
}
32+
33+
countLivingNeighbors(cell) {
34+
const { x, y } = cell;
35+
return (
36+
this.isAlive(x - 1, y - 1) +
37+
this.isAlive(x, y - 1) +
38+
this.isAlive(x + 1, y - 1) +
39+
this.isAlive(x - 1, y) +
40+
this.isAlive(x + 1, y) +
41+
this.isAlive(x - 1, y + 1) +
42+
this.isAlive(x, y + 1) +
43+
this.isAlive(x + 1, y + 1)
44+
);
45+
}
46+
47+
forEachCell(callback) {
48+
this.rows.forEach((row) => {
49+
row.forEach((cell) => callback(cell));
50+
});
51+
}
52+
53+
update() {
54+
this.forEachCell((cell) => {
55+
const aliveNeighbors = this.countLivingNeighbors(cell);
56+
cell.liveAndLetDie(aliveNeighbors);
57+
});
58+
59+
this.forEachCell((cell) => cell.update());
60+
}
61+
62+
render(context) {
63+
this.forEachCell((cell) => cell.draw(context));
64+
}
65+
}

0 commit comments

Comments
 (0)