-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
122 lines (100 loc) · 2.37 KB
/
index.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
114
115
116
117
118
119
120
121
122
"use strict";
function Cell(x, y) {
this.x = x
this.y = y
var alive = false
this.isAlive = function () {
return alive
}
this.revive = function () {
alive = true
}
this.die = function () {
alive = false
}
this.toString = function () {
if (alive)
return "*"
else
return "."
}
}
Cell.prototype.applyRules = function () {
if (this.neighbours < 2) return this.die()
if (this.neighbours === 3) return this.revive()
if (this.neighbours > 3) return this.die()
}
function overflowPosition(value, max) {
if (value > max) {
return 0
} else if (value < 0) {
return max
} else {
return value
}
}
function Board(numRows, numColumns) {
var rows = []
var that = this
var iteration = 1
this.print = function () {
console.log("Current Iteration: ", iteration++)
rows.forEach(function (row) {
var str = row.reduce(function (str, cell) {
return str += cell
}, "")
console.log(str)
})
}
function createRow(x) {
var row = []
for (var y = 0; y < numColumns; y++) {
row.push(new Cell(x, y))
}
return row
}
for (var x = 0; x < numRows; x++) {
rows.push(createRow(x))
}
this.at = function (x, y) {
return rows[x][y]
}
var allCells = []
allCells = [].concat.apply(allCells, rows);
this.assignNeighbourCount = function () {
allCells.forEach(function (cell) {
cell.neighbours = neighbourCellsFor(cell).reduce(function (acc, cell) {
if (cell.isAlive()) acc++
return acc
}, 0)
})
}
this.applyRules = function () {
allCells.forEach(function (cell) {
cell.applyRules()
})
}
function neighbourCellsFor(cell) {
var maxRowIndex = numRows - 1
var maxColumnIndex = numColumns - 1
return Board.RELATIVE_NEIGHBOURS.reduce(function (neighbourCells, position) {
var dx = overflowPosition(cell.x + position.x, maxRowIndex)
var dy = overflowPosition(cell.y + position.y, maxColumnIndex)
neighbourCells.push(that.at(dx, dy))
return neighbourCells
}, [])
}
}
Board.prototype.step = function () {
this.assignNeighbourCount()
this.applyRules()
}
Board.RELATIVE_NEIGHBOURS = [
{x: -1, y: -1}, {x: -1, y: 0}, {x: -1, y: 1},
{x: 0, y: -1}, {x: 0, y: 1},
{x: 1, y: -1}, {x: 1, y: 0}, {x: 1, y: 1}
]
module.exports = {
Cell: Cell,
Board: Board
}