private void pictureBox_MouseEnter(object sender, EventArgs e) { if (!TurningTimer.Enabled) { PictureBox picturebox = sender as PictureBox; int x = (int)picturebox.Tag / Map.Height; int y = (int)picturebox.Tag % Map.Height; string line = ""; int count = 0; foreach (Animal animal in MAP.animalsList) { if (animal.coordX == x && animal.coordY == y) { count++; if (animal.GetType() == typeof(Rabbit)) { Rabbit rabbit = animal as Rabbit; line += " Кролик Возраст: " + rabbit.age + "\n"; } if (animal.GetType() == typeof(Wolf)) { Wolf wolf = animal as Wolf; line += " Волк Возраст: " + wolf.age + " Сытость: " + wolf.hunger + "\n"; } if (animal.GetType() == typeof(Shewolf)) { Shewolf shewolf = animal as Shewolf; if (shewolf.pregnancy > 0) { line += " Волчица Возраст: " + shewolf.age + " Сытость: " + shewolf.hunger + " Беременность: " + shewolf.pregnancy + "\n"; } else { line += " Волчица Возраст: " + shewolf.age + " Сытость: " + shewolf.hunger + " Не беременна" + "\n"; } } } } if (count == 0) { toolTip1.SetToolTip(space[x, y], "В этой клетке нет животных"); } else { toolTip1.SetToolTip(space[x, y], "Всего животных в клетке: " + count + " \n" + line); } } }
void SpawnAnimals() //генерация животных { for (int i = 0; i < MAP.RabbitsStartCount; i++) { Rabbit t = new Rabbit(random.Next(Map.Height), random.Next(Map.Width)); //создание объекта класса "Кролик" со случайными координатами t.age = MAP.RabbitIsAdult + 1; //присвоение возраста MAP.animalsList.Add(t); //добавление в общий список животных } for (int i = 0; i < MAP.WolvesStartCount; i++) { Wolf t = new Wolf(random.Next(Map.Height), random.Next(Map.Width)); //создание объекта класса "Волк" со случайными координатами t.age = MAP.WolfIsAdult + 1; //присвоение возраста MAP.animalsList.Add(t); //добавление в общий список животных } for (int i = 0; i < MAP.ShewolvesStartCount; i++) { Shewolf t = new Shewolf(random.Next(Map.Width), random.Next(Map.Height)); //создание объекта класса "Волчица" со случайными координатами t.age = MAP.WolfIsAdult + 1; //присвоение возраста MAP.animalsList.Add(t); //добавление в общий список животных } }
List <Animal> TempAnimalsList = new List <Animal>(); //дополнительный список животных public void Turn() //основная функция хода всех животных { // //ходы кроликов // foreach (Animal animal in animalsList) //цикл по общему списку животных { if (animal.GetType() == typeof(Rabbit)) //если данное животное - это кролик { Rabbit rabbit = animal as Rabbit; //приведение объекта к типу "Кролик" для дальнейшей работы с ним rabbit.age++; //взросление кролика List <int[]> Directions = rabbit.CheckDirections(); //определение возможных направлений хода int rand = random.Next(Directions.Count); //выбор случайной пары координат rabbit.coordX = Directions[rand][0]; //перемещение кролика rabbit.coordY = Directions[rand][1]; // if (random.Next(5) == 1 && rabbit.age > RabbitIsAdult) //если кролик взрослый, то с вероятностью 0,2 создаётся новый кролик { tempAnimalsList.Add(new Rabbit(rabbit.coordX, rabbit.coordY)); } if (rabbit.age == RabbitsDeath) //если кролик старый { rabbit.isDead = true; //смерть кролика } } } CleanList(); //исключение мёртвых животных из списка TransferToMainList(); //перенос крольчат из временного списка в основной // //ходы волков и волчиц // foreach (Animal animal in animalsList) //цикл по общему списку животных { if (animal.GetType() == typeof(Wolf) || animal.GetType() == typeof(Shewolf)) //если данное животное - это волк или волчица { Wolf wolf = animal as Wolf; //приведение объекта к типу "Волк" для дальнейшей работы с ним wolf.age++; //взросление волка bool initiative = true; //инициатива List <int[]> Directions = wolf.CheckDirections(); //вычисление возможных направлений движения if (animal.GetType() == typeof(Shewolf)) //если данное животное - это волчица { Shewolf shewolf = animal as Shewolf; if (shewolf.pregnancy == 1) //если беременность подходит к концу { if (random.Next(2) == 0) //выбор пола волчонка { tempAnimalsList.Add(new Wolf(shewolf.coordX, shewolf.coordY)); //рождение } else { tempAnimalsList.Add(new Shewolf(shewolf.coordX, shewolf.coordY)); //рождение } } if (shewolf.pregnancy > 0) { shewolf.pregnancy--; //увеличение срока } } if (wolf.hunger <= 6 && wolf.age >= WolfIsAdult) //если волк взрослый и голоден, начинается поиск кроликов { for (int i = 0; i < Directions.Count; i++) //кролики ищутся в клетках, доступных для перемещения { foreach (Animal an in animalsList) { if (an.GetType() == typeof(Rabbit)) { Rabbit rabbit = an as Rabbit; if (rabbit.coordX == Directions[i][0] && rabbit.coordY == Directions[i][1] && !rabbit.isDead) //если кролик в нужной клетке и ещё не съеден { wolf.coordX = Directions[i][0]; // перемещение волка к кролику wolf.coordY = Directions[i][1]; // rabbit.isDead = true; //волк кушает кролика wolf.hunger += 10; //повышение сытости initiative = false; //инициатива отключается } if (!initiative) { break; } } } if (!initiative) { break; } } } if (initiative && wolf.age >= WolfIsAdult) //поиск партнёра для размножения { if (animal.GetType() == typeof(Wolf)) //если животное - волк, то ищется волчица { foreach (Animal an in animalsList) { if (an.GetType() == typeof(Shewolf)) { Shewolf s = an as Shewolf; for (int i = 0; i < Directions.Count; i++) //поиск в клетках, доступных для перемещения { if (s.coordX == Directions[i][0] && s.coordY == Directions[i][1] && s.age >= 2 && s.pregnancy == 0 && !s.isDead) //если координаты и остальные условия совпадают { wolf.coordX = Directions[i][0]; // перемещение к волчице wolf.coordY = Directions[i][1]; // s.pregnancy = 3; //волчица забеременела initiative = false; //инициатива отключается } if (!initiative) { break; } } if (!initiative) { break; } } } } else //если животное - волчица, то ищется волк { Shewolf shewolf = animal as Shewolf; if (shewolf.pregnancy == 0) //если волчица сейчас не беременна { foreach (Animal an in animalsList) { if (an.GetType() == typeof(Wolf)) { Wolf w = an as Wolf; for (int i = 0; i < Directions.Count; i++) //поиск в клетках, доступных для перемещения { if (w.coordX == Directions[i][0] && w.coordY == Directions[i][1] && w.age >= 2 && !w.isDead) //если координаты и остальные условия совпадают { wolf.coordX = Directions[i][0]; // перемещение к волку wolf.coordY = Directions[i][1]; // shewolf.pregnancy = 3; //волчица забеременела initiative = false; //инициатива отключается } if (!initiative) { break; } } if (!initiative) { break; } } } } } } wolf.hunger -= 1; //уменьшение сытости за ход if (wolf.hunger == 0 || wolf.age == WolvesDeath) //смерть волка от голода или от старости { wolf.isDead = true; continue; } if (initiative) //просто ход в случайном направлении (при отсутствии других вариантов) { int rand = random.Next(Directions.Count); wolf.coordX = Directions[rand][0]; wolf.coordY = Directions[rand][1]; } } } CleanList(); //исключение мёртвых животных из списка TransferToMainList(); //перенос волчат из временного списка в основной }