예제 #1
0
        private List <List <Point> > GetDirtyPaths()
        {
            var dirtyPositions = new List <Point>(Environment.DirtyCells);

            return(Environment.Paths(CurrentPos, dirtyPositions, p => !Environment[p].IsObstacled() &&
                                     (!Environment[p].IsPlaypen() || !Environment[p].IsChild())));
        }
예제 #2
0
        /// <summary>
        /// Camino más corto desde el niño al corral
        /// </summary>
        /// <param name="chPos"></param>
        /// <returns></returns>
        protected List <Point> MinPathToPlaypen(Point chPos, Func <Point, bool> rule = null)
        {
            var emptyPlaypen = Environment.GetEmptyPlaypen(p =>
                                                           Environment[p].CurrentStatus == CellStatus.Empty ||
                                                           Environment[p].CurrentStatus == CellStatus.Robot); //Lista de las casillas del corral que están vacías
            var paths = (List <List <Point> >)Environment.Paths(chPos, emptyPlaypen, rule);

            return(MinPath(paths));
        }
예제 #3
0
 public override void Play()
 {
     if (Environment.AllChildrenInPlaypen())
     {
         //Limpiar la suciedad
         if (Environment[CurrentPos].IsDirty())
         {
             Clean();
         }
         else
         {
             //Se está pasando como parámetro una función que retorna la lista de puntos para
             //recorrer todos las casillas sucias. A su vez esta función llama a la función
             //GetMinPathToDirty que recibe también como parámetro una función con la estrategia
             //para escoger los caminos entre una casilla y una lista de casillas
             PrepareFinalClean(() => GetMinPathToDirty((p, plist) => Environment.Paths(p, plist)));
         }
     }
     else if (minPathToDirty != null)
     {
         CrossPlaypen();
     }
     else if (!IsCarryingChild())
     {
         InitiateMovementToNearChild();
     }
     else
     {
         //Si tiene un niño cargado y está en el corral
         if (Environment.InPlaypen(CurrentPos))
         {
             MoveInsidePlaypen();
         }
         else //Si tiene un niño cargado y no está en el corral
         {
             //Moverse por el camino más cercano al corral dos pasos
             var path = MinPathToPlaypen(CurrentPos, p => !Environment[p].IsObstacled() && !Environment[p].IsChild());
             if (path != null)
             {
                 MoveToPlaypen(path);
             }
             else //Si el camino está bloqueado ejecuta operación del robot limpiador
             {
                 base.Play();
             }
         }
     }
 }
예제 #4
0
        /// <summary>
        /// Caminos del robot a cada uno de los niños
        /// </summary>
        /// <param name="robotPos"> Posición del robot </param>
        /// <returns> Lista de lista de nodos. Cada camino del robot a un niño es una lista de nodos </returns>
        private List <List <Point> > PathToChildren()//Point robotPos)
        {
            var chPositions = Environment.GetChildrenPos();

            return(Environment.Paths(CurrentPos, chPositions));
        }