- void add(int x,int y) - копія функції розмноження,а ле її особливість полягає у тому, що вона використовується для додавання у список та на поле лише один елемент і на зазначені координати x та y.
- void display(int font) - функція, що при виборі в меню варіанта роботи з графікою виводить всі положення звірів та дерев, а також кожен раз після виконання ходу стирає та відображає все знову. В неї передається робочий параметр, що означає виводити положення звірів чи ні.
- void hunt() - функція що відповідає за полювання. З назви зрозуміло що функція виконує процес полювання вовка на зайців.
- void menu1() - функція що викликає меню та дозволяє міняти параметри на полі.
- void timer() - основна функція що виконує всю послідовність программи.
- void menu_params() - виконує вивід параметрів, що смінюються.
Клас являє собою головне інструментальне засіб C++ для об'єктно- орієнтованого програмування. Клас дуже схожий на структуру, в якій згруповані елементи, відповідні даними про деякий об'єкт, і оперують цими даними функції ( звані методами). Ви дізнаєтеся, що об'єкт являє собою деяку сутність, наприклад телефон. Клас C++ дозволяє вашим програмам визначати всі атрибути об'єкта. У разі, коли об'єктом є телефон, клас може містити такі елементи даних, як номер і тип телефону ( кнопковий або дисковий ) і функції, що працюють з телефоном, наприклад dial, answer, і hang_up . Групуючи дані про об'єкт і кодуючи їх в одній змінної, ви спрощуєте процес програмування і збільшуєте можливість повторного використання свого коду. Під час розробки програми було розроблено 2 класи: tree, animal.
Віртуальний метод (віртуальна функція) - в об'єктно-орієнтованому програмуванні метод (функція) класу, який може бути перевизначений в класах-спадкоємців так, що конкретна реалізація методу для виклику буде визначатися під час виконання. Віртуальні методи - один з найважливіших прийомів реалізації поліморфізму. Проте у нашій структурі є лише 2 класи, які не наслідують один одного, а лише мають зв'язок через вказівники.
Під перевантаженням функції розуміється, визначення кількох функцій (дві або більше) з однаковим ім'ям, але різними параметрами. Набори параметрів перевантажених функцій можуть відрізнятися порядком проходження, кількістю, типом. Таким чином перевантаження функцій потрібна для того, щоб уникнути дублювання імен функцій, виконують подібні дії, але з різною програмної логікою. Усі функції у цьому проекти являються унікальними, та ніяк не дублюються, використати перевантаження функцій тут ніде.
В об'єктно-орієнтованому програмуванні конструктор класу (від англ. Constructor, іноді скорочують ctor) - спеціальний блок інструкцій, що викликається при створенні об'єкта. Конструктор C++ - це особливий метод, що має ім'я, що збігається з ім'ям класу.
Конструктори були використані у 2 класах, у них задавались або генерувались стартові параметри об’єктів класу.
Динамічна ідентифікація типу даних - механізм у деяких мовах програмування, що дозволяє визначити тип даних змінної або об'єкта під час виконання програми.
Динамічне визначення типів не було використане, бо в нас не має базового класу, тому ніде створити базовий вказівник.
Перевантаження операторів - це можливість призначати нове значення операторам при використанні їх з певним класом. При побудові програми гри не були використані перевантаження операторів. Це пов’язано з тим, що зв'язок між класами був побудований таким чином, що у перевантажені класів немає потреби.
Наслідування - це процес, за допомогою якого, один об'єкт може успадковувати властивості іншого об'єкту і додавати до них риси, характерні тільки для нього. При написані програми було використане наслідування. Два класи: Wolf, Rabbit наслідували параметри з класу Animal.
Стандартна Бібліотека Шаблонів надає набір добре сконструйованих та злагоджено працюють разом узагальнених компонентів C++. Особлива турбота була проявлена для забезпечення того, щоб всі шаблонні алгоритми працювали не тільки зі структурами даних у бібліотеці, але також і з вбудованими структурами даних C++. Наприклад , всі алгоритми працюють із звичайними покажчиками. Ортогональний проект бібліотеки дозволяє програмістам використовувати бібліотечні структури даних зі своїми власними алгоритмами, а бібліотечні алгоритми - зі своїми власними структурами даних. Добре певні семантичні вимоги і вимоги складності гарантують, що компонент користувача буде працювати з бібліотекою і що він буде працювати ефективно. Ця гнучкість забезпечує широку застосовність бібліотеки.
. РОЗРОБКА
ІНТЕРФЕЙСУ ПРОГРАМИ
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++.
програма імітація об'єктний орієнтований
ПЕРЕЛІК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ
1. Бьерн Страуструп «Язык программирования C++» специальное издание. Москва, Санкт - Петербург,2002.
2. Г.Шилдт «Теория и практика Си++.» СПб.:BHV - Санкт-Петербург, 1996.
. Шилдт Г. "Самоучитель C++ " БХВ-Петербург, 3-е издание 2003 г.
4. Н. Подбельский «Язык С++»; Питер, Санкт - Петербург 2004.
5. Валерий Лаптев «С++ Экспресс курс», БХВ - Санкт-Петербург, 2004.
6. А.Л. Фридман «Язык программирования С++ » курс лекций; Интернет Университет Информационных технологий; Москва 2003
7. Т.А. Павловская «С/С++ Программирование на языке высокого уровня» учебник для вузов; Питер, Санкт - Петербург 2004.
8. Брюс Эккель. Философия C++ (ориг. название: Thinking in C++. Introduction to Standard C++)
9. Стенли Липпман. Язык программирования C++. Вводный курс (ориг. название: C++ Primer)
10. Электронный курс <http://www.intuit.ru/department/pl/cpp/> А. Л. Фридман «Язык программирования C++»
. Касаткин А.И., Вальвачев А.Н. Профессиональное программирование на языке Си: От Турбо Си к С++. - Минск: Вышэйшая школа, 1992. - 240с.
. Павловская Т.А. С/С++. Программирование на языке высокого уровня. - СПб.: Питер, 2003. - 461с.
13. http://www.parallel.ru
14. http://ru.wikipedia.org/wiki
. http://msdn.microsoft.com/ru-ru/library/skef48fy.aspx
16. http://flank1er.blogspot.com/2012/11/glut-opengl.html
Додаток А
Лістинг програми
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <conio.h>
#include <time.h>
#include <typeinfo>
#include <windows.h>namespace std;
//размерность поляint w=50;int h=50;old=50; //через сколько шагов кролики могут размножатьсяdelay=33; //задержка в миллисекундахint step=0; //кол-во пройденых шагов (выполненых итераций)endstep=0; //кол-во перемотки шагов впередdeath=100;razmW=1;razmR=1;colW=5;colR=10;colT=10;font=0;pauser=0;tree
{ public:x,y;()
{=rand()%w;=rand()%h;
}
};animal
{:x,y; //положениеmale; //полyear; //возрастhungry; //голод()
{=rand()%2;=rand()%w;=rand()%h;=rand()%50+25;=700+rand()%100;
}
};wolf:public animal
{:()
{
}
{:()
{
}
};<class TT> struct list
{key;*pred,*next;del()
{>pred->next = this->next;>next->pred=this->pred;this;
}
} ;<class TT> class spisok
{:<TT> *beg;()
{=0;(int(time)); //**********<TT> *p;=new (list <TT>);//создать первый элемент=p;//запомнить адрес в переменную beg, в которой хранится начало списка>pred=0;p->next=0;//запомнить адресные поля
}finding() //сравнивание положение всех элементов списка
{<TT> *r=beg;<TT> *r2=beg;(int i=0;r->next!=0; r=r->next)
{(r->key.year < old) r->key.year++;=beg;(int i=0;r2->next!=0; r2=r2->next)
{((r->key.x == r2->key.x) && ( (r->key.y == r2->key.y)) )( r->key.male != r2->key.male )((r->key.year>=old)&& (r2->key.year>=old))
{(strcmp(typeid(TT).name(),"class wolf")==0)(razmW);(razmR);
//размжножение
//r->key.year=0;
//r2->key.year=0;
}
}
}
}move()
{<TT> *p=beg;;(p)
{(p->key.x==0) p->key.x++; //если у левой грани то двигаемся вправо(p->key.x==w) p->key.x--; //если у правой грани двигаемся влево>key.x+=rand()%3-1; //если не у граней, то в любую сторону
//аналогично(p->key.y==0) p->key.y++;(p->key.y==h) p->key.y--;>key.y+=rand()%3-1;
//p->key.hungry--;=p->next;
}
}add(int k)
{<TT>*p;(int i=0; i<k; i++)
{=new(list <TT>); //создать новый элемент и заполнить ключевое поле<TT> *r=beg;//встать на начало списка(int i=0;r->next!=0; r=r->next); //пройти по списку до конца списка>next=0;>next=p;>pred=r;
}
}add(int x,int y)
{<TT> *p;=new(list <TT>); //создать новый элемент и заполнить ключевое поле<TT> *r=beg;//встать на начало списка(int i=0;r->next!=0; r=r->next); //пройти по списку до конца списка>next=0;>next=p;>pred=r;
}display(int font)
{wlf=0;(strcmp(typeid(TT).name(),"class wolf")==0)=1;if (strcmp(typeid(TT).name(),"class rabbit")==0)=2;wlf=3;CH;(wlf)
{1:='W'; break;2:='*'; break;3:=5; break;
}<TT>*p=beg;kol=0;position;hConsole = GetStdHandle(STD_OUTPUT_HANDLE);(font==0)(p)
{++;=p->next;
}(p)
{++;.X = p->key.x;.Y = p->key.y;(hConsole, position);<<CH;//<< p->key.male;=p->next;
}
//сдвигаем курсор ниже границы(font==1)
{.X = 0;.Y = h+1;
}(wlf==1 && font==1).Y+=1;(hConsole, position);(wlf==2)<< " Зайцы :"<< kol <<"\n";(wlf==1)<< " Волки :"<< kol;(wlf==1)<<"\n Step: " << step;
}
};<wolf> W;<rabbit> R;<tree> T;
//функция удаление элемента списка, передаем в неё указатель на список с помошью & и указатель на элемент списка<class TT><TT> * del(spisok <TT> *A, list <TT> *rp)
{<TT> *rp2;(rp->pred==0) //если первый элемент списка
{>beg=rp->next;rp;>beg->pred=0;=A->beg;
} else(rp->next==0) //если посл элемент
{=rp->pred;rp->next;>next=0;<<"2";
} else
{ //если в середине
//rp=rp->next; //переходим на след элемент
//удаляем предыдущий=rp->pred;>pred->next = rp->next;>next->pred=rp->pred;rp;=rp2;
}rp;
}hunt()
{<wolf> *wp;=W.beg;<rabbit> *rp;<rabbit> *rp2;=R.beg;(wp) //цикл по волкам
{=R.beg;>key.hungry--;(wp->key.hungry<=0)
{(wp->next!=0)=del(&W,wp);(wp==W.beg) continue;
}(rp->next!=0) //цикл по кроликам
{( (wp->key.x==rp->key.x) && (wp->key.y==rp->key.y) ) //находятся в одной ячейке то удаляем кролика
{>key.hungry+=10; //пополняем голод волка=del(&R,rp);;
}(!rp->next) break; //проверк после удаления, если мы стали на посл элемент, то выходим из цыкла=rp->next; //переход на след кролика
}(!wp->next) break;=wp->next; //переход на след волка
}
}menu1();timer()
{(LC_ALL,"RUS");stop;(1)
{(_kbhit())
{(getch()==27)
}
}++;.finding();.finding();.move();.move();();(step>endstep)
{("CLS");(font==1).display(font);.display(font);.display(font);(delay);(pauser==1)(getche()==27) menu1();
}
}
}menu_params();menu1()
{("cls");<<"\t\t\t\tВыберите режим работы:\n\n\n";<<"\t\t\t1. Запуск с отрисовкой графики.\n";<<"\t\t\t2. Запуск без отрисовки графики.\n";<<"\t\t\t3. Пошаговый с отрисовкой графики.\n";<<"\t\t\t4. Пошаговый без отрисовки графики.\n";(getch())
{'1': /*cout<<" Первый пункт";*/ font=1; pauser=0; break;'2': /*cout<<" Второй пункт";*/ font=0; pauser=0; break;'3': /*cout<<" Третий пункт";*/ font=1; pauser=1; break;'4': /*cout<<" Четвыртый пункт";*/ font=0; pauser=1; break;
}("cls");_params();<<"\n\n\n\n Для продолжения работы, нажмите Spase.";<<"\n Для изменения стартовых параметров, нажмите Enter.";
//getche();(getch()==13)
{(;;)
{("cls");_params();<<"\n9. Выход\n\n" ;(getch())
{'1': cout<<"\n Количество волков: ";>>colW; break;'2': cout<<"\n Количество кроликов: ";>>colR; break;'3': cout<<"\n Количество деревьев: ";>>colT; break;'4': cout<<"\n Количество шагов, через которое кролики начнут размножаться: ";>>colR; break;'5': cout<<"\n Задержка в милисекундах: ";>>delay; break;'6': cout<<"\n Перемотка шагов со старта: ";>>endstep; break;'7': cout<<"\n Количество детенышей у волков при разможножении: ";>>razmW; break;'8': cout<<"\n Количество детенышей у кроликов при разможножении: ";>>razmR; break;'9': return;
}
}<<"\n Количество детенышей у кроликов при разможножении: ";>>razmR;<<"\n\n\n";_params();(getch()=='9') return;
}
}menu_params()
{<<"\t\t Cтартовые параметры\n\n";<<"\n1. Количество волков: "<<colW;<<"\n2. Количество кроликов: "<<colR;<<"\n3. Количество деревьев: "<<colT;<<"\n4. Количество шагов, через которое кролики начнут размножаться: "<<old;<<"\n5. Задержка в милисекундах: "<<delay;<<"\n6. Перемотка шагов со старту: "<<endstep;<<"\n7. Количество детенышей у волков при разможножении: "<<razmW;<<"\n8. Количество детенышей у кроликов при разможножении: "<<razmR;