Список транспортных средств на дороге состоит из двух категорий: автомобили и
мотоциклы. Автомобили генерируются каждые N1 секунд с вероятностью P1. Мотоциклы
генерируются каждые N2 секунд с вероятностью P2.
переделай согласно моему варианту
1 Задание 1
Разработать программу. Основная задача – разработка упрощенной имитации
поведения объектов.
Объекты реализуются через наследование: абстрактный класс, интерфейс →
наследники.
Рабочий цикл программы:
- запускается процесс симуляции, генерируются объекты классов согласно
заданию;
- симуляция завершается, выводится статистическая информация.
Для решения задачи:
- Создать интерфейс IBehaviour, задающий поведение объекта;
- Создать иерархию классов, определяющие объекты по варианту и
реализующие интерфейс IBehaviour.
- Создать класс Habitat, определяющий размер рабочей области и хранящий
список объектов, с параметрами заданными вариантом. Предусмотреть в
классе метод Update, вызывающийся по таймеру и получающий на вход
время, прошедшее от начала симуляции.
В данном методе должны генерироваться новые объекты и помещаться в
поле визуализации в случайном месте. Визуализация объекта – схематично,
плюсом будет, если объект будет похож на оригинал;
Рабочее окно программы – область визуализации среды обитания объектов;
Симуляция должна запускаться по клавише B и останавливаться по клавише
E. При остановке симуляции список уничтожается. Время симуляции должно
отображаться текстом в области визуализации и скрываться/показываться по
клавише T;
По завершению симуляции в поле визуализации должна выводиться
информация о количестве и типе сгенерированных объектов, а также время
симуляции. Текст должен быть форматирован, т.е. выводиться с
использованием разных шрифтов и цветов.
6. Параметры симуляции задаются в классе Habitat.
Объект – кролик. Бывают 2 видов: обыкновенный и альбинос. Обыкновенные
кролики рождаются каждые N1 секунд с вероятностью P1. Альбиносы
рождаются каждые N2 секунд, при условии, что их количество менее K% от
общего числа кроликов, в противном случае – не рождаются вовсе.
2 Задание 2
1. Изучить основные классы пакета AWT/Swing и классы менеджеров
компоновки.
2. Доработать программу, созданную в задании № 1:
1) поделить рабочую область на 2 части. Визуализация переносится в левую
часть окна, справа появляется панель управления;
2) добавить кнопки «Старт» и «Стоп» в панель управления. Они должны
запускать и останавливать симуляцию соответственно. Если симуляция
остановлена, то кнопка «Стоп» должна блокироваться. Если симуляция идет,
то блокируется кнопка «Старт». Клавиши B и E должны функционировать
по-прежнему;
3) добавить переключатель «Показывать информацию», который разрешает
отображение модального диалога из 7 пункта задания;
4) добавить группу из 2 исключающих переключателей: «Показывать время
симуляции» и «Скрывать время симуляции». Клавиша T должна
функционировать по-прежнему;
5) используя различные менеджеры компоновки, сформировать интерфейс
пользователя согласно индивидуальному заданию;
6) добавить в программу главное в меню и панель инструментов, в которых
продублировать основные команды вашего интерфейса пользователя;
7) при остановке симуляции должно появляться модальное диалоговое окно
(при условии, что оно разрешено) с информацией о количестве и типе
сгенерированных объектов, а также времени симуляции. Вся информация
выводится в элементе TextArea, недоступном для редактирования. В
диалоговом окне должно быть 2 кнопки: «ОК» и «Отмена». При нажатии на
«ОК» симуляции останавливается, а при нажатии на «Отмена»,
соответственно продолжается;
8) предусмотреть проверку данных вводимых пользователем. При вводе
неверного значения обрабатывать исключительную ситуацию: выставлять
значение по умолчанию и выводить диалоговое окно с сообщением об
ошибке;
9) Реализовать следующие элементы управления:
- Периоды рождения объектов – текстовые поля;
- Для задания вероятностей рождения объектов комбобокс и список (шаг
значений 10%);
- Дополнить интерфейс поясняющими метками
3 Код программы
3.1 Класс Simulation
Класс Simulation находится в отношении агрегация с классом Habitat, так как в качестве
поля содержит поле habitat типа Habitat.
В данном классе формируется интерфейс программы. Рабочая область делится на две, в
одной происходит симуляция, в другой находится панель управления.
package simulation;
import java.awt.Color;
import java.awt.Font;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JTextField;
/**
*
* @author Minaeva Taya
*/
public class Simulation {
 static JButton butStart; // кнопка старт
 static JButton butStop; // кнопка стоп
 static Habitat habitat;
 static JRadioButton jradio1; //переключатель 1
 static JRadioButton jradio2;//переключатель 2
 static JTextField txtNOdRabbit; //текстовое поле для обычного кролика
 static JLabel labelPOdRabbit; //метка 1 для обычного кролика
 static JLabel labelNOdRabbit; //метка 2 для обычного кролика
 static JTextField txtNAlRabbit; //текстовое поле для кролика альбиноса
 static JLabel labelNAlRabbit; //метка для кролика альбиноса
 static JComboBox comboOdRabbit; // выпадающий список для кролика обычного
 static JFrame frame; // окно
 static JPanel panelLight; //панель
 static JMenuItem jMenuItemStop;// меню
 static JMenuItem jMenuItemStart;
 static JCheckBoxMenuItem checkBoxMenu; //меню с флажком
 static JCheckBox jcheck;//флажок
 static JRadioButtonMenuItem radioButtonMenuItem1;//Реализация пункта меню
переключателя
 static JRadioButtonMenuItem radioButtonMenuItem2;
 /**
 * @param args the command line arguments
 */
 public static void main(String[] args) {
 frame = new JFrame("Упрощенная имитация поведения объектов"); //Создание окна с
заголовком
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //закрытие окна
 frame.setSize(800, 500); //размер окна
 frame.setLocationRelativeTo(null); //расположение окна
 frame.setResizable(false); //флаг разрешения изменения фрейма
 frame.setLayout(null);
 habitat = new Habitat();
 panelLight = new JPanel(); //левая панель
 panelLight.setBounds(0, 0, 500, 500); //положение и размер
 panelLight.setLayout(new BoxLayout(panelLight, BoxLayout.Y_AXIS));
 panelLight.add(habitat);
 JPanel panelRight = new JPanel(null); //правая панель
 panelRight.setBounds(500, 0, 300, 500); //положение и размер
 panelRight.setBackground(Color.WHITE); //цвет фона
 panelRight.setFocusable(true); //отображение панели
 butStart = new JButton("Старт");//кнопка старт
 butStart.setBackground(Color.GREEN);//цвет кнопки
 butStart.setBounds(10, 120, 80, 20);//размер кнопки
 panelRight.add(butStart); //добавление кнопки в правую панель
 butStop = new JButton("Стоп");//кнопка стоп
 butStop.setBounds(100, 120, 80, 20);//размер кнопки
 butStop.setBackground(Color.GREEN); //цвет кнопки
 butStop.setEnabled(false);
 panelRight.add(butStop); //добавление кнопки в правую панель
 jcheck = new JCheckBox("Показать информацию", false);
 jcheck.setBounds(10, 160, 210, 20);
 //обработка события от флажка
 jcheck.addItemListener(new ItemListener() {
 @Override
 public void itemStateChanged(ItemEvent e) {
 if (jcheck.isSelected())
 checkBoxMenu.setSelected(true);
 else checkBoxMenu.setSelected(false);
 }
 });
 panelRight.add(jcheck); //добавление флажка в правую панель
 //создание группы переключателей
 ButtonGroup group = new ButtonGroup();
 jradio1 = new JRadioButton("Показывать время симуляции", true);
 jradio1.setBounds(10, 180, 210, 20);
 //обработка события выбор пункта меню
 jradio1.addItemListener(new ItemListener() {
 @Override
 /**
 * метод для отображения выбранного пункта из меню
 */
 public void itemStateChanged(ItemEvent e) {
 if (jradio1.isSelected())
 radioButtonMenuItem1.setSelected(true);
 else radioButtonMenuItem1.setSelected(false);
 }
 });
 jradio2 = new JRadioButton("Скрывать время симуляции", false);
 jradio2.setBounds(10, 200, 210, 20);
 //обработка события выбор пункта меню
 jradio2.addItemListener(new ItemListener() {
 @Override
 /**
 * метод для отображения выбранного пункта из меню
 */
 public void itemStateChanged(ItemEvent e) {
 if (jradio2.isSelected())
 radioButtonMenuItem2.setSelected(true);
 else radioButtonMenuItem2.setSelected(false);
 }
 });
 //добавление в группу переключателей
 group.add(jradio1);
 group.add(jradio2);
 //добавление на правую панель
 panelRight.add(jradio1);
 panelRight.add(jradio2);

 txtNOdRabbit = new JTextField(); //текстовое поле
 txtNOdRabbit.setBounds(200, 10, 60, 20);
 //обработка события заполнения поля период рождения обычного кролика
 txtNOdRabbit.addKeyListener(new KeyAdapter() {
 public void keyTyped(KeyEvent e) {
 char c = e.getKeyChar();
 if ( ((c < '0') || (c > '9')) && (c != KeyEvent.VK_BACK_SPACE)) {
 e.consume(); // ignore event
 }
 }
 });
 panelRight.add(txtNOdRabbit); //добавление в правую панель

 labelNOdRabbit = new JLabel("Период рождения обычного кролика: ");
 labelNOdRabbit.setBounds(10, 10, 190, 20);
 labelNOdRabbit.setForeground(Color.GREEN);
 panelRight.add(labelNOdRabbit);

 labelPOdRabbit = new JLabel("Вероятность: ");
 labelPOdRabbit.setBounds(10, 30, 120, 20);
 labelPOdRabbit.setForeground(Color.GREEN);
 panelRight.add(labelPOdRabbit);

 String[] items = {
 "0%",
 "10%",
 "20%",
 "30%",
 "40%",
 "50%",
 "60%",
 "70%",
 "80%",
 "90%",
 "100%"
 };
 comboOdRabbit = new JComboBox(items); //выпадающий список вероятностей для
обычного кролика
 comboOdRabbit.setBounds(200, 30, 60, 20);
 panelRight.add(comboOdRabbit);

 txtNAlRabbit = new JTextField(); //текстовое поле для кролика альбиноса
 txtNAlRabbit.setBounds(200, 60, 60, 20);
 //обработка события заполнения поля период рождения кролика альбиноса
 txtNAlRabbit.addKeyListener(new KeyAdapter() {
 public void keyTyped(KeyEvent e) {
 char c = e.getKeyChar();
 if ( ((c < '0') || (c > '9')) && (c != KeyEvent.VK_BACK_SPACE)) {
 e.consume(); // ignore event
 }
 }
 });
 panelRight.add(txtNAlRabbit); //добавление в правую панель

 labelNAlRabbit = new JLabel("Период рождения кролика альбиноса: ");
 labelNAlRabbit.setBounds(10, 60, 190, 20);
 labelNAlRabbit.setForeground(Color.GREEN);
 panelRight.add(labelNAlRabbit);
 //создание меню Файлы
 JMenu jMenu = new JMenu();
 jMenu.setText("Файл");
 JMenuItem jMenuItem = new JMenuItem();
 jMenuItem.setText("Выход");
 //обработка события меню Выход
 jMenuItem.addActionListener((ActionEvent e) -> {
 int dialogButton = JOptionPane.YES_NO_OPTION;
 if(JOptionPane.showConfirmDialog (null, "Вы действительно хотите
выйти?","Внимание",
 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
 System.exit(0);
 });
 //создание меню Инструменты
 JMenu jTools = new JMenu();
 jTools.setText("Инструменты");
 jMenuItemStart = new JMenuItem();
 jMenuItemStart.setText("Старт");
 //обработка события меню Старт
 jMenuItemStart.addActionListener((ActionEvent e) -> {
 if (!checkInputTextFiedl()) return;
 startSimulate();
 butStartActionPerformed();
 });
 jMenuItemStop = new JMenuItem();
 jMenuItemStop.setText("Стоп");
 jMenuItemStop.setEnabled(false);
 //обработка события меню Стоп
 jMenuItemStop.addActionListener((ActionEvent e) -> {
 if (jcheck.isSelected())
 new AboutDialog(frame);
 else butStopActionPerformed();
 });
 checkBoxMenu = new JCheckBoxMenuItem("Показать информацию", false);
 //обработка события меню
 checkBoxMenu.addItemListener(new ItemListener() {
 @Override
 public void itemStateChanged(ItemEvent e) {
 if (checkBoxMenu.isSelected())
 jcheck.setSelected(true);
 else jcheck.setSelected(false);
 }
 });
 radioButtonMenuItem1 = new JRadioButtonMenuItem("Показывать время симуляции",
true);
 //обработка события меню
 radioButtonMenuItem1.addItemListener(new ItemListener() {
 @Override
 public void itemStateChanged(ItemEvent e) {
 if (radioButtonMenuItem1.isSelected())
 jradio1.setSelected(true);
 else jradio1.setSelected(false);
 }
 });
 radioButtonMenuItem2 = new JRadioButtonMenuItem("Скрывать время симуляции",
false);
 //обработка события меню
 radioButtonMenuItem2.addItemListener(new ItemListener() {
 @Override
 public void itemStateChanged(ItemEvent e) {
 if (radioButtonMenuItem2.isSelected())
 jradio2.setSelected(true);
 else jradio2.setSelected(false);
 }
 });
 //создание группы переключателей
 ButtonGroup bg = new ButtonGroup();
 bg.add(radioButtonMenuItem1);
 bg.add(radioButtonMenuItem2);

 //Создание строки главного меню
 JMenuBar jMenuBar = new JMenuBar();
 //Добавление в главное меню выпадающих пунктов меню
 jMenu.add(jMenuItem);
 jTools.add(jMenuItemStart);
 jTools.add(jMenuItemStop);
 jTools.add(checkBoxMenu);
 jTools.add(radioButtonMenuItem1);
 jTools.add(radioButtonMenuItem2);
 jMenuBar.add(jMenu);
 jMenuBar.add(jTools);
 frame.setJMenuBar(jMenuBar);

 jradio1.addItemListener((e) -> {
 jRadioItemListener();
 });
 //обработка события от кнопки старт
 butStart.addActionListener((e) -> {
 if (!checkInputTextFiedl()) return;
 startSimulate();
 butStartActionPerformed();
 });
 //обработка события от кнопки стоп
 butStop.addActionListener((e) -> {
 if (jcheck.isSelected())
 new AboutDialog(frame);
 else butStopActionPerformed();
 });
 //обработка нажатий клавиш
 panelRight.addKeyListener(new MyKeyAdapter());
 frame.add(panelLight); //добавление левой панели
 frame.add(panelRight); //добавление правой панели
 frame.setVisible(true); //отображение окна
 }

 public static boolean checkInputTextFiedl() {
 //если поля для ввода времени пустые
 if (txtNOdRabbit.getText().equals("") || txtNAlRabbit.getText().equals("")) {
 JOptionPane.showMessageDialog(frame,
 "<html>Заполните все поля для ввода");
 return false;
 }
 return true;
 }

 public static void startSimulate() {
 habitat.setN_AR(Integer.parseInt(txtNAlRabbit.getText()));
 habitat.setN_OR(Integer.parseInt(txtNOdRabbit.getText()));
 habitat.setP_OR(comboBoxConverty(comboOdRabbit));
 }
 /**
 * функция для получения вероятности
 * @param combo - элемент выпадающего списка
 * @return - вероятность
 */
 public static double comboBoxConverty(JComboBox combo) {
 int i = combo.getSelectedIndex();
 switch(combo.getSelectedIndex()) {
 case 0 : return 0.0;
 case 1 : return 0.1;
 case 2 : return 0.2;
 case 3 : return 0.3;
 case 4 : return 0.4;
 case 5 : return 0.5;
 case 6 : return 0.6;
 case 7 : return 0.7;
 case 8 : return 0.8;
 case 9 : return 0.9;
 case 10 : return 1.0;
 }
 return 0.0;
 }
 public static void butStartActionPerformed() {
 habitat.Start();
 //блокирование/разблокирование кнопки
 butStart.setEnabled(false);
 butStop.setEnabled(true);
 //блокирование/разблокирование элемента меню
 jMenuItemStart.setEnabled(false);
 jMenuItemStop.setEnabled(true);
 }
 public static void butStopActionPerformed() {
 habitat.Stop();
 //блокирование/разблокирование кнопки
 butStart.setEnabled(true);
 butStop.setEnabled(false);
 //блокирование/разблокирование элемента меню
 jMenuItemStart.setEnabled(true);
 jMenuItemStop.setEnabled(false);
 }
 public static void jRadioItemListener() {
 habitat.showTime();
 }
 static class MyKeyAdapter extends KeyAdapter {
 @Override
 public void keyReleased(KeyEvent event) {
 //нажатие клавиши "В"
 if (event.getKeyCode() == KeyEvent.VK_B) {
 butStartActionPerformed();
 }
 //нажатие клавиши "Е"
 if (event.getKeyCode() == KeyEvent.VK_E) {
 butStopActionPerformed();
 }
 //нажатие клавиши "Т"
 if (event.getKeyCode() == KeyEvent.VK_T) {
 jRadioItemListener();
 if (jradio1.isSelected()) {
 jradio2.setSelected(true);
 jradio1.setSelected(false);
 } else {
 jradio2.setSelected(false);
 jradio1.setSelected(true);
 }
 }
 }
 }
 // объявление нового класса диалога
 static class AboutDialog extends JDialog {
 public AboutDialog(JFrame owner) {
 super(owner, "Итоги симуляции", true);

 habitat.dropTimer();

 TextArea area = new TextArea(4, 1); //поле
 area.setEditable(false); //запрет редактирования
 area.setFont(new Font("Times New Roman", 1, 15));
 area.append("Итоги симуляции:\n"
 + "Обычных кроликов: " + habitat.getCountOdRabbit() + "\n"
 + "Кроликов альбиносов: " + habitat.getCountAlRabbit() + "\n"
 + "Время симуляции: " + habitat.getM_time() + " сек");
 area.setBounds(10, 10, 260, 200);

 JButton ok = new JButton("ОК");
 ok.setBounds(90, 210, 80, 30);
 //обработка события кнопки ОК
 ok.addActionListener(new ActionListener() {
 public void actionPerformed(ActionEvent event) {
 setVisible(false);
 butStopActionPerformed();
 habitat.starTimer();
 }
 });
 JButton cancel = new JButton("Отмена");
 cancel.setBounds(180, 210, 80, 30);
 //обработка события кнопки Отмена
 cancel.addActionListener(new ActionListener() {
 public void actionPerformed(ActionEvent event) {
 setVisible(false);
 habitat.starTimer((int) habitat.getM_time());
 }
 });
 JPanel panel = new JPanel(null);
 //ввод поля и кнопок в панель
 panel.add(area);
 panel.add(ok);
 panel.add(cancel);
 add(panel);
 setSize(300, 300); //размер
 setVisible(true); //отображение
 }
 }
}
3.2 Класс Habitat
Класс Habitat находится в отношении агрегация с интерфейсом IBehaviour, который задает
поведение объектов, так как в качестве полей содержит поля типа интерфейс (private
IBehaviour odrabbit и private IBehaviour alrabbit). Находится в отношении зависимости с
интерфейсом IBehaviour, так как изменение интерфейса IBehaviour может привести к
изменению класса Habitat.
Содержит методы:
 public boolean bornAlbinosRabbit(double time)- генерация кроликов альбиносов
 public boolean bornOrdinaryRabbit(double time)- генерация обычных кроликов
 public void Update(double elapsedTime)- функция обновления таймера
 public void paint(Graphics g)- для рисования объектов визуализации
 private int myRandom(int x, int y) – для задания координат
 public void results(Graphics g)- для рисования итогов симуляции
 public void showTime()- метод для показа/скрытия времени
 public void Stop()- для остановки симуляции
 public void Start()- для начала симуляции
 private void Init()- обработка нажатия клавиш
 private void removeSimul() - для удаления элементов из списка, остановки времени
после завершения симуляции
package simulation;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Minaeva Taya
*/
 public class Habitat extends Applet {
 private int N_OR = 2; //генерация обычных кроликов каждые N секунд
 private double P_OR = 0.6; // с вероятностью P
 private int N_AR = 4; //генерация альбиносов каждые N секунд
 private double P_AR; //с вероятностью P
 private double K = 0.5;// 50 процентов для сравнения
 private Timer m_timer = new Timer(); //таймер
 private double m_time = 0; //время отсчета
 private IBehaviour odrabbit;//поведение обычного кролика
 private IBehaviour alrabbit;//поведение кролика альбиноса
 private double lostTimeBornOdinary = 0; //последнее время создания обычного кролика
 private double lostTimeBornAlbinos = 0; //последнее время создания кролика альбиноса
 private int countOdRabbit = 0; //количество обычных кроликов
 private int countAlRabbit = 0; //количество кроликов альбиносов
 private boolean simulStart = false;
 private boolean simulStop = false;
 private boolean timeSimul = true;
 private final Vector vector = new Vector(); //список
 public Habitat(){
 Init();
 }
 /**
 * @return the K
 */
 public double getK() {
 return K;
 }
 /**
 * @param K the K to set
 */
 public void setK(double K) {
 this.K = K;
 }
 public boolean isSimulStart() {
 return simulStart;
 }
 public boolean isSimulStop() {
 return simulStop;
 }
 /**
 * @return the N_OR
 */
 public int getN_OR() {
 return N_OR;
 }
 /**
 * @return the P_OR
 */
 public double getP_OR() {
 return P_OR;
 }
 /**
 * @return the N_AR
 */
 public int getN_AR() {
 return N_AR;
 }

 /**
 * @return the P_AR
 */
 public double getP_AR() {
 return P_AR;
 }
 /**
 * @param P_AR the P_AR to set
 */
 public void setP_AR(double P_AR) {
 this.P_AR = P_AR;
 }
 /**
 * @return the m_timer
 */
 public Timer getM_timer() {
 return m_timer;
 }
 /**
 * @param m_timer the m_timer to set
 */
 public void setM_timer(Timer m_timer) {
 this.m_timer = m_timer;
 }
 /**
 * @return the m_time
 */
 public double getM_time() {
 return m_time;
 }
 /**
 * @param m_time the m_time to set
 */
 public void setM_time(double m_time) {
 this.m_time = m_time;
 }
 /**
 * @return the odrabbit
 */
 public IBehaviour getOdrabbit() {
 return odrabbit;
 }
 /**
 * @param odrabbit the odrabbit to set
 */
 public void setOdrabbit(IBehaviour odrabbit) {
 this.odrabbit = odrabbit;
 }
 /**
 * @return the alrabbit
 */
 public IBehaviour getAlrabbit() {
 return alrabbit;
 }
 /**
 * @param alrabbit the alrabbit to set
 */
 public void setAlrabbit(IBehaviour alrabbit) {
 this.alrabbit = alrabbit;
 }
 /**
 * @return the countOdRabbit
 */
 public int getCountOdRabbit() {
 return countOdRabbit;
 }
 /**
 * @param countOdRabbit the countOdRabbit to set
 */
 public void setCountOdRabbit(int countOdRabbit) {
 this.countOdRabbit = countOdRabbit;
 }
 /**
 * @return the countAlRabbit
 */
 public int getCountAlRabbit() {
 return countAlRabbit;
 }
 /**
 * @param countAlRabbit the countAlRabbit to set
 */
 public void setCountAlRabbit(int countAlRabbit) {
 this.countAlRabbit = countAlRabbit;
 }
 /**
 * @param N_OR the N_OR to set
 */
 public void setN_OR(int N_OR) {
 this.N_OR = N_OR;
 }
 /**
 * @param P_OR the P_OR to set
 */
 public void setP_OR(double P_OR) {
 this.P_OR = P_OR;
 }
 /**
 * @param N_AR the N_AR to set
 */
 public void setN_AR(int N_AR) {
 this.N_AR = N_AR;
 }
 //Обновление таймера
 private class Updater extends TimerTask {
 Habitat m_applet = null;
 // Первый ли запуск метода run()?
 private boolean m_firstRun = true;
 // Время начала
 private long m_startTime = 0;
 // Время последнего обновления
 private long m_lastTime = 0;
 public Updater(Habitat applet) {
 m_applet = applet;
 }

 public Updater(Habitat applet, int startTime) {
 m_applet = applet;
 this.m_startTime = startTime;
 m_firstRun = false;
 }
 @Override
 public void run() {
 //вызываем обновление
 m_applet.Update(m_startTime++);
 }
 }
 private void Init() {
 //обработка нажатий клавиш
 addKeyListener(new MyKeyAdapter());
 }
 private class MyKeyAdapter extends KeyAdapter {
 @Override
 public void keyReleased(KeyEvent event) {
 //нажатие клавиши "В"
 if(event.getKeyCode() == KeyEvent.VK_B) {
 Start();
 }
 //нажатие клавиши "Е"
 if(event.getKeyCode() == KeyEvent.VK_E) {
 Stop();
 }
 //нажатие клавиши "Т"
 if(event.getKeyCode() == KeyEvent.VK_T) {
 showTime();
 }
 }
 }
//начать симуляцию
 public void Start() {
 if (simulStart) {
 return;
 }
 simulStart = true;
 simulStop = false;
 removeSimul();
 }
//остановка симуляции
 public void Stop() {
 simulStop = true;
 simulStart = false;
 }
 public void showTime() { //метод для показа/скрытия времени
 timeSimul = timeSimul != true;
 }
 //Функция обновления таймера
 public void Update(double elapsedTime) {
 if (simulStart){
 setM_time(elapsedTime);
 }
 this.repaint();
 }
 @Override
 public void paint(Graphics g) {
 if (simulStop){ //если симуляция остановлена
 return;
 }
 g.setColor(Color.WHITE);
 g.fillRect(0, 0, 500, 60);
 g.setColor(Color.RED);
 String str = "Time = " + Double.toString(m_time);
 if (timeSimul)
 g.drawString(str, 15, 15);
 //устанавливаем задний фон,который имитирует среду обитания(в данном случаетрава)
 Image img;
 img = Toolkit.getDefaultToolkit().getImage("src/GreenField.png");
 g.drawImage(img, 0, 60, null);

 try {
 bornOdinaryRabbit(m_time);
 } catch (IOException ex) {
 Logger.getLogger(Habitat.class.getName()).log(Level.SEVERE, null, ex);
 }
 try {
 bornAlbinosRabbit(m_time);
 } catch (IOException ex) {
 Logger.getLogger(Habitat.class.getName()).log(Level.SEVERE, null, ex);
 }
 for (Object obj : vector) {
 IBehaviour ib = (IBehaviour) obj;
 //рисуем указанное изображение типа Image
 g.drawImage(ib.getImage(), ib.getDx(), ib.getDy(), this);
 g.setColor(Color.RED);
 String strLegal = "Обычных кроликов: " + String.valueOf(getCountOdRabbit());
 //Рисуем указанную строку красным цветом
 g.drawString(strLegal, 15, 30);
 g.setColor(Color.RED);
 String strIndividual = "Кроликов-альбиносов: " + String.valueOf(getCountAlRabbit());
 //Рисуем указанную строку зеленым цветом
 g.drawString(strIndividual, 15, 45);
 }
 }
 public void result(Graphics g) {
 g.setFont(new Font("Times New Roman", 1, 14));
 g.setColor(Color.WHITE);
 g.fillRect(0, 0, 500, 500); //закрашиваем прямоугольник белым цветом
 g.setColor(Color.BLACK);//Рисуем указанную строку текущим шрифтом и черным
цветом
 String s1 = "Итоги симуляции:";
 g.drawString(s1, 50, 50);
 g.setColor(Color.BLUE);
 String strLegal = "Количество обычных кроликов: " + String.valueOf(countOdRabbit);
 //Рисуем указанную строку текущим шрифтом и синим цветом
 g.drawString(strLegal, 50, 70);
 g.setColor(Color.BLUE);
 String strIndividual = "Количество кроликов альбиносов: " +
String.valueOf(countAlRabbit);
 //Рисуем указанную строку текущим шрифтом и синим цветом
 g.drawString(strIndividual, 50, 90);
 g.setColor(Color.BLUE);
 String str = "Время симуляции: " + Double.toString(m_time) + " сек";
 //Рисуем указанную строку текущим шрифтом и синим цветом
 g.drawString(str, 50, 110);
 }

 /**
 * генерация обычного кролика
 * @param time - время симуляции
 * @return
 */
 public boolean bornOdinaryRabbit(double time) throws IOException{
 setOdrabbit(new OdinaryRabbit(getN_OR(), getP_AR()));
 //если разница между текущем временем симуляции и последним временем создания
больше или равно времени генерации
 if (time - lostTimeBornOdinary >= getOdrabbit().getN()) {
 lostTimeBornOdinary = time; //запоминаем последнее время создания
 getOdrabbit().setDx(myRandom(0, 400));
 getOdrabbit().setDy(myRandom(60, 400));
 double P = myRandom(0, 10); //случайное число от 0 до 10
 if (P / 10 <= getOdrabbit().getP()) { //Если это число меньше либо равно P, то
событие исполняется
 vector.addElement(getOdrabbit()); //Добавляем в конец вектора, увеличивая его
размер на единицу
 setCountOdRabbit(getCountOdRabbit()+1);
 return true;
 }
 }
 return false;
 }
 /**
 * генерация кроликов альбиносов
 * @param time - время симуляции
 * @return
 */
 public boolean bornAlbinosRabbit(double time) throws IOException {
 setAlrabbit(new AlbinosRabbit(getN_AR(), getP_AR()));
 //если разница между текущем временем симуляции и последним временем создания
больше или равно времени генерации
 if (time - lostTimeBornAlbinos >= getAlrabbit().getN()) {
 lostTimeBornAlbinos = time; //запоминаем последнее время создания
 getAlrabbit().setDx(myRandom(0, 400));
 getAlrabbit().setDy(myRandom(60, 400));
 if (getCountAlRabbit()<=(getCountAlRabbit()+getCountOdRabbit())*getK()) { //Если
количество альбиносов меньше 50 процентов от общего числа кроликов, то событие
исполняется
 vector.addElement(getAlrabbit()); //Добавляем в конец вектора, увеличивая его
размер на единицу
 setCountAlRabbit(getCountAlRabbit()+1);
 return true;
 }
 }
 return false;
 }
 /**
 * задание координат
 * @param x
 * @param y
 * @return - координата
 */
 private int myRandom(int x, int y) {
 int diff = y - x;
 Random random = new Random();
 int i = random.nextInt(diff + 1); //случайное число
 random = null;
 return i += x;
 }
 /**
 * функция для удаления элементов из списка и остановки времени после завершения
симуляции
 */
 private void removeSimul() {
 setM_time(0);
 lostTimeBornOdinary = 0;
 lostTimeBornAlbinos = 0;
 setCountOdRabbit(0);
 setCountAlRabbit(0);
 vector.clear(); //удаление элементов
 dropTimer();
 starTimer();
 }
 public void dropTimer() {
 getM_timer().cancel();
 }

 public void starTimer(int startTime) {
 setM_timer(new Timer());
 // таймер будет вызываться каждые 1000 мс
 getM_timer().schedule(new Updater(this, startTime), 0, 1000);
 }

 public void starTimer() {
 setM_timer(new Timer());
 // таймер будет вызываться каждые 1000 мс
 getM_timer().schedule(new Updater(this), 0, 1000);
 }
}
3.3 Интерфейс IBehaviour
Интерфейс IBehaviour находится в отношении агрегации с классом Habitat, так как класс
Habitat в качестве полей содержит поля типа интерфейс. Этот интерфейс реализуется
классом Rabbit и задает поведение объектов. Находится в отношении зависимости с
классом Habitat, так как изменение интерфейса IBehaviour может привести к изменению
класса Habitat.
Содержит методы:
 void setN(int N) - изменяет период появления
 void setP(double P)- изменяет вероятность появления
 void setDx(int x)- изменяет координату х
 void setDy(int y)- изменяет координату у
 double getN()- возвращает период появления
 double getP()- вероятность появления
 String getType()- возвращает тип кролика
 Image getImage() - возвращает изображение кролика
 int getDx()- возвращает координату х
 int getDy()- возвращает координату у
package simulation;
import java.awt.Image;
/**
*
* @author Minaeva Taya
*/
public interface IBehaviour {

 /**
 * Установить период появления
 * @param N
 */
 void setN(int N);
 /**
 * Установить вероятность появления
 * @param P
 */
 void setP(double P);

 /**
 * Установить координату х
 * @param x
 */
 void setDx(int x);
 /**
 * Установить координату у
 * @param x
 */
 void setDy(int y);

 /**
 *
 * @return период появления
 */
 double getN();
 /**
 *
 * @return вероятность появления
 */
 double getP();
 /**
 * @return тип кролика
 */
 String getType();
 /**
 * @return изображение кролика
 */
 Image getImage();
 /**
 * @return координату Х
 */
 int getDx();
 /**
 * @return координату У
 */
 int getDy();
}
3.4 Класс Rabbit
Абстрактный класс Rabbit является родителем для классов OdinaryRabbit и AlbinosRabbit.
Реализует интерфейс IBehaviour, который задает поведение объектов.
Содержит атрибуты:
 N- период появления
 P-вероятность появления кроликов
 typeOfRabbit - тип кролика
 image- изображение кролика
 dx - позиция по х
 dy- Позиция по х
 color- цвет кролика
 veg -овощь
 speed- скорость кролика
 height- длина ушей
Абстрактные методы:
 public abstract String eatveg() - что ест кролик
 public abstract String havecolor()- какой цвет у кролика
 public abstract String price()- стоимость кролика
 public abstract String toString()- выводит информацию о кролике
Методы:
 public String run()- возвращает скорость кролика
 public double getN() - возвращает значение поля период появления кролика
 public double getP()-возвращает значение поля вероятность появления кролика
 public String getType() - возвращает значение поля тип кролика
 public Image getImage() - возвращает значение поля визуализация объекта
 public void setN(int N) - изменяет значение поля период появления
 public void setP(double P) - изменяет значение поля вероятность появления
 public int getDx() - возвращает значение поля позиция по x
 public int getDy()-возвращает значение поля позиция по у
 public void setDx(int x) - изменяет значение поля позиция по x
 public void setDy(int y) - изменяет значение поля позиция по у
 public String getColor() - возвращает значение поля цвет
 public void setColor(String color) - изменяет значение поля цвет
 public String getVeg() - возвращает значение поля овощь
 public void setVeg(String veg)- изменяет значение поля овощь
 public int getSpeed() - возвращает значение поля скорость
 public void setSpeed(int speed) - изменяет значение поля скорость
 public int getHeight()-возвращает значение поля длина ушей
 public void setHeight(int height) - изменяет значение поля длина ушей

package simulation;
import java.awt.Image;
/**
*
* @author Minaeva Taya
*/
public abstract class Rabbit implements IBehaviour {

 private double N;//генерация кроликов каждые N секунд
 private double P;//вероятность появления кроликов
 private final String typeOfRabbit;//тип кролика
 final Image image;//изображение кролика
 private int dx;//Позиция по х
 private int dy;//Позиция по х
 String color;//цвет кролика
 String veg; //овощь
 int speed;//скорость кролика
 private int height;//длина ушей

 /**
 * @param typeOfRabbit - тип кролика
 * @param N - период появления
 * @param P - вероятность появления
 * @param image - визуализация обьекта
 * @param color - цвет кролика
 * @param veg - овощь
 * @param speed - скорость кролика
 * @param height - длина ушей
 */
 public Rabbit (String typeOfRabbit,String color,String veg,int speed,int height, int N, double
P, Image image ) {
 setN(N);
 setP(P);
 this.typeOfRabbit = typeOfRabbit;
 this.image = image;
 this.color = color;
 this.veg = veg;
 this.speed =speed;
 this.height = height;
 }
 /**
 * абстрактный метод какой овощ ест кролик
 */
 public abstract String eatveg();
/**
 * абстрактный метод cтоимость кролика
 */
 public abstract String price();
 /**
 * абстрактный метод скорость кролика
 */
 public abstract String run();
 /**
 * абстрактный метод какой цвет у кролика
 */
 public abstract String havecolor();
 /**
 * возвращает полную информацию об объекте
 */
 public abstract String toString();
 /**
 * метод скорость кролика
 * @return скорость кролика
 */
 public String run() {
 if (speed >0) {
 return "Кролик бежит со скоростью"+speed;
 } else {
 return "Кролик стоит";
 }
 }
 /**
 * возвращает значение поля период появления кролика
 */
 @Override
 public double getN() {
 return N;
 }
 /**
 * возвращает значение поля вероятность появления кролика
 */
 @Override
 public double getP() {
 return P;
 }
 /**
 * возвращает значение поля тип кролика
 */
 @Override
 public String getType() {
 return getTypeOfRabbit();
 }
 /**
 * возвращает значение поля визуализация объекта
 */
 @Override
 public Image getImage() {
 return image;
 }
 /**
 * изменяет значение поля период появления
 */
 @Override
 public void setN(int N) {
 this.N = N;
 }
 /**
 * изменяет значение поля вероятность появления
 */
 @Override
 public void setP(double P) {
 this.P = P;
 }
 /**
 * возвращает значение поля позиция по x
 */
 @Override
 public int getDx() {
 return dx;
 }
 /**
 * возвращает значение поля позиция по у
 */
 @Override
 public int getDy() {
 return dy;
 }
 /**
 * изменяет значение поля позиция по x
 */
 @Override
 public void setDx(int x) {
 this.dx = x;
 }
 /**
 * изменяет значение поля позиция по у
 */
 @Override
 public void setDy(int y) {
 this.dy = y;
 }
 /**
 * возвращает значение поля цвет
 */
 public String getColor() {
 return color;
 }
 /**
 * изменяет значение поля цвет
 */
 public void setColor(String color) {
 this.color = color;
 }
 /**
 * возвращает значение поля овощь
 */
 public String getVeg() {
 return veg;
 }
 /**
 * изменяет значение поля овощь
 */
 public void setVeg(String veg) {
 this.veg = veg;
 }
 /**
 * возвращает значение поля скорость
 */
 public int getSpeed() {
 return speed;
 }
 /**
 * изменяет значение поля скорость
 */
 public void setSpeed(int speed) {
 this.speed = speed;
 }
 /**
 * возвращает значение поля длина ушей
 */
 public int getHeight() {
 return height;
 }
 /**
 * изменяет значение поля длина ушей
 */
 public void setHeight(int height) {
 this.height = height;
 }
 /**
 * возвращает значение поля тип кролика
 */

 public String getTypeOfRabbit() {
 return typeOfRabbit;
 }
}
3.5 Класс AlbinosRabbit
Класс AlbinosRabbit является наследником класса Rabbit(перенимает все его атрибуты и
методы) и реализует абстрактные методы:
 public String havecolor()- какой цвет у кролика
 public String price()- стоимость кролика
 public String eatveg() - что ест кролик
 public String toString()- выводит информацию о кролике
package simulation;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
*
* @author Minaeva Taya
*/
public class AlbinosRabbit extends Rabbit {
 /**
 * @param N - период появления
 * @param P - вероятность появления
 * @throws IOException
 */
 public AlbinosRabbit (int N, double P) throws IOException {
super("Кролик Альбинос","Белый","Морковь",28, 12, N, P, ImageIO.read(new
File("src/AlbinosRabbit.png")));//вызов конструктора суперкласса
 }
 /**
 * переопределенный метод для вывода полной информации об объекте
 * @return полную информацию
 */
 @Override
 public String toString() {
 return "Тип кролика: " +getTypeOfRabbit() + "\nЦвет: "+ getColor()+ "\nДлина ушей: "+
getHeight()+"\nСкорость: "+ getSpeed()+ "\nПердиод появления - " + getN() + "сек." +
"Привит";
 }/**
 * реализация абстрактного метода из класса Rabbit
 * для определения какой овощ ест кролик
 * @return что ест кролик
 */
 @Override
 public String eatveg(){
 return "Кролик альбинос ест"+ veg;
 }
 * реализация абстрактного метода из класса Rabbit
 * для определения какой цвет у кролика
 * @return цвет кролика
 */
 @Override
 public String havecolor(){
 return "Цвет кролика"+ color;
 }
/**
 * реализация абстрактного метода из класса Rabbit
 * для определения стоимости кролика
 * @return цену кролика
 */
 @Override
 public String price(){
 if (getSpeed()> 20){
 return "Цена кролика: 500 рублей";
 } else {
 return "Цена кролика: 300 рублей";
 }
 }
}
3.6 Класс OdinaryRabbit
Класс OdinaryRabbit является наследником класса Rabbit (перенимает все его атрибуты и
методы) и реализует абстрактные методы:
 public String havecolor()- какой цвет у кролика
 public String eatveg() - что ест кролик
 public String price()- стоимость кролика
 public String toString()- выводит информацию о кролике
package simulation;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
*
* @author Minaeva Taya
*/
public class OdinaryRabbit extends Rabbit {

 /**
 * @param N - период появления
 * @param P - вероятность появления
 * @throws IOException
 */
 public OdinaryRabbit (int N, double P) throws IOException {
 super("Обычный кролик","Серый", "Сено",35, 15, N, P, ImageIO.read(new
File("src/OdinaryRabbit.png"))); //вызов конструктора суперкласса
 }

 /**
 * переопределенный метод для вывода полной информации об объекте
 * @return полную информацию
 */
 @Override
 public String toString() {
 return "Тип кролика: " +getTypeOfRabbit() + "\nЦвет: "+ getColor()+ "\nДлина ушей: "+
getHeight()+"\nСкорость: "+ getSpeed()+ "\nПердиод появления - " + getN() + "сек.";
}
/**
 * реализация абстрактного метода из класса Rabbit
 * для определения какой овощ ест кролик
 * @return какой овощ ест кролик
 */
@Override
 public String eatveg(){
 return "Кролик обыкновенный ест"+ veg;
 }
/**
 * реализация абстрактного метода из класса Rabbit
 * для определения какой цвет у кролика
 * @return цвет кролика
 */
 @Override
 public String havecolor(){
 return "Цвет кролика"+ color;
 }
/**
 * реализация абстрактного метода из класса Rabbit
 * для определения стоимости кролика
 * @return цену кролика
 */
 @Override
 public String price(){
 if (getHeight()> 10){
 return "Цена кролика: 500 рублей";
 } else {
 return "Цена кролика: 300 рублей";
 }
 }
}