Source: Cell.js

/**
 * @author Antonio Raúl Guijarro Contreras <alu0101100494@ull.edu.es>
 * @file Generación de la clase Cell. Simulará el comportamiento y estructura básica de una célula del juego de la vida.
 * Se podrán generar nuevas clases que hereden de esta para especializar aun más su comportamiento.
 * @copyright Antonio Raúl Guijarro Contreras 2020
 * @since 07.05.2020
 */

import Point from './Point.js';

 /**
  * Clase Cell
  */
class Cell {
  /**
   * Contructor de la clase Cell
   * @param {Point} position 
   */
  constructor(isAlive = true) {
    this.isAlive = isAlive;
    this.neighbors = {alive: [], dead: []};
  }

  /**
   * Inserta un vecino en la lista de vecinos
   * @param {Cell} nei Vecino a añadir dentro de la lista de vecinos
   */
  set neighbor(nei) {
    if (nei != null)  {
      if (nei.isAlive) {
        this.neighbors.alive.push(nei);
      } else {
        this.neighbors.dead.push(nei);
      }
    }
  }

  /**
   * Comprueba si la célula está en un ambiente de subpoblación:
   * Cualquier célula viva con menos de dos vecinos vivos muere
   * @return {boolean} true si existe dicho ambiente : false
   */
  checkSubpopulation() {
    if (this.isAlive) {
      return this.neighbors.alive.length < 2;
    }
    return false;
  }

  /**
   * Comprueba si la célula está en un ambiente de sobrepoblación:
   * Cualquier célula viva con más de tres vecinos vivos muere
   * @return {boolean} true si existe dicho ambiente : false
   */
  checkOverpopulation() {
    if (this.isAlive) {
      return this.neighbors.alive.length > 3;
    }
    return false;
  }

  /**
   * Comprueba si la célula vive en un ambiente neutro:
   * Cualquier célula viva con dos o tres vecinos vivos vive hasta la próxima generación
   * @return {boolean} true si existe dicho ambiente : false
   */
  checkAlive() {
    if (this.isAlive) {
      return this.neighbors.alive.length === 2 || this.neighbors.alive.length === 3;
    }
    return false;
  }

  /**
   * Comprueba si la célula está en un ambiente apareamiento:
   * Cualquier célula muerta con exactamente tres vecinos vivos se convierte en una célula viva
   * @return {boolean} true si existe dicho ambiente : false
   */
  checkMating() {
    if (!this.isAlive) {
      return this.neighbors.alive.length === 3;
    }
    return false;
  }

  /**
   * Comprueba cual es el estado de la célula
   */
  check() {
    if (this.checkSubpopulation()) this.isAlive = false;
    if (this.checkOverpopulation()) this.isAlive = false;
    if (this.checkAlive()) this.isAlive = true;
    if (this.checkMating()) this.isAlive = true;
    return this.isAlive;
  }
}

export default Cell;