-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
167 lines (99 loc) · 2.9 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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
// Constantes
const longitudX = 8;
const longitudY = 5;
// Variables
let alturas = {};
/**
* Genera los bloques a partir de las constantes de arriba del todo.
*/
const generaBloques = () => {
const main = document.querySelector(".fila");
for (let _columna = 0; _columna < longitudX; _columna ++) {
let columna = document.createElement("div");
columna.className = "columna";
for (let _altura = 0; _altura < longitudY; _altura ++) {
let bloque = document.createElement("div");
bloque.className = "bloque";
bloque.onclick = () => pulsaBloque(_columna, _altura);
bloque.id = `${_columna}_${_altura}`;
columna.appendChild(bloque);
};
main.appendChild(columna);
alturas[_columna] = 0;
};
};
/**
* Establece la altura de la columna y lanza el re-pintado de todos los bloques.
*
* @param {number} x Columna
* @param {number} y Fila
*/
const pulsaBloque = (x, y) => {
alturas[x] = y;
pintaBloques();
pintaAgua();
};
/**
* Pinta los bloques que están seleccionados.
*/
const pintaBloques = () => {
for (let _columna = 0; _columna < longitudX; _columna ++) {
for (let _altura = 0; _altura < longitudY; _altura ++) {
let bloque = document.getElementById( `${_columna}_${_altura}`);
if (alturas[_columna] >= _altura) {
bloque.className = " bloque bloque-pintado";
} else {
bloque.className = "bloque bloque-oculto";
}
};
};
};
/**
* Pinta agua en los bloques que corresponde.
*/
const pintaAgua = () => {
// Recorro las filas de arriba a abajo
for (let _altura = longitudY; _altura > 0; _altura --) {
let idxPrimerBloque = null;
let idxSegundoBloque = null;
// Recorro los índices de la fila de 0 a X
for (let _columna = 0; _columna < longitudX; _columna ++) {
let alturaActual = alturas[_columna];
// Compruebo si es un bloque
if (_altura <= alturaActual) {
if (idxPrimerBloque === null) { // Si no tengo primer bloque, lo pongo
idxPrimerBloque = _columna;
} else { // Si ya tengo el primero, pongo el segundo
idxSegundoBloque = _columna;
};
if ((idxSegundoBloque - idxPrimerBloque) > 0) {
pintaFilaAgua(_altura, idxPrimerBloque + 1, idxSegundoBloque - 1)
};
};
};
};
};
/**
* Pinta agua en los bloques indicados.
*
* @param {number} altura A qué altura se va a pintar
* @param {number} desde Desde qué columna
* @param {number} hasta Hasta qué columna
*/
const pintaFilaAgua = (altura, desde, hasta) => {
for (let _columna = desde; _columna <= hasta; _columna ++) {
let bloque = document.getElementById( `${_columna}_${altura}`);
if (alturas[_columna] < altura) bloque.className = " bloque bloque-agua";
};
};
/**
* Reinicia todos los bloques.
*/
const pulsaVaciarTodo = () => {
for (_key in alturas) {
alturas[_key] = 0;
};
pintaBloques();
};
generaBloques();
pintaBloques();