Mejorando el reto anterior "Programar un elevador"
Limitar el peso y cantidad de personas que pueden subir al elevador
Nuestro elevador actualmente es superpoderoso. Añádele un límite de capacidad en espacio y peso que puede soportar. No es posible recoger a más de 8 personas o aguantar más de 500 kg. Para esto, antes de preguntar el piso al que se dirigen los residentes de cada piso, también deben especificar su peso.
Elevador parte 2
https://cristianiniguez.github.io/PlatziCodingChallenge/PlatziCodingChallenge_Dia65/
// Limitar el peso y cantidad de personas en JavaScript// Estados de las tareasconst SIN_ATENDER = 0const ATENDIDA = 1// Direcciones del elevadorconst HACIA_ARRIBA = 1const HACIA_ABAJO = -1const QUIETO = 0 class Elevador { constructor() { this.maxPersonas = 8this.maxPeso = 500this.peso = 0this.personas = 0this.mover = this.mover.bind(this) this.piso = 0this.direccion = QUIETO this.tareas = newArray() this.imprimirEstado() } nuevaTarea(personas, peso, pisoInicial, pisoFinal) { if (this.peso + peso <= this.maxPeso && this.personas + personas <= this.maxPersonas) { // Nueva líneathis.tareas.push({ pisoInicial, pisoFinal, personas, peso, estado: SIN_ATENDER }) if (this.direccion === QUIETO) { this.manejarPiso() } } else { alert('El ascensor está muy lleno') } } establecerDireccion() { if (this.hayTareasArriba()) { this.direccion = HACIA_ARRIBA } elseif (this.hayTareasAbajo()) { this.direccion = HACIA_ABAJO } else { this.direccion = QUIETO } } mover() { switch (this.direccion) { caseHACIA_ARRIBA: this.piso++; break; caseHACIA_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++) { const tarea = this.tareas[i]; if (tarea.pisoInicial === this.piso && tarea.estado === SIN_ATENDER) { this.personas += tarea.personas // Nueva líneathis.peso += tarea.peso // Nueva línea tarea.estado = ATENDIDA subidas++ } if (tarea.pisoFinal === this.piso && tarea.estado === ATENDIDA) { tareasFinalizadas.push(i) bajadas++ } } tareasFinalizadas.forEach(i => { this.personas -= this.tareas[i].personas // Nueva líneathis.peso -= this.tareas[i].peso // Nueva líneathis.tareas.splice(i, 1) }) this.establecerDireccion() this.imprimirEstado() if (this.direccion !== QUIETO) { let delay = 2000 + (subidas > 0 ? 5000 : 0) + (bajadas > 0 ? 5000 : 0); setTimeout(this.mover, delay) } } imprimirEstado() { const $numerosPisos = document.querySelectorAll('.floor__elevator-number') $numerosPisos.forEach($np => { $np.innerText = this.piso $np.style.color = $np.id === `floor-${this.piso}` ? 'lime' : 'red' }) document.getElementById('elevator-number').innerText = this.piso let $estado = document.getElementById('elevator-state') switch (this.direccion) { caseQUIETO: $estado.innerText = 'Quieto'; break; caseHACIA_ARRIBA: $estado.innerText = 'Hacia arriba'; break; caseHACIA_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) )) } } const miElevador = new Elevador() const $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 personas = parseInt(prompt('¿Cuántas personas van a subir?')) // Nueva línealet peso = parseFloat(prompt('¿Cuánto es el peso total?')) // Nueva línealet 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)) { miElevador.nuevaTarea(personas, peso, pisoInicial, pisoFinal) // Línea modificada } else { alert('Piso final no válido') } }