Mejorando aún más tu elevador inicial, ya que se ha quedado corto para un edificio de 10 pisos y muchas familias. Por lo que la administración decide activar un segundo elevador.
Crea el algoritmo que maneje 2 elevadores.
Recuerda dejar tu código dentro del sistema de comentarios 😉
Doble Elevador en JavaScript
https://cristianiniguez.github.io/PlatziCodingChallenge/PlatziCodingChallenge_Dia66/
// Doble elevador en JavaScript// Estados de las tareasconst SIN_ATENDER = 0const ATENDIDA = 1// Direcciones del elevadorconst HACIA_ARRIBA = 1const HACIA_ABAJO = -1const QUIETO = 0classElevador{ constructor($info, $numbers) { this.$info = $info this.$numbers = $numbers this.mover = this.mover.bind(this) this.piso = 0this.direccion = QUIETO this.tareas = newArray() this.imprimirEstado() } nuevaTarea(pisoInicial, pisoFinal) { this.tareas.push({ pisoInicial, pisoFinal, estado: SIN_ATENDER }) if (this.direccion === QUIETO) { // El elevador está quieto?this.manejarPiso() } } establecerDireccion() { if (this.hayTareasArriba()) { this.direccion = HACIA_ARRIBA } elseif (this.hayTareasAbajo()) { this.direccion = HACIA_ABAJO } else { this.direccion = QUIETO } } mover() { switch (this.direccion) { // Moviendome un piso hacia arriba o hacia abajocase HACIA_ARRIBA: this.piso++; break; case HACIA_ABAJO: this.piso--; break; default: 'Algo anda mal' } this.manejarPiso() } manejarPiso() { let tareasFinalizadas = newArray() let subidas = 0, bajadas = 0for (let i = 0; i < this.tareas.length; i++) { // Para cada tareaconst tarea = this.tareas[i]; if (tarea.pisoInicial === this.piso && tarea.estado === SIN_ATENDER) { // Si hay gente subiendo tarea.estado = ATENDIDA subidas++ } if (tarea.pisoFinal === this.piso && tarea.estado === ATENDIDA) { // Si hay gente bajando tareasFinalizadas.push(i) bajadas++ } } // Eliminando bajadas tareasFinalizadas.forEach(i => { this.tareas.splice(i, 1) }) this.establecerDireccion() this.imprimirEstado() if (this.direccion !== QUIETO) { // Calculando tiempo de esperalet delay = 2000 + (subidas > 0 ? 5000 : 0) + (bajadas > 0 ? 5000 : 0); setTimeout(this.mover, delay) } } imprimirEstado() { this.$numbers.forEach($np => { $np.innerText = this.piso $np.style.color = $np.id === `floor-${this.piso}` ? 'lime' : 'red' }) this.$info.querySelector('#elevator-number').innerText = this.piso let $estado = this.$info.querySelector('#elevator-state') switch (this.direccion) { case QUIETO: $estado.innerText = 'Quieto'; break; case HACIA_ARRIBA: $estado.innerText = 'Hacia arriba'; break; case HACIA_ABAJO: $estado.innerText = 'Hacia abajo'; break; } } hayTareasArriba() { returnthis.tareas.some(tarea => ( (tarea.pisoInicial >= this.piso && tarea.estado === SIN_ATENDER) || (tarea.pisoFinal > this.piso && tarea.estado === ATENDIDA) )) } hayTareasAbajo() { returnthis.tareas.some(tarea => ( (tarea.pisoInicial <= this.piso && tarea.estado === SIN_ATENDER) || (tarea.pisoFinal < this.piso && tarea.estado === ATENDIDA) )) } } // Cuadros de información y numeros de los elevadoresconst $infoElevador1 = document.getElementById('info-elevator-1') const $infoElevador2 = document.getElementById('info-elevator-2') const $numbersElevador1 = document.querySelectorAll('.floor__elevator1-number') const $numbersElevador2 = document.querySelectorAll('.floor__elevator2-number') // Creación de los 2 elevadoresconst elevador1 = new Elevador($infoElevador1, $numbersElevador1) const elevador2 = new Elevador($infoElevador2, $numbersElevador2) // Botones de los ascensoresconst $btnsUp = document.querySelectorAll('.fa-arrow-up') const $btnsDown = document.querySelectorAll('.fa-arrow-down') $btnsUp.forEach($btn => { $btn.addEventListener('click', obtenerTarea) }) $btnsDown.forEach($btn => { $btn.addEventListener('click', obtenerTarea) }) functionobtenerTarea(e) { let pisoInicial = parseInt(e.target.dataset.piso) let direccion = parseInt(e.target.dataset.direccion) let destinos = newArray() switch (direccion) { case1: for (let i = pisoInicial + 1; i <= 9; i++) { destinos.push(i) } break; case-1: for (let i = 0; i <= pisoInicial - 1; i++) { destinos.push(i) } break; } let pisoFinal = parseInt(prompt(`¿A qué piso quiere ir?\n${destinos}`)) if (destinos.some(d => d === pisoFinal)) { const elevador = escogerElevador(pisoInicial) elevador.nuevaTarea(pisoInicial, pisoFinal) } else { alert('Piso final no válido') } } functionescogerElevador(pisoInicial) { const elevadores = [elevador1, elevador2] let elevEscogido // Qué elevador está quieto elevEscogido = elevadores.find(elev => elev.direccion === QUIETO) if (elevEscogido) { return elevEscogido } // Qué elevador está mas cerca de pasar por el piso elevEscogido = elevadores.find(elev => ( (elev.piso > pisoInicial && elev.direccion === HACIA_ABAJO) || (elev.piso < pisoInicial && elev.direccion === HACIA_ARRIBA) || (elev.piso === pisoInicial) )) if (elevEscogido) { return elevEscogido } // Al finalreturn elevadores[0] }