Ejemplo n.º 1
0
        //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);
            }
        }