Пример #1
0
        private IEnumerable<Action> Move(Animal animal)
        {
            for (int move = 0; move < animal.Moves; move++)
            {
                int dx = Random.Next(-1, 2);
                int dy = Random.Next(-1, 2);

                if (dx == 0 && dy == 0)
                {
                    continue;
                }

                yield return () => this.savannah.Move(animal, animal.Y + dy, animal.X + dx);
            }
        }
Пример #2
0
        private IEnumerable<Action> Act(Animal animal)
        {
            if (animal.IsAlive == false)
            {
                yield break;
            }

            animal.GetOlder();
            animal.LoseWeight(animal.Weight * 0.25);

            // Dies from overpopulation or starvation?
            int max = this.savannah.NumTiles;
            int animals = this.savannah.Animals.Count(a => a.GetType() == animal.GetType());
            double k = Random.NextDouble();
            bool dies = k < ((1.0 * animals) / (1.0 * max)) || animal.Age > Random.Next(5, 20);

            if (dies)
            {
                yield return animal.Deactivate;
                yield break;
            }

            for (int dy = -1; dy <= 1; dy++)
            {
                for (int dx = -1; dx <= 1; dx++)
                {
                    int x = animal.X + dx;
                    int y = animal.Y + dy;

                    Grass neighbourGrass = this.savannah.Grasses.SingleOrDefault(g => g.X == x && g.Y == y);
                    Animal neighbourAnimal = this.savannah.Animals.SingleOrDefault(a => a.IsAlive && a.X == x && a.Y == y);

                    if (neighbourGrass!= null)
                    {
                        yield return () => neighbourGrass.Accept(animal);
                    }

                    if (neighbourAnimal != null)
                    {
                        yield return () => animal.Accept(neighbourAnimal);
                    }
                }
            }
        }
Пример #3
0
 private IEnumerable<Action> Cleanup(Animal animal)
 {
     if (animal.IsAlive == false)
     {
         yield return () => this.savannah.Remove(animal);
     }
 }