Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
PAGE \* MERGEFORMAT2
ДВНЗ «ДОНЕЦЬКИЙ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСІТЕТ»
(повне найменування вищого навчального закладу)
КАФЕДРА СИСТЕМ ШТУЧНОГО ІНТЕЛЛЕКТУ
(повна назва кафедри, циклової комісії)
(РОБОТА)
з _____________«Обєктно-орієнтоване програмування»_____________________
(название дисциплины)
на тему: «Використання технологій обєктно-орієнтованого програмування
_______________для розробки схеми життя лісного біому»___________
Студента (ки) __3__ курса СШІ-11 _ групи
Напрям підготовки ____6.050103 _______
спеціальності __________05010301 ______
__________Домбровський Д.О._______
(фамилия и инициалы)
Керівник ______доцент каф. СШІ ____
__________Бабаков Р.М.____________
(посада, вчене звання, науковий ступінь, прізвище та ініціали)
Національна шкала ______________________
Кількість балів: ______ Оцінка: ECTS ___
Члени комісії ________________ ______________________________
(підпис) (прізвище та ініціали)
________________ _______________________________
(підпис) (прізвище та ініціали)
________________ _______________________________
(підпис) (прізвище та ініціали)
м. _Донецк_ 2013 год
ТЕХНІЧНЕ ЗАВДАННЯ
Варіант завдання
Тема курсової роботи - «Використання технологій обєктно-орієнтованого програмування для розробки схеми життя лісного біому». У умовному лісі існують два типи тварин вовки та зайці. Головна мета для вовків: помножувати свою кількість та вести полювання на зайців, для втомування голоду. Головна мета для зайців: помножувати свою кількість та не потрапляти до вовків.
Для імітації лісу умовно використовується поле з фіксованим, на початок роботи) розміром, що може змінюватися через виправлення у коді програми. Кожне поле може вміщувати безліч тварин, що полють чи розмножуються. Перед тим як рахувати розмноження тварин, виконується перевірка на наявність хижака, що починає полювати, та з деяким шансом це може закінчитися знищенням класу зайця в цьому полі. Якщо ж полювання не вдалося, то за наявністю всіх умов для розмноження двоє типів тварин поширюють свою кількість. Після чого виповнюються «крок» тварини, тобто її переміщення по полю.
Існує деякий нюанс, стосовно розмноження тварин. Щоб уникнути хаотичного розповсюдження звірів по полю, та для введення балансу між сторонами було вирішено зробити розділення тварин на статі. Це дозволяє більш-менш приблизити умови до реальності, та є хорошим методом для запобігання неконтрольованого розповсюдження звірів.
Слід обернути увагу на те, що є умовний захист для класу зайців. По полю в випадковому порядку генеруються «зелені насадження», можна прийняти їх за кущі чи дерева. Їх головна мета укривати зайців від хижаків. Тобто, якщо на одному полі зустрічаються вовк, заєць та дерево, то вовк не може проводити полювання, а в програмі функція що за це відповідає просто пропускається.
Також існує поняття голод. Він реалізований для класу вовки, та не реалізований для класу зайців. Це обумовлюється тим, що хижаки не можуть полювати одне на одного, тому їх популяція повинна також мати параметри для урівноваження. Після вдалого полювання параметр голоду знижається, і вовк може продовжувати свою діяльність.
Головною метою проекту являється створення біому, з власним балансом, що регулює збільшення чи зменшення одного чи іншого класу на полі і через тисячу «кроків» популяції тих чи інших звірів повинна бути врегульована всіма існуючими факторами.
План роботи
Розробка курсового проекту також включає дати проміжних звітних періодів та відповідних найменувань етапів курсового проекту, що здаються, які наведені у таблиці 1.
Таблиця 1- Дати проміжних звітних періодів за видом роботи
Дата |
Найменування етапу |
30.09.013 |
Розробка алгоритмічної частини |
15.10.2013 |
Розробка ієрархії класів |
15.11.2013 |
Реалізація класів |
30.11.2013 |
Розробка інтерфейсу користувача |
15.12.2013 |
Тестування програмного забезпечення |
10.04.2013 |
Оформлення пояснювальної записки |
19.12.2013 |
Захист курсового проекту |
Курсовий проект повинен бути розроблений на підставі таких документів, як: методичні вказівки з оформлення студентських робіт, ДСТУ ГОСТ 7.1:2006.
Додаткові вимоги
Вибір засобів розробки
Програма імітації лісного біому повинна бути реалізована з використанням мови програмування С++. Мова програмування С++ зручна для розробки тим, що дає можливість використовувати технологію обєктно-орієнтованого програмування. Мова С++ розрахована і для консольних проектів, що можуть виступати у якості «двигуна» інших програм.
Вимоги до організаційного забезпечення
Вимоги до технічного забезпечення
Вимоги до технічного забезпечення: мінімальні характеристики для повноцінного функціонування тестової системи:
Розробник |
Домбровський Д.О. |
||
(підпис) |
(П.І.Б.) |
||
Керівник |
доцент, Бабаков Р.М. |
||
(підпис) |
(посада, П.І.Б.) |
РЕФЕРАТ Пояснювальна записка: 40 с., 11 рис., 0 табл., 23 джерел Об'єктом розробки є лісовий біом з природним балансом між ними. Основні цілі виконання даного курсового проекту полягають в систематизації, розширенні і закріпленні теоретичних і практичних знань з дисципліни «Обєктно-орієнтоване програмування», закріпленні й розвиненні навичок самостійного вирішення завдань в області обєктно-орієнтованого програмування та отриманні підтвердження можливості ефективної реалізації програмних продуктів із застосуванням засобів обєктного програмування на прикладі розробки. Для досягнення цієї цілі були застосовані такі методи й технології, як: обєктно-орієнтоване програмування засобами C++. В результаті виконання курсового проекту було досягнуто: створена програма імітації схеми життя лісового біому. Програмний продукт має такі особливості: виконаний як консольне рішення, швидка робота програмного застосунку. Програмний додаток може бути використаний, як приклад використання засобів обєктно-орієнтованого програмування і може вказувати на перевагу цього способу програмування. Програмний продукт був розроблений згідно з вимогами та реалізований у середовищі Visual Studio 2010. Було розроблено пояснювальну записку. |
||||||
5 |
||||||
Ізм. |
Лист |
№ документа |
Підпис |
Дата |
ЗМІСТ Вступ 7 1. Аналіз предмета розробки 9 2. Розробка алгоритмічної частини 11 3. Розробка програмної частини 14 4. Розробка інтерфейсу програми 18 Висновок 22 Перелік використаної літератури 23 Додаток А. Лістинг програми 24
|
||||||
6 |
||||||
Ізм. |
Лист |
№ документа |
Підпис |
Дата |
ВСТУП
Об'єктно-орієнтоване програмування (ООП) - парадигма програмування, в якій основними концепціями є поняття об'єктів і класів. Об'єктно-орієнтоване програмування - це методика розробки програм , в основі якої лежить поняття об'єкта , як певної структури , яка описує об'єкт реального світу , його поведінку. Завдання, яке вирішується з використанням методики ООП , описується в термінах об'єктів і операцій над ними , а програма при такому підході являє собою набір об'єктів і зв'язків між ними.
Об'єктно-орієнтований підхід виник в першу чергу у відповідь на зростаючу складність програмного забезпечення. Використання засобів ООП дає наступні основні переваги: зменшення складності програмного забезпечення, підвищення його надійності програмного забезпечення, забезпечення можливості модифікації окремих компонент програм без зміни решти компонент, забезпечення можливості повторного використання окремих компонент програмного забезпечення.
Актуальність об'єктно-орієнтованого програмування полягає в тому, що систематичне застосування засобів ООП дозволяє розробляти добре структуровані, надійні в експлуатації програмні системи, що досить просто модифікуються. Цим пояснюється інтерес програмістів до об'єктно-орієнтованого підходу і об'єктно-орієнтованим мовам програмування.
Важливість дисципліни «Обєктно-орієнтоване програмування» полягає в тому, що вивчення даної дисципліни дозволяє сформувати базові поняття об'єктно-орієнтованого програмування, отримати навички застосування засобів обєктно-орієнтованого програмування при вирішенні прикладних завдань, розвити системне мислення.
Актуальність ООП як дисципліни полягає в тому, що підготовка спеціалістів в галузі систем штучного інтелекту дозволить забезпечити потребу у фахівцях, що здатні розробляти та описувати засобами обєктно-орієнтованого програмування для опису моделей реального світу та складних промислових систем, систем зі зворотнім звязком, які активно взаємодіють або управляються подіями фізичного світу і для яких ресурси часу і пам'яті обмежені, системи управління та контролю над реальними процесами, створення сайтів та ін.
Метою даної курсової роботи є розробка програми засобами обєктно-орієнтованого програмування з використанням програмної мови С++, що виконує моделювання схеми життя лісового біому.
1 АНАЛІЗ ПРЕДМЕТА РОЗРОБКИ
Об'єктом розробки є ліс (біом лісу) та життя тварин в ньому.
Ліс це сукупність землі, рослинності, в якій домінують дерева та чагарники, тварин, мікроорганізмів та інших природних компонентів, що в своєму розвитку біологічно взаємопов'язані, впливають один на одного і на навколишнє середовище.
Територія з високою щільністю дерев. Рослинні угруповання, що формуються на таких територіях, є характерними для великих площ суходолу в різних районах Земної кулі. Їхніми найважливішими функціями в біосфері є зв'язування вуглекислого газу, утворення біотопів, придатних для життя багатьох видів тварин, рослин та грибів, регулювання гідрологічного режиму, розвиток та підтримка ґрунтів.
Ліси відрізняються від лісистих місцевостей за ознакою змикання покриву: в лісі гілки та листя крон окремих дерев перекривається, хоча, при цьому, і можуть існувати ділянки відкритої місцевості галявини. Лісиста ж місцевість характеризується практично повсюдною наявністю відкритого ґрунту, з деревами, віддаленими одне від одного на відстань більшу, ніж радіуси їхніх крон.
Ліси можна знайти в будь-якому регіоні, де природні умови придатні для сталого росту дерев, вище від рівня моря (а подекуди і нижче), до лінії альпійських лук, за винятком місцевостей, де природна частота вогнепалів надто велика, або середовище зазнає пресу з боку природних або антропогенних факторів (виїдання дикими або свійськими тваринами лісового підросту, вирубка людиною).
Загалом, лісам з домінуванням покритонасінних (широколистяним) притаманне помітно більше біорізноманіття, аніж лісам з домінуванням голонасінних (хвойним). Втім, з цього правила існують і винятки: так, осиково-березові лісові масиви у північних широтах мають нижчі показники біорізноманіття, ніж тамтешні хвойні ліси. Деякі ліси вміщують багато окремих видів дерев на незначній площі (наприклад, тропічні дощові ліси та листопадні ліси помірного поясу), а деякі всього кілька видів, що покривають значні території (гірські хвойні ліси). Будь-який ліс є біотопом, де мешкає багато видів тварин та рослин, і біомаса на одиницю площі є великою порівняно до інших рослинно-утворених співтовариств. Велика частина біомаси, при цьому, знаходиться під землею в кореневих системах та у вигляді частково перегнилого рослинного детриту.
Деревина лісів містить лігнін, котрий є речовиною, що розкладається відносно повільно у порівнянні з іншими органічними матеріалами такими як целюлоза та крохмаль. Цим зумовлений відносно повільний (у порівнянні з іншими рослинними співтовариствами) кругообіг органічних речовин в лісі.
Найбільшими лісовими біомами є такі:
Дощові ліси (вологий тропічний ліс)
Тайга
Твердодеревинні ліси помірного поясу
Тропічні сухі ліси
2 РОЗРОБКА АЛГОРИТМІЧНОЇ ЧАСТИНИ
Щоб приступити до програмної розробки необхідно сформулювати складні алгоритми, що можливо потребують попереднього аналізу та розробки. До таких алгоритмів можна віднести виконання головного коду програми та його основні частини: процес пересування тварини по полю та процес полювання хижака (що входить в пересування). Слід одразу зазначити що програма припиняє свою роботу лише за бажанням користувача, тобто програма не може припинити роботу за власним бажанням.
2.1 Загальний алгоритм виконання програми
2.2 Алгоритм пересування по головному полю
2.3 Алгоритм полювання
3 РОЗРОБКА ПРОГРАМНОЇ ЧАСТИНИ
Для розробки програми імітації були використані класи. Під час написання курсової роботи, класами були описані обєкти та їх звязки, серед класів можна виділити:
Для створення двох основних класів вовк та заєць, використовується спадкування. Параметри класу Animal передаються в наступні класи:
Клас Tree( Дерево ) налічує наступні члени та методи:
Клас Animal (Тварина) налічує наступні члени та методи:
Ці параметри повністю наслідують два, все зазначених, класи. Логічним було б винести параметр Hungry з к класу Animal, та додати його до успадкованого класу Wolf, адже в програмі, голод використовується тільки для вовків. Але це дає змогу додати одну функцію, що може змінювати параметр голоду в зайців, і таким чином контролювати їх за допомогою рослинності на полі.
Глобальні функції программи:
Клас являє собою головне інструментальне засіб C++ для об'єктно- орієнтованого програмування. Клас дуже схожий на структуру, в якій згруповані елементи, відповідні даними про деякий об'єкт, і оперують цими даними функції ( звані методами). Ви дізнаєтеся, що об'єкт являє собою деяку сутність, наприклад телефон. Клас C++ дозволяє вашим програмам визначати всі атрибути об'єкта. У разі, коли об'єктом є телефон, клас може містити такі елементи даних, як номер і тип телефону ( кнопковий або дисковий ) і функції, що працюють з телефоном, наприклад dial, answer, і hang_up . Групуючи дані про об'єкт і кодуючи їх в одній змінної, ви спрощуєте процес програмування і збільшуєте можливість повторного використання свого коду. Під час розробки програми було розроблено 2 класи: tree, animal.
Віртуальний метод (віртуальна функція) - в об'єктно-орієнтованому програмуванні метод (функція) класу, який може бути перевизначений в класах-спадкоємців так, що конкретна реалізація методу для виклику буде визначатися під час виконання. Віртуальні методи - один з найважливіших прийомів реалізації поліморфізму. Проте у нашій структурі є лише 2 класи, які не наслідують один одного, а лише мають зв'язок через вказівники.
Під перевантаженням функції розуміється, визначення кількох функцій (дві або більше) з однаковим ім'ям, але різними параметрами. Набори параметрів перевантажених функцій можуть відрізнятися порядком проходження, кількістю, типом. Таким чином перевантаження функцій потрібна для того, щоб уникнути дублювання імен функцій, виконують подібні дії, але з різною програмної логікою. Усі функції у цьому проекти являються унікальними, та ніяк не дублюються, використати перевантаження функцій тут ніде.
В об'єктно-орієнтованому програмуванні конструктор класу (від англ. Constructor, іноді скорочують ctor) - спеціальний блок інструкцій, що викликається при створенні об'єкта. Конструктор C++ - це особливий метод, що має ім'я, що збігається з ім'ям класу.
Конструктори були використані у 2 класах, у них задавались або генерувались стартові параметри обєктів класу.
Динамічна ідентифікація типу даних - механізм у деяких мовах програмування, що дозволяє визначити тип даних змінної або об'єкта під час виконання програми.
Динамічне визначення типів не було використане, бо в нас не має базового класу, тому ніде створити базовий вказівник.
Перевантаження операторів - це можливість призначати нове значення операторам при використанні їх з певним класом. При побудові програми гри не були використані перевантаження операторів. Це повязано з тим, що зв'язок між класами був побудований таким чином, що у перевантажені класів немає потреби.
Наслідування - це процес, за допомогою якого, один об'єкт може успадковувати властивості іншого об'єкту і додавати до них риси, характерні тільки для нього. При написані програми було використане наслідування. Два класи: Wolf, Rabbit наслідували параметри з класу Animal.
Стандартна Бібліотека Шаблонів надає набір добре сконструйованих та злагоджено працюють разом узагальнених компонентів C++. Особлива турбота була проявлена для забезпечення того, щоб всі шаблонні алгоритми працювали не тільки зі структурами даних у бібліотеці, але також і з вбудованими структурами даних C++. Наприклад , всі алгоритми працюють із звичайними покажчиками. Ортогональний проект бібліотеки дозволяє програмістам використовувати бібліотечні структури даних зі своїми власними алгоритмами, а бібліотечні алгоритми - зі своїми власними структурами даних. Добре певні семантичні вимоги і вимоги складності гарантують, що компонент користувача буде працювати з бібліотекою і що він буде працювати ефективно. Ця гнучкість забезпечує широку застосовність бібліотеки.
Інша важливе міркування - ефективність. C ++ успішний, тому що він об'єднує виразну потужність з ефективністю. Багато зусиль було витрачено, щоб перевірити, що кожен шаблонний компонент в бібліотеці має узагальнену реалізацію, яка має ефективність виконання з різницею в межах декількох відсотків від ефективності відповідної програми ручної кодування.
4 РОЗРОБКА ІНТЕРФЕЙСУ ПРОГРАМИ
4.1 Вступ
Интерфейс командной строки (англ. Command line interface, CLI) разновидность текстового интерфейса (CUI) между человеком и компьютером, в котором инструкции компьютеру даются в основном путём ввода с клавиатуры текстовых строк (команд), в UNIX-системах возможно применение мши. Также известен под названием консоль.
Интерфейс командной строки противопоставляется системам управления программой на основе меню, а также различным реализациям графического интерфейса.
Формат вывода информации в интерфейсе командной строки не регламентируется; обычно это также простой текстовый вывод, но может быть и графическим, звуковым и т.д.
На устройстве-консоли, которое печатало текст на бумаге, интерфейс командной строки был единственным возможным. На видеотерминалах интерфейс командной строки применяется по таким причинам:
Небольшой расход памяти по сравнению с системой меню.
В современном программном обеспечении имеется большое число команд, многие из которых нужны крайне редко. Поэтому даже в некоторых программах с графическим интерфейсом применяется командная строка: набор команды (при условии, что пользователь знает эту команду) осуществляется гораздо быстрее, чем, например, навигация по меню.
Естественное расширение интерфейса командной строки пакетный интерфейс. Его суть в том, что в файл обычного текстового формата записывается последовательность команд, после чего этот файл можно выполнить в программе, что возымеет такой же (не меньший) эффект, как если бы эти команды были по очереди введены в командную строку. Примеры .bat-файлы в DOS и Windows, shell-скрипты в Unix-системах.
Если программа полностью или почти полностью может управляться командами интерфейса командной строки и поддерживает пакетный интерфейс, умелое сочетание интерфейса командной строки с графическим предоставляет пользователю очень мощные возможности.
4.2 Меню
У відповідності з завданням моя розробка повинна давати можливість контролювати всі процеси в програмі. Таким чином було створене меню, що викликається при запуску програми та при натиску Esc в процесі роботи програми. При відкритті меню, виконання програми ставиться на паузу. Це меню містить наступні пункти:
Рисунок 4.1 Меню
Рисунок 4.2 Стартові параметри.
Рисунок 4.3 Зміна стартових параметрів.
Рисунок 4.4 Робота в режимі «Пошаговый с отрисовкой графики»
Рисунок 4.5 Робота в режимі «Пошаговый без отрисовки графики»
Висновок
У цій роботі виконана розробка комп'ютерної програми з використанням засобів ООП, що представляє собою моделювання лісного біому, з власною системою розподілення живого ресурсу в ньому.
При розробці програми були використані такі засоби ООП, як класи, конструктори, спадкування, стандартна бібліотека класів.
Під час виконання курсової роботи було систематизовані, розширенні й закріпленні основні теоретичні і практичні знання з дисципліни «Обєктно-орієнтоване програмування», закріпленні й розвиненні навички самостійного вирішення завдань в області обєктно-орієнтованого програмування та отримане підтвердження можливості ефективної реалізації програмних продуктів із застосуванням засобів обєктного програмування на прикладі цієї програми.
Для досягнення цієї цілі були застосовані такі методи й технології, як: обєктно-орієнтоване програмування засобами C++.
ПЕРЕЛІК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ
Додаток А
Лістинг програми
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <conio.h>
#include <time.h>
#include <typeinfo>
#include <windows.h>
using namespace std;
//размерность поля
const int w=50;
const int h=50;
int old=50; //через сколько шагов кролики могут размножаться
int delay=33; //задержка в миллисекундах
long int step=0; //кол-во пройденых шагов (выполненых итераций)
int endstep=0; //кол-во перемотки шагов вперед
int death=100;
int razmW=1;
int razmR=1;
int colW=5;
int colR=10;
int colT=10;
int font=0;
int pauser=0;
class tree
{ public:
int x,y;
tree()
{
x=rand()%w;
y=rand()%h;
}
};
class animal
{
public:
int x,y; //положение
bool male; //пол
int year; //возраст
int hungry; //голод
animal()
{
male=rand()%2;
x=rand()%w;
y=rand()%h;
year=rand()%50+25;
hungry=700+rand()%100;
}
};
class wolf:public animal
{
public:
wolf()
{
}
};
class rabbit: public animal
{
public:
rabbit()
{
}
};
template <class TT> struct list
{
TT key;
list *pred,*next;
void del()
{
this->pred->next = this->next;
this->next->pred=this->pred;
delete this;
}
} ;
template <class TT> class spisok
{
public:
list <TT> *beg;
spisok()
{
beg=0;
srand(int(time)); //**********
list <TT> *p;
p=new (list <TT>);//создать первый элемент
beg=p;//запомнить адрес в переменную beg, в которой хранится начало списка
p->pred=0;p->next=0;//запомнить адресные поля
}
void finding() //сравнивание положение всех элементов списка
{
list <TT> *r=beg;
list <TT> *r2=beg;
for(int i=0;r->next!=0; r=r->next)
{
if (r->key.year < old) r->key.year++;
r2=beg;
for(int i=0;r2->next!=0; r2=r2->next)
{
if ((r->key.x == r2->key.x) && ( (r->key.y == r2->key.y)) )
if( r->key.male != r2->key.male )
if ((r->key.year>=old)&& (r2->key.year>=old))
{
if (strcmp(typeid(TT).name(),"class wolf")==0)
add(razmW);
else
add(razmR);
//размжножение
//r->key.year=0;
//r2->key.year=0;
}
}
}
}
void move()
{
list <TT> *p=beg;;
while (p)
{
if (p->key.x==0) p->key.x++; //если у левой грани то двигаемся вправо
else
if (p->key.x==w) p->key.x--; //если у правой грани двигаемся влево
else
p->key.x+=rand()%3-1; //если не у граней, то в любую сторону
//аналогично
if (p->key.y==0) p->key.y++;
else
if (p->key.y==h) p->key.y--;
else
p->key.y+=rand()%3-1;
//p->key.hungry--;
p=p->next;
}
}
void add(int k)
{
list <TT>*p;
for (int i=0; i<k; i++)
{
p=new(list <TT>); //создать новый элемент и заполнить ключевое поле
list <TT> *r=beg;//встать на начало списка
for(int i=0;r->next!=0; r=r->next); //пройти по списку до конца списка
p->next=0;
r->next=p;
p->pred=r;
}
}
void add(int x,int y)
{
list <TT> *p;
p=new(list <TT>); //создать новый элемент и заполнить ключевое поле
list <TT> *r=beg;//встать на начало списка
for(int i=0;r->next!=0; r=r->next); //пройти по списку до конца списка
p->next=0;
r->next=p;
p->pred=r;
}
void display(int font)
{
int wlf=0;
if (strcmp(typeid(TT).name(),"class wolf")==0)
wlf=1;
else if (strcmp(typeid(TT).name(),"class rabbit")==0)
wlf=2;
else wlf=3;
char CH;
switch(wlf)
{
case 1:
CH='W'; break;
case 2:
CH='*'; break;
case 3:
CH=5; break;
}
list <TT>*p=beg;
int kol=0;
COORD position;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (font==0)
while (p)
{
kol++;
p=p->next;
}
else
while (p)
{
kol++;
position.X = p->key.x;
position.Y = p->key.y;
SetConsoleCursorPosition(hConsole, position);
cout <<CH;//<< p->key.male;
p=p->next;
}
//сдвигаем курсор ниже границы
if (font==1)
{
position.X = 0;
position.Y = h+1;
}
if (wlf==1 && font==1)
position.Y+=1;
SetConsoleCursorPosition(hConsole, position);
if (wlf==2)
cout << " Зайцы :"<< kol <<"\n";
else
if (wlf==1)
cout << " Волки :"<< kol;
if (wlf==1)
cout<<"\n Step: " << step;
}
};
spisok <wolf> W;
spisok <rabbit> R;
spisok <tree> T;
//функция удаление элемента списка, передаем в неё указатель на список с помошью & и указатель на элемент списка
template <class TT>
list <TT> * del(spisok <TT> *A, list <TT> *rp)
{
list <TT> *rp2;
if (rp->pred==0) //если первый элемент списка
{
A->beg=rp->next;
delete rp;
A->beg->pred=0;
rp=A->beg;
} else
if (rp->next==0) //если посл элемент
{
rp=rp->pred;
delete rp->next;
rp->next=0;
cout <<"2";
} else
{ //если в середине
//rp=rp->next; //переходим на след элемент
//удаляем предыдущий
rp2=rp->pred;
rp->pred->next = rp->next;
rp->next->pred=rp->pred;
delete rp;
rp=rp2;
}
return rp;
}
void hunt()
{
list <wolf> *wp;
wp=W.beg;
list <rabbit> *rp;
list <rabbit> *rp2;
rp=R.beg;
while (wp) //цикл по волкам
{
rp=R.beg;
wp->key.hungry--;
if (wp->key.hungry<=0)
{
if (wp->next!=0)
wp=del(&W,wp);
if (wp==W.beg) continue;
}
while(rp->next!=0) //цикл по кроликам
{
if ( (wp->key.x==rp->key.x) && (wp->key.y==rp->key.y) ) //находятся в одной ячейке то удаляем кролика
{
wp->key.hungry+=10; //пополняем голод волка
rp=del(&R,rp);
continue;
}
if (!rp->next) break; //проверк после удаления, если мы стали на посл элемент, то выходим из цыкла
rp=rp->next; //переход на след кролика
}
if (!wp->next) break;
wp=wp->next; //переход на след волка
}
}
void menu1();
void timer()
{
setlocale(LC_ALL,"RUS");
int stop;
while(1)
{
if(_kbhit())
{
if (getch()==27)
{
menu1();
}
}
step++;
R.finding();
W.finding();
W.move();
R.move();
hunt();
if (step>endstep)
{
system("CLS");
if (font==1)
T.display(font);
R.display(font);
W.display(font);
Sleep(delay);
if (pauser==1)
if (getche()==27) menu1();
}
}
}
void menu_params();
void menu1()
{
system("cls");
cout<<"\t\t\t\tВыберите режим работы:\n\n\n";
cout<<"\t\t\t1. Запуск с отрисовкой графики.\n";
cout<<"\t\t\t2. Запуск без отрисовки графики.\n";
cout<<"\t\t\t3. Пошаговый с отрисовкой графики.\n";
cout<<"\t\t\t4. Пошаговый без отрисовки графики.\n";
switch (getch())
{
case '1': /*cout<<" Первый пункт";*/ font=1; pauser=0; break;
case '2': /*cout<<" Второй пункт";*/ font=0; pauser=0; break;
case '3': /*cout<<" Третий пункт";*/ font=1; pauser=1; break;
case '4': /*cout<<" Четвыртый пункт";*/ font=0; pauser=1; break;
}
system("cls");
menu_params();
cout<<"\n\n\n\n Для продолжения работы, нажмите Spase.";
cout<<"\n Для изменения стартовых параметров, нажмите Enter.";
//getche();
if(getch()==13)
{
for(;;)
{
system("cls");
menu_params();
cout<<"\n9. Выход\n\n" ;
switch(getch())
{
case '1': cout<<"\n Количество волков: ";
cin>>colW; break;
case '2': cout<<"\n Количество кроликов: ";
cin>>colR; break;
case '3': cout<<"\n Количество деревьев: ";
cin>>colT; break;
case '4': cout<<"\n Количество шагов, через которое кролики начнут размножаться: ";
cin>>colR; break;
case '5': cout<<"\n Задержка в милисекундах: ";
cin>>delay; break;
case '6': cout<<"\n Перемотка шагов со старта: ";
cin>>endstep; break;
case '7': cout<<"\n Количество детенышей у волков при разможножении: ";
cin>>razmW; break;
case '8': cout<<"\n Количество детенышей у кроликов при разможножении: ";
cin>>razmR; break;
case '9': return;
}
}
cout<<"\n Количество детенышей у кроликов при разможножении: ";
cin>>razmR;
cout<<"\n\n\n";
menu_params();
if (getch()=='9') return;
}
}
void menu_params()
{
cout<<"\t\t Cтартовые параметры\n\n";
cout<<"\n1. Количество волков: "<<colW;
cout<<"\n2. Количество кроликов: "<<colR;
cout<<"\n3. Количество деревьев: "<<colT;
cout<<"\n4. Количество шагов, через которое кролики начнут размножаться: "<<old;
cout<<"\n5. Задержка в милисекундах: "<<delay;
cout<<"\n6. Перемотка шагов со старту: "<<endstep;
cout<<"\n7. Количество детенышей у волков при разможножении: "<<razmW;
cout<<"\n8. Количество детенышей у кроликов при разможножении: "<<razmR;
//getche();
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"RUS");
srand((int)time);
menu1();
W.add(colW);
R.add(colR);
T.add(colT);
timer();
getche();
return 0;
}