-
Notifications
You must be signed in to change notification settings - Fork 0
/
grid.js
113 lines (106 loc) · 2.97 KB
/
grid.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
class Grid {
constructor(size, lifeProbability, context, bgClr, cellClr) {
this.bgClr = bgClr
this.cellClr = cellClr
this.size = size
this.lifeProbability = lifeProbability
this.context = context
this.cellSize = Math.round(context.canvas.width / this.size)
this.initialize()
}
initialize() {
this.cells = []
for (let x = 0; x < this.size; x++) {
let column = []
for (let y = 0; y < this.size; y++) {
if (Math.random() <= this.lifeProbability) {
column.push(true)
} else {
column.push(false)
}
}
this.cells.push(column)
}
}
draw() {
this.context.fillStyle = this.bgClr
this.context.fillRect(
0, 0,
ctx.canvas.width, ctx.canvas.height
)
this.context.fillStyle = this.cellClr
for (let x = 0; x < this.size; x++) {
for (let y = 0; y < this.size; y++) {
if (this.cells[x][y] === true) {
this.context.fillRect(
x * this.cellSize, y * this.cellSize,
this.cellSize, this.cellSize
)
}
}
}
}
neighbours(x, y) {
let livingNeighbours = 0
for (let nx = x-1; nx <= x+1; nx++) {
for (let ny = y-1; ny <= y+1; ny++) {
if (nx >= 0 && nx < this.size &&
ny >= 0 && ny < this.size &&
(nx != x || ny != y))
{
if (this.cells[nx][ny] === true) livingNeighbours++
}
}
}
return livingNeighbours
}
cloneCells() {
let clone = []
for (let x = 0; x < this.size; x++) {
let column = []
for (let y = 0; y < this.size; y++) {
column.push(this.cells[x][y])
}
clone.push(column)
}
return clone
}
next() {
let nextGen = this.cloneCells()
for (let x = 0; x < this.size; x++) {
for (let y = 0; y < this.size; y++) {
// Conways rules:
let ns = this.neighbours(x, y)
if (this.cells[x][y] === true) {
// any live cell with fewer than two live neighbours dies
if (ns < 2) nextGen[x][y] = false
// any live cell with more than three live neighbours dies
if (ns > 3) nextGen[x][y] = false
} else {
// any dead cell with exactly three live neighbours becomes a live cell
if (ns === 3) nextGen[x][y] = true
}
}
}
this.cells = nextGen
}
spawnGlider() {
let x = Math.round(Math.random() * (this.size-3)) + 1
let y = Math.round(Math.random() * (this.size-3)) + 1
this.cells[x][y] = true
this.cells[x-1][y] = true
this.cells[x][y+1] = true
this.cells[x+1][y+1] = true
this.cells[x+1][y-1] = true
}
onClick(x, y) {
let cellX = Math.floor(x / this.cellSize)
let cellY = Math.floor(y / this.cellSize)
if (cellX < 0) cellX = 0
if (cellY < 0) cellY = 0
if (cellX > this.size-1) cellX = this.size - 1
if (cellY > this.size-1) cellY = this.size - 1
this.cells[cellX][cellY] = !this.cells[cellX][cellY]
this.draw()
}
}