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