-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgameOfLife.js
136 lines (112 loc) · 4.24 KB
/
gameOfLife.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
В зависимости от выбранной опции в консоли, программа может:
+ Сгенерировать случайную матрицу размером n x m
+ Получить матрицу из файла
Пример матрицы в файле:
0, 0, 0
1, 1, 1
0, 0, 0
*/
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// генерирует новое состояние доски
function generateNextState(board) {
let row = board.length, col = board[0].length
for (let i = 0; i < row; i++) {
for (let j = 0; j < col; j++) {
// считаем количество живых соседей для ячейки [i, j]
const col = countNeighbors(board, i, j)
// мертвая клетка, у которой три живых соседа, возрождается
if (board[i][j] === 0 && col === 3) {
board[i][j] = 2
}
// живая клетка, у которой меньше двух или больше трех соседей, умирает
if (board[i][j] === 1 && (col > 3 || col < 2) ) {
board[i][j] = -1
}
}
}
// окончательное представление доски
for (let i = 0; i < row; i++) {
for (let j = 0; j < col; j++) {
if (board[i][j] > 0) {
board[i][j] = 1
} else {
board[i][j] = 0
}
}
}
};
// подсчет живых соседей
function countNeighbors(board, i, j) {
const neighborsPositions = [[-1,-1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]]
let counter = 0
neighborsPositions.forEach(pos => {
const rowPos = i + pos[0], colPos = j + pos[1]
if (board[rowPos] !== undefined
&& board[rowPos][colPos] !== undefined) {
if (board[rowPos][colPos] === 1 || board[rowPos][colPos] === -1) {
counter++
}
}
})
return counter
}
// генерация случайной матрицы n x m
function generateBoard(n, m) {
const board = Array(n).fill(0).map(_ => Array(m).fill(0))
for (let i = 0; i < board.length; i++) {
for (let j = 0; j < board[0].length; j++) {
board[i][j] = Math.round(Math.random())
}
}
return board
}
function printBoard(board) {
board.forEach(el => console.log(JSON.stringify(el.map(el => el === 0 ? '.' : String(el)))) )
}
function startGame(board) {
if (board.length === 0 || board[0].length === 0) {
console.log('Неправильный размер матрицы')
return
}
console.log('Начальная матрица')
printBoard(board)
let counter = 0
setInterval(() => {
generateNextState(board)
console.clear()
console.log(`${++counter} итерация`)
printBoard(board)
}, 1000)
}
function main() {
rl.question('Вы хотите сгенерировать случайную матрицу? (y/n): ', (answer) => {
if (answer.toLowerCase().trim() === 'y') {
rl.question('Введите размер доски. (Например: 3 3): ', (answer) => {
const [n = 0, m = 0] = answer.trim().split(' ').map(Number)
const board = generateBoard(n, m)
startGame(board)
rl.close()
})
} else if (answer.toLowerCase().trim() === 'n') {
rl.question('Введите путь к файлу. (Например: С://Desktop/myfile.txt): ', (answer) => {
const fs = require('fs');
try {
const arrStr = fs.readFileSync(answer, 'utf8')
const board = arrStr.split("\r\n").map(el => el.split(",").map(Number))
startGame(board)
rl.close()
} catch (err) {
throw new Error(err)
}
})
} else {
rl.close()
}
});
}
main()