Твоя задача — запрограммировать модель острова с изменяемыми параметрами, состоящую из массива локаций (например, 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 пул — для запуска по расписанию задания роста растений, задания жизненного цикла животных, и задания вывода статистики по системе. Как вариант, можно выводить статистику в одном задании с растениями или животными. Внутри задания жизненного цикла животных можно использовать еще один пул потоков — обычный. Какие задачи отдавать на выполнение этому пулу — решай самостоятельно.

Обязательная часть задания:

  • Иерархия животных (ООП)
  • Поведение животных
  • Многопоточность
  • Статистика по состоянию острова на каждом такте (в консоль)

Опциональная часть задания:

  • Вынести параметры в одно место, чтоб было удобно управлять “симуляцией”
  • Графика вместо консольной статистики. Это может быть как псевдо-графика в консоли, так и JavaFX, Swing…
  • Добавь другие факторы, которые могут влиять на симуляцию:
    • больше видов животных
    • разные виды растений
    • кастомное поведение для группы животных (к примеру, волки охотятся и передвигаются не по одному, а стаей)
    • рельеф на земле, в том числе река, которая препятствует передвижению некоторых животных

О параметрах (если решишь делать)

Чтобы при запуске программы было удобно менять различные ее параметры (размер острова, максимально допустимое количество растений/животных в одной клетке, вероятность передвижения того или иного вида животных, количество приплода у различных видов и т. д.), нужно все эти параметры вынести куда-то, например, в отдельный класс. Должна быть возможность изменять следующие параметры:

  • размер острова
  • длительность такта симуляции
  • количество животных каждого вида на старте симуляции
  • условие остановки симуляции (например, умерли все животные)
  • количество детенышей у каждого вида животных

Юникод (если решишь делать псевдографику)

Для изображения животных можно использовать юникод символы: 🐃, 🐻, 🐎, 🦌, 🐗, 🐑, 🐐, 🐺, 🐍, 🦊, 🦅, 🐇, 🦆, 🐁, 🐛.


Обзор проекта