3

#PlatziCodingChallenge - Limitar el peso y cantidad de personas

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.

Escribe tu comentario
+ 2
2
19943Puntos

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')
  }
}