Beispiel #1
0
        /// <summary>
        /// Se mueve aleatoriamente a una de las casillas adyacentes
        /// </summary>
        /// <param name="adjacents"> Casillas adyacentes </param>
        /// <param name="precondition"> Condiciones que tiene que cumplir la casilla para poder ejecutar el movimiento</param>
        /// <returns> True si pudo ejecutar el movimiento </returns>
        protected override bool RandomMove(HashSet <Tuple <MovementDirection, Point> > adjacents, Func <Point, bool> precondition = null)
        {
            var carrying = IsCarryingChild();

            isMoving = true;
            bool moved = false;

            var p = adjacents.FirstOrDefault(x => Environment[x.Item2].IsPlaypen());

            if (carrying && p != null) //Si tiene un niño cargado y una de las casillas adyacentes pertenece al corral
            {
                moved = MoveTo(p.Item2);
            }
            else
            {
                moved = base.RandomMove(adjacents, precondition);
            }
            MovementCount++;
            if (carrying && Environment.InPlaypen(CurrentPos))
            {
                ReleaseChild();
                isMoving = false;
            }

            return(moved);
        }
Beispiel #2
0
        protected void MoveToPlaypen(List <Point> path)
        {
            MoveTo(path[0]);
            MovementCount++;

            var stepCount = 1;

            if (path.Count >= 2)
            { //No ha llegado al corral
                MoveTo(path[1]);
                MovementCount++;
                ++stepCount;
            }
            if (Environment.InPlaypen(CurrentPos))
            {
                if (MaxPathInsidePlaypen?.Count > 0 && stepCount == 1)
                {
                    MoveTo(MaxPathInsidePlaypen[0]);
                    MaxPathInsidePlaypen.RemoveAt(0);
                    MovementCount++;
                }
                //Si no hay ninguna casilla del corral a la que moverse, soltar al niño
                if (MaxPathInsidePlaypen == null || MaxPathInsidePlaypen.Count == 0)
                {
                    ReleaseChild();
                    maxPathInsidePlaypen = null;
                }
            }
        }
Beispiel #3
0
        //private List<List<Point>> GetSmartDirtyPaths()
        //{
        //    var dirtyPositions = new List<Point>(Environment.DirtyCells);
        //    return Environment.SmartDirtyPaths(CurrentPos, dirtyPositions);
        //}

        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.SmartDirtyPaths(p, plist)));
                }
            }
            else if (minPathToDirty != null)
            {
                CrossPlaypen();
            }
            else if (Environment.DirtPercent > Environment.CriticalDirtyPercent &&
                     Environment[CurrentPos].IsDirty())
            {
                Environment.Clean(CurrentPos);
            }
            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();
                    }
                }
            }
        }