//Jugada del niño en la que escoge hacia dónde se mueve y ejecuta el movimiento public void Play() { //Si está cargado o en el corral no puede moverse if ((Status == ChildStatus.Carried) || (Status == ChildStatus.Penned)) { return; } if (Playing != null) { Playing(this, null); } //Direcciones hacia donde se puede mover var adjacents = Environment.AdjacentCells(CurrentPos, p => !Environment[p].IsPlaypen() && (Environment[p].IsEmpty() || Environment[p].IsObstacled())); int n; if (adjacents.Count == 0) { return; } n = randomMov.Next(); if (adjacents.Count <= n) { return; } //Escoger aleatoriamente una dirección var tuple = adjacents.ToArray <Tuple <MovementDirection, Point> >()[n]; var moved = MoveTo(tuple.Item2, p => !Environment[p].IsObstacled() || PushObstacle(p, tuple.Item1)); if (!moved) { return; } //Obtener la cuadrícula de la posición anterior var grid = Environment.Grid(PreviousPos); //Obtener el número de niños dentro de la cuadrícula var ch = Environment.ChildrenInGrid(grid); //Eliminar las casillas que no están limpias grid = Environment.CleanGrid(grid); //Obtener el número máximo de suciedad que puede ser generada //dependiendo de la cantidad de casillas vacías y de niños var dirt = Math.Min(grid.Count, ch <= 3 ? Environment.dirtPerGrid[ch] : Environment.dirtPerGrid[3]); //Generar aleatoriamente de 0-dirt casillas sucias Environment.GenDirt(dirt, grid); if (Played != null) { Played(this, null); } }