/// <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); }
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; } } }
//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(); } } } }