Твоя задача — запрограммировать модель острова с изменяемыми параметрами, состоящую из массива локаций (например, 100х20 клеток). Локации будут заполнены растительностью и животными. Животные могут:
- есть растения и/или других животных (если в их локации есть подходящая еда),
- передвигаться (в соседние локации),
- размножаться (при наличии пары в их локации),
- умирать от голода или быть съеденными.
ООП
Создавая разнообразие животных, нужно по максимуму использовать ООП: все виды будут происходить от одного абстрактного класса Animal, который будет содержать поведение, общее для всех животных. Если у конкретных животных будут особенности питания, размножения, передвижения и т. д., то для них нужно будет переопределить методы класса Animal.
Что нужно сделать:
1. Создай иерархию классов:
Хищник: Волк, Удав, Лиса, Медведь, Орел
Травоядные: Лошадь, Олень, Кролик, Мышь, Коза, Овца, Кабан, Буйвол, Утка, Гусеница
Растения

В таблице ниже приведено, с какой вероятностью животное съедает "пищу", если они находятся на одной клетке. Давай посмотрим на ситуацию "волк ест кролика". В таблице число 60. Это означает, что волк может съесть кролика, если они на одной клетке, с вероятностью 60%. Нужно использовать многопоточный random.
Волк | Удав | Лиса | Медведь | Орел | Лошадь | Олень | Кролик | Мышь | Коза | Овца | Кабан | Буйвол | Утка | Гусеница | Растения | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Волк | - | 0 | 0 | 0 | 0 | 10 | 15 | 60 | 80 | 60 | 70 | 15 | 10 | 40 | 0 | 0 |
Удав | 0 | - | 15 | 0 | 0 | 0 | 0 | 20 | 40 | 0 | 0 | 0 | 0 | 10 | 0 | 0 |
Лиса | 0 | 0 | - | 0 | 0 | 0 | 0 | 70 | 90 | 0 | 0 | 0 | 0 | 60 | 40 | 0 |
Медведь | 0 | 80 | 0 | - | 0 | 40 | 80 | 80 | 90 | 70 | 70 | 50 | 20 | 10 | 0 | 0 |
Орел | 0 | 0 | 10 | 0 | - | 0 | 0 | 90 | 90 | 0 | 0 | 0 | 0 | 80 | 0 | 0 |
Лошадь | 0 | 0 | 0 | 0 | 0 | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 100 |
Олень | 0 | 0 | 0 | 0 | 0 | 0 | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 100 |
Кролик | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 100 |
Мышь | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 0 | 0 | 0 | 0 | 0 | 90 | 100 |
Коза | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 0 | 0 | 0 | 0 | 0 | 100 |
Овца | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 0 | 0 | 0 | 0 | 100 |
Кабан | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 50 | 0 | 0 | - | 0 | 0 | 90 | 100 |
Буйвол | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 0 | 0 | 100 |
Утка | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 90 | 100 |
Гусеница | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 100 |
Характеристики животных:
Вес одного животного, кг | Максимальное количество животных этого вида на одной клетке | Скорость перемещения, не более чем, клеток за ход | Сколько килограммов пищи нужно животному для полного насыщения | |
---|---|---|---|---|
Волк | 50 | 30 | 3 | 8 |
Удав | 15 | 30 | 1 | 3 |
Лиса | 8 | 30 | 2 | 2 |
Медведь | 500 | 5 | 2 | 80 |
Орел | 6 | 20 | 3 | 1 |
Лошадь | 400 | 20 | 4 | 60 |
Олень | 300 | 20 | 4 | 50 |
Кролик | 2 | 150 | 2 | 0,45 |
Мышь | 0.05 | 500 | 1 | 0.01 |
Коза | 60 | 140 | 3 | 10 |
Овца | 70 | 140 | 3 | 15 |
Кабан | 400 | 50 | 2 | 50 |
Буйвол | 700 | 10 | 3 | 100 |
Утка | 1 | 200 | 4 | 0,15 |
Гусеница | 0.01 | 1000 | 0 | 0 |
Растения | 1 | 200 | N/A | N/A |
2. У животного должны быть методы: покушать, размножиться, выбрать направление передвижения.
3. В классах травоядного и хищника можно реализовать метод покушать. Но обрати внимание, есть травоядное утка, которое ест гусеницу.
4. В конкретных классах того или иного вида можно дорабатывать все методы под особенности животного.
5. Должно быть создано минимум 10 видов травоядных и 5 видов хищников (описаны в п. 1).
Многопоточность
Конечно, можно написать всю программу в одном потоке, используя только циклы. Но нам нужно практически поработать с многопоточностью, поэтому обязательно нужно использовать потоки и пулы потоков. Один scheduled пул — для запуска по расписанию задания роста растений, задания жизненного цикла животных, и задания вывода статистики по системе. Как вариант, можно выводить статистику в одном задании с растениями или животными. Внутри задания жизненного цикла животных можно использовать еще один пул потоков — обычный. Какие задачи отдавать на выполнение этому пулу — решай самостоятельно.
Обязательная часть задания:
Опциональная часть задания:
|
О параметрах (если решишь делать)
Чтобы при запуске программы было удобно менять различные ее параметры (размер острова, максимально допустимое количество растений/животных в одной клетке, вероятность передвижения того или иного вида животных, количество приплода у различных видов и т. д.), нужно все эти параметры вынести куда-то, например, в отдельный класс. Должна быть возможность изменять следующие параметры:
- размер острова
- длительность такта симуляции
- количество животных каждого вида на старте симуляции
- условие остановки симуляции (например, умерли все животные)
- количество детенышей у каждого вида животных
Юникод (если решишь делать псевдографику)
Для изображения животных можно использовать юникод символы: 🐃, 🐻, 🐎, 🦌, 🐗, 🐑, 🐐, 🐺, 🐍, 🦊, 🦅, 🐇, 🦆, 🐁, 🐛.
Обзор проекта
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ