-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
105 lines (85 loc) · 2.78 KB
/
app.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
class Game {
constructor(field) {
this.field = field;
}
findGroup(row, column) {
const value = this.field[row][column];
const visited = new Set();
const group = [];
this.searchGroup(row, column, value, visited, group);
return group;
}
searchGroup(row, column, value, visited, group) {
if (
row < 0 || row >= this.field.length ||
column < 0 || column >= this.field[0].length ||
visited.has(`${row}-${column}`) ||
this.field[row][column] !== value
) {
return;
}
visited.add(`${row}-${column}`);
group.push({ row, column });
this.searchGroup(row - 1, column, value, visited, group);
this.searchGroup(row + 1, column, value, visited, group);
this.searchGroup(row, column - 1, value, visited, group);
this.searchGroup(row, column + 1, value, visited, group);
}
deleteGroup(group) {
group.forEach(({ row, column }) => {
this.field[row][column] = 0;
});
this.renderGame();
}
applyDarkenEffect(group) {
group.forEach(({ row, column }) => {
const cellDiv = document.querySelector(`.game-cell[data-row="${row}"][data-column="${column}"]`);
cellDiv.classList.add('darken');
});
}
removeDarkenEffect() {
const darkenCells = document.querySelectorAll('.darken');
darkenCells.forEach(cell => {
cell.classList.remove('darken');
});
}
renderGame() {
const gameBoard = document.getElementById('gameBoard');
gameBoard.innerHTML = '';
this.field.forEach((row, rowIndex) => {
const rowDiv = document.createElement('div');
rowDiv.classList.add('row');
row.forEach((cell, columnIndex) => {
const cellDiv = document.createElement('div');
cellDiv.classList.add('game-cell');
cellDiv.setAttribute('data-row', rowIndex);
cellDiv.setAttribute('data-column', columnIndex);
cellDiv.textContent = cell === null ? '' : cell;
cellDiv.addEventListener('click', () => {
const group = this.findGroup(rowIndex, columnIndex);
this.deleteGroup(group);
});
cellDiv.addEventListener('mouseenter', () => {
const group = this.findGroup(rowIndex, columnIndex);
this.applyDarkenEffect(group);
});
cellDiv.addEventListener('mouseleave', () => {
this.removeDarkenEffect();
});
rowDiv.appendChild(cellDiv);
});
gameBoard.appendChild(rowDiv);
});
}
}
const gameField = [
['♠','♠','♣','♢','♣','♣'],
['♠','♠','♣','♢','♢','♢'],
['♠','♣','♣','♢','♢','♢'],
['♠','♣','♣','♣','♣','♢'],
['♡','♣','♣','♣','♡','♡'],
['♡','♡','♣','♣','♢','♣'],
['♡','♡','♡','♠','♠','♣'],
];
const game = new Game(gameField);
game.renderGame();