Допомога у написанні освітніх робіт...
Допоможемо швидко та з гарантією якості!

Програмування гри «Трикутники»

КурсоваДопомога в написанніДізнатися вартістьмоєї роботи

Функція init ініціалізує об'єкт. Ця функція не повертає параметрів. Вона отримує як аргументи три координати вершин трикутника. Ця функція перевіряє чи можна побудувати трикутник з трьох даних точок і чи відповідає він поставленим умовам. Логіка роботи цієї функція описана в розділі 2.1. Також функція init повертає значення більше 0 якщо з трьох даних точок можна побудувати трикутник… Читати ще >

Програмування гри «Трикутники» (реферат, курсова, диплом, контрольна)

ЗМІСТ

  • ВСТУП 2
  • 1. АНАЛІЗ СУЧАСНОГО СТАНУ ТЕХНОЛОГІЙ ПРОГРАМУВАННЯ ТА ОБҐРУНТУВАННЯ ТЕМИ 3
  • 2. РОЗРОБКА ПРОГРАМИ ВИКОНАННЯ ОСНОВНОГО ЗАВДАННЯ 5
  • 2.1 Розробка методу виконання основного завдання 5
  • 2.2 Структура даних і функцій 6
  • 3. РОЗРОБКА ПРОГРАМИ МЕНЮ 8
  • 4. РОЗРОБКА ТА ВИКОНАННЯ ТЕСТОВОГО ПРИКЛАДУ 11
  • 5. ІНСТРУКЦІЯ КОРИСТУВАЧА 13
  • ВИСНОВКИ 14
  • ПЕРЕЛІК ПОСИЛАНЬ 15
  • ДОДАТОК А 16
  • ДОДАТОК Б 22

ВСТУП

В даний час розробка програми з використання ООП набуває все більшої популярності. Оскільки використовуючи об'єктний підхід можна створювати надзвичайно складні програми відносно просто і легко.

Дана розробка призначена для використання в навчальних цілях. Вона показує основні принципи побудови програми використовуючи об'єктну модель.

Для вирішення поставленої задачі використовуючи ООП потрібно розробити два класи: клас Трикутник — CTriangle, клас Точка — CPoint. Клас CTriangle має метод для визначення чи можуть три точки утворити рівнобедрений, рівнобедрений — прямокутний, рівносторонній трикутник, метод для визначення периметру.

Вхідні дані містяться у текстовому файлі в зручному для користувача виді:

Для зручності створена програма меню, яка запускає програму, дає відомості про програму, показує файл програми, файл з вхідними даними.

Дана розробка має високу актуальність, оскільки вона показує як за допомогою класів можна реалізувати поставлену задачу. Хоча програмний код на перший погляд занадто складний для даної задачі, але оскільки в програмі використана об'єктна модель, можна легко змінити формат представлення початкових даних, їх обробку, додати нові функції в програму змінивши лише опис деяких об'єктів.

1. АНАЛІЗ СУЧАСНОГО СТАНУ ТЕХНОЛОГІЙ ПРОГРАМУВАННЯ ТА ОБҐРУНТУВАННЯ ТЕМИ

програмування об'єкт гра

Як відомо об'єктний підхід заснований на понятті об'єкта, з'єднуючого в єдине ціле данні і код. Фактично, сьогодні дві моделі об'єктно — орієнтованих мов програмування: традиційні процедурні, до яких додані засоби ООП, і спеціально розроблені об'єктно — орієнтовані мови, початково побудовані на розглядуваній моделі. Самим яскравим представником першої групи є мова С++, розроблена на основі С, другої - мова Smalltalk[1].

Існує також клас нестандартних мов, що представляють собою традиційні (процедурні чи функціональні) мови, доповнені засобами ООП[2]. Їх відмінна риса — нестандартність. Прикладом такої мови є Turbo Pascal, а також система Delphi фірми Borland, сюди можна віднести різноманітні системи ООП, побудовані на основі мови Lisp.

Слідує також вказати групу мов, які називають об'єктно — орієнтованими, але які відповідають моделі ООП лише частково. Приклади таких мов — Visual Basic фірми Microsoft, а також мова Object PAL із СУБД Paradox для Windows.

Співставляючи мови C++ і Smalltalk, потрібно відмітити схожість моделі ООП в цих мовах і провести аналогії. Однак їх основної розбіжністю являється те, що в Smalltalk всі типи даних без винятку являються об'єктами[3]. В С++ збережені всі традиційні типи із С, об'єкти це елементи особливих типів даних. В той же час можна прослідкувати прямі аналогії багатьох елементів реалізації ОПП в Smalltalk і C++.

В сучасному програмування важливим являється не тільки вибір мови програмування але і середовища — операційної системи, системи розробки програм, бібліотек[4]. В наш час для популярних мов програмування створені потужні засоби для редагування, компіляції, відладки програм, обширні бібліотеки[5]. При використання ООП зміст бібліотеки значно розширюється. Вони можуть включати в себе не тільки функції але і класи об'єктів. В якості прикладу можна згадати про наявні в С++ об'єктні бібліотеки вводу — виводу, роботи з комплексними числами, стрічками, динамічними структурами даних[6].

2. РОЗРОБКА ПРОГРАМИ ВИКОНАННЯ ОСНОВНОГО ЗАВДАННЯ

2.1 Розробка методу виконання основного завдання

Для виконання поставленої задачі були розроблені наступні функції.

Функція яка визначає чи можна побудувати рівнобедрений, рівнобедрений — прямокутний, рівносторонній трикутник з трьох точок. Визначаються довжини сторін, які порівнюються між собою.

Рис 1.

Довжини сторін визначаються по формулі

Якщо сума двох сторін менша суми третьої то трикутник існує. Далі порівнюються сторони трикутника, і визначається чи трикутник рівнобедрениц чи рівносторонній. Кут визначається за теоремою косинусів. Відповідно якщо хоч один кут трикутника дев’яносто градусів то трикутник прямокутний.

Також розроблений методи класу CTriangle який визначає периметр.

2.2 Структура даних і функцій

Вхідні дані зчитуються з текстового файлу і зберігаються у динамічно створюваному списку.

В програмі використовуються три класи CTriangle, CPoint.

Кожний клас містить метод draw для виведення змінної класу на екран в графічному режимі. Ця функція отримує як параметр змінну color — колір яким буде виводитися об'єкт на екран.

Клас CPoint.

Клас має дві змінні x, y з ідентифікатором доступу private. Ці змінні задають положення точки на екрані.

В класі є дві функції з ідентифікатором доступу public — draw, init. Функція init призначена для ініціалізації об'єкта. Вона не повертає значень. В якості параметрів функція отримує два числа — координати точки.

Клас CTriangle.

Клас містить наступні змінні з ідентифікатором доступу private, а саме x1, y1,x2,y2,x3,y3 — координати трьох вершин трикутника, per — периметр трикутник, type — тип трикутника: 1 — рівнобедрений, 2 — рівнобедрений — прямокутний, 3 — рівносторонній.

Всі функції класу мають ідентифікатор доступу public. Функції getx1(), gety1(), getx2(), gety2(), getx3(), gey3() не мають параметрів, ці функції повертають значення відповідних змінних класу з ідентифікатором private. Функція getper () повертає перемите трикутника, дана функція не отримує параметрів. Функція gettype () — повертає тип трикутника.

Функція init ініціалізує об'єкт. Ця функція не повертає параметрів. Вона отримує як аргументи три координати вершин трикутника. Ця функція перевіряє чи можна побудувати трикутник з трьох даних точок і чи відповідає він поставленим умовам. Логіка роботи цієї функція описана в розділі 2.1. Також функція init повертає значення більше 0 якщо з трьох даних точок можна побудувати трикутник, що задовольняє умові, і 0 в протилежному випадку.

В програмі розроблено тип даних storage. Цей тп призначений для динамічного зберігання даних.

typedef struct storage

{

storage *next; // вказівник на змінну типу storage.

CPoint value; // змінна типу CPoint.

};

3. РОЗРОБКА ПРОГРАМИ МЕНЮ

Для розробки програми меню були використані віртуальні функції.

В програмі меню створений базовий клас Knopka з віртуальною функцією виклику. Також створено 6 похідних класів, в яких функція виклику своя.

При запуску програми меню створюється масив вказівників на основний клас Knopka якому присвоюються адреси змінних похідних класів (Knopka1, Knopka2, Knopka3, Knopka4, Knopka5). Потім в циклі залежно від вибору користувача викликається потрібна функція виклику. Завдяки віртуальним функціям, коли користувач вибирає якийсь пункт меню, викликається функція виклику базового класу Knopka (оскільки масив вказівників має тип Knopka) і потім через механізм віртуальних функцій викликається функція виклику відповідного похідного класу.

У функціях запуску для взаємодії з основною програмую використовується функція spawnl, яка запускає основну програму, блокнот і середовище розробки (Borland C++ 3.0).

Програма меню використовує слідуючі класи:

Клас Knopka.

Всі змінні цього класу мають ідентифікатор доступу private, а функції public.

Змінні x1, y1, x2, y2 — задають положення кнопки на екрані.

Змінна str — назву кнопки, яка відображається на екрані.

Функція setparam встановлює атрибути кнопки — положення на екрані і назву. Вона не повертає значень і отримує наступні параметри xx1, yy1, xx2, yy2 — положення кнопки на екрані і sstr — назву кнопки.

Функція show призначена для виведення кнопки на екран, вона не повертає значень і отримує як параметри tcolor — колір тексту, яким буде написана назва кнопки, і bcolor — колір фону на якому буде написано назва коропки.

Функція run є віртуальною. Вона не отримує і не повертає параметрів, і в даному класі не виконує ніяких дій.

Клас Knopka1, Knopka2, … Ці класи описують кнопки меню, і вони являються дочірніми класами класу Knopka (механізм наслідування, класи наслыдуються з доступом public). Вони мають однакову структуру. Ці класи не мають змінних і мають лише одну функцію run (ідентифікатор доступу public), яка не отримує і не повертає параметрів. Функція run виконує дію, яка закріплена за кнопкою.

Клас Menu.

Наступні змінні і функції мають ідентифікатор доступу private.

Клас містить такі змінні:

kn1, kn2…, це кнопки меню.

Масив вказівників maskn типу Knopka. Це масив вказівників на об'єкти класу Knopka, крім того ці вказівники можуть вказувати також на дочерні класи Knopka1, Knopka 2…

x, y координати меню на екрані, nomAct — номер вибраної кнопки, actTextCol — колір тексту, яким виводиться активна кнопка на екран, actBgCol — колір фону яким виводиться активна кнопка на екран, pasTextCol — колір тексту, яким виводиться неактивна кнопка на екран, pasBgCol — колір фону, яким виводиться неактивна кнопка на екран.

Функція show призначена для виведення меню на екран, вона не отримує і не повертає параметрів.

Функція onLeft зміщує вказівник на активну кнопку на 1 вгору, вона не отримує і не повертає параметрів.

Функція onRight зміщує вказівник на активну кнопку на одиницю вниз.

Функція onDown запускає функцію run відповідної кнопки через механізм віртуальних функцій.

Наступні функції класу мають ідентифікатор доступу public.

Функція Menu — конструктор класу Menu. Вона отримує як параметри координати меню на екрані. Ця функція призначена для ініціалізації об'єкта і виведення меню на екран в тестовому режимі.

Функція getmessage аналізує яку кнопку натиснув користувач і відповідно запускає оду з цих функцій: onRight, onLeft, onDown. Вона отримує як параметр код кнопки яку натиснув користувач на клавіатурі.

Програма меню використовує файли menus. txt та button.txt. Файл button. txt містить текст про програму та автора. Файл menus. txt містить п’ять стрічок тексту з назвами пунктів меню. Меню виводиться на екран у текстовому режимі та має п’ять команд:

Виведення інформації про програму і автора;

Запуск текстового редактора notepad. exe з файлом вхідних даних;

Запуск середовища BORLANDC 3.1 з текстом програми основного завдання;

Запуск програми основного завдання;

Вихід з меню.

4. РОЗРОБКА ТА ВИКОНАННЯ ТЕСТОВОГО ПРИКЛАДУ

Файл вхідних даних data. txt:

Point1:

x=-10; y=50;

Point2:

x=-20; y=20;

Point3:

x=0; y=0;

Point4:

x=60; y=40;

Зовнішній вигляд програми меню.

Графічні результати роботи програми:

5. ІНСТРУКЦІЯ КОРИСТУВАЧА

Даний програмний продукт поставляється на дискеті. Додаткова інсталяція не потрібно, програма може працювати безпосередньо з дискети. Для запуску програми необхідна операційна система Windows 98 і вище.

Для запуску меню необхідно запустити файл menu.exe.

Використовуючи меню ви можете:

About: прочитати інформацію про програму і про розробника.

Open notepad with input data: продивитися і відредагувати вхідні дані.

Lunch Borland C++ with program: продивитися текст програми в середовищі розробки Borland C++. Для цього необхідно, що у вас було встановлено Borland C++

Lunch program — запуск основної програми, і перегляд результатів роботи в графічному режимі.

Quit — вихід.

ВИСНОВКИ

Розроблена програма повністю виконує умови завдання і побудована на об'єктно орієнтованому принципі. Завдяки використанню ООП програму можна легко змінювати і підвищувати її складність.

Виконавши цю роботу я навчилася програмувати з використанням об'єктів і вивчила основні принципи, поняття, структуру ООП.

Хоча основну програму можна розробити без використання ООП, то програму меню без використання ООП було б розробити дуже важко, оскільки при розробці програми меню використовувався механізм віртуальних функцій який значно полегшив розробку програми меню.

Загалом реалізація об'єктів в мові C++ надзвичайно проста. Тому описуючи прості об'єкти, на їх основі можна будувати складні системи і моделі, які будуть мати просту структуру з простих об'єктів. Саме завдяки такому підходу можна створювати складні програмні продукти, які розраховані на вирішення складних комплексних задач.

Тому на мою думку ООП має більше переваг ніж процедурне і функціональне програмування. Саме тому в усіх сучасних мовах програмування є підтримка ООП, і більшість з них вже зроблені тільки для ООП.

ПЕРЕЛІК ПОСИЛАНЬ

1. Юлин В. А., Булатова И. Р. Приглашение к Си. — Минск: Выш. школа., 1990.

2. Григорьев В. Л. Видеосистемы ПК фирмы IBM. — М.: Радио и связь, 1993.

3. Прокофьев В. П. Сухарев Н. Н., Храмов Ю. Е. Графические средства Turbo C и Turbo C++. — М.: Финансы и статистика, 1992.

4. Касаткин А. И., Вальвачев А. Н. Профессиональное программирование на языке Си. От Turbo C к Borland C++. — Минск: Выш. школа, 1992.

5. Рассохин Д. От Си к Си++. — М.: «Эдель», 1993.

6. Сван Т. Освоение Borlandc C++ 4.5. Практический курс. Второе издание. — Киев: Диалектика, 1996.

ДОДАТОК А

Основна програма

#include

#include

#include

#include

#include

#include

class CPoint

{

private:

int x, y;

public:

int getx () { return x; };

int gety () { return y; };

void init (int x1, int y1)

{

x=x1;

y=y1;

}

void draw (int color)

{

setcolor (color);

putpixel (x, y, color);

}

};

class CTriangle

{

private:

int x1, y1,x2,y2,x3,y3,type;

float per;

public:

int getx1() { return x1; }

int getx2() { return x2; }

int getx3() { return x3; }

int gety1() { return y1; }

int gety2() { return y2; }

int gety3() { return y3; }

int gettype () { return type; }

float getper () { return per; }

void draw (int color)

{

int poly[8];

poly[0]=x1; poly[1]=y1;

poly[2]=x2; poly[3]=y2;

poly[4]=x3; poly[5]=y3;

poly[6]=x1; poly[7]=y1;

setcolor (color);

drawpoly (4,poly);

}

int init (CPoint p1, CPoint p2, CPoint p3)

{

// 1 rivnobedrenuy

// 2 rivnobedrenuy priamokytniy

// 3 rivnostoronniy

int res=0;

float a, b, c, a_cos, b_cos, c_cos;

a=sqrt (pow ((p1.getx ()-p2.getx ()), 2)+pow ((p1.gety ()-p2.gety ()), 2));

b=sqrt (pow ((p2.getx ()-p3.getx ()), 2)+pow ((p2.gety ()-p3.gety ()), 2));

c=sqrt (pow ((p1.getx ()-p3.getx ()), 2)+pow ((p1.gety ()-p3.gety ()), 2));

if (((a==b)||(b==c)||(c==a))&&((a+b>c) && (b+c>a) && (a+c>b)))

{

x1=p1.getx (); y1=p1.gety ();

x2=p2.getx (); y2=p2.gety ();

x3=p3.getx (); y3=p3.gety ();

per=a+b+c;

res=1;

if ((a==b)&&(a==c))

res=3;

else

}

type=res;

return res;

}

};

typedef struct storage

{

storage *next;

CPoint value;

};

void main ()

{

FILE * f;

if ((f= fopen («data.txt» ," r"))==NULL)

{

cout << «Cannot open input data file. n» ;

getch ();

exit (EXIT_SUCCESS);

}

char *str;

int x, y, count=0;

storage * first, * storage1;

first= new (storage);

storage1= new (storage);

storage1= first;

while (!feof (f))

{

fscanf (f," %s", str);

fscanf (f," %3c %d %s", str,&x, str);

fscanf (f," %3c %d %s", str,&y, str);

storage1->value.init (x, y);

storage1->next= new (storage);

storage1=storage1->next;

storage1->next=NULL;

count++;

}

fclose (f);

int gdriver= VGA, gmode= VGAHI;

initgraph (&gdriver,&gmode," «);

CPoint *arrp;

CTriangle *arrt;

int * arrf, *arrft;

arrp = new CPoint [count+1];

arrt = new CTriangle [int (count/3)+1];

arrf = new int [count+1];

arrft = new int [int (count/3)+1];

int i;

for (i=1; i<=count; i++)

{

arrp[i]=first->value;

arrf[i]=1;

first=first->next;

}

int g, k, countt=0;

CTriangle tr;

for (i=1; i<=count; i++)

for (g=i; g<=count; g++)

for (k=g; k<=count; k++)

if ((arrf[i]) && (arrf[g]) && (arrf[k]) && (i≠g) && (i≠k) && (g≠k))

{

if (tr.init (arrp[i], arrp[g], arrp[k])>0)

{

countt++;

arrt[countt]=tr;

arrf[i]=0;

arrf[g]=0;

arrf[k]=0;

arrft[countt]=1;

}

}

for (i=1; i<=countt; i++)

{

switch (arrt[i]. gettype ())

{

case 1: arrt[i]. draw (8);

break;

case 2: arrt[i]. draw (6);

break;

case 3: arrt[i]. draw (5);

break;

}

}

CTriangle max=arrt[1];

for (i=2; i<=countt; i++)

if (arrt[i]. getper ()>max.getper ())

max=arrt[i];

max.draw (1);

for (i=1; i<=count; i++)

arrp[i]. draw (14);

getch ();

closegraph ();

}

ДОДАТОК Б

Програма меню

#include

#include

#include

#include

#define LEFT 75

#define RIGHT 77

#define DOWN 13

class Knopka

{

int x1;

int y1;

int x2;

int y2;

char str[80];

public:

void setparam (int xx1, int yy1, int xx2, int yy2, char *sstr) ;

void show (int tcolor, int bcolor);

virtual void run (void)=0;

};

class knopka1: public Knopka

{

public:

void run (void);

};

class knopka2: public Knopka

{

public:

void run (void) ;

};

class knopka3: public Knopka

{

public:

void run (void) ;

};

class knopka4: public Knopka

{

public:

void run (void);

};

class knopka5: public Knopka

{

public:

void run (void) ;

};

class Menu

{

knopka1 kn1;

knopka2 kn2;

knopka3 kn3;

knopka4 kn4;

knopka5 kn5;

Knopka *maskn[5];

int x;

int y;

int nomAct;

int actTextCol;

int actBgCol;

int pasTextCol;

int pasBgCol;

void show (void);

void onLeft (void) ;

void onRight (void) ;

void onDown (void) ;

public:

Menu (int xx, int yy);

void getmessage (int msg);

};

void main ()

{

textbackground (0);

clrscr ();

Menu mnu (15,1);

while (1)

mnu.getmessage (getch ());

}

void Knopka: setparam (int xx1, int yy1, int xx2, int yy2, char *sstr)

{

x1=xx1;

y1=yy1;

x2=xx2;

y2=yy2;

strcpy (str, sstr);

};

void Knopka: show (int tcolor, int bcolor)

{

textcolor (tcolor);

textbackground (bcolor);

window (x1,y1,x2,y2);

clrscr ();

gotoxy (1,1);

printf («%s», str);

}

void knopka1: run (void)

{

char str[80] ;

FILE* fin=fopen («button.txt» ," r") ;

textcolor (15);

textbackground (1) ;

window (2,7,78,22) ;

clrscr () ;

int i=0;

while (!feof (fin))

{

fgets (str, 80, fin);

gotoxy (1,1+i) ;

cputs (str);

i++;

}

textbackground (0) ;

getch () ;

clrscr () ;

}

void knopka2: run (void)

{

spawnl (P_WAIT," c:\windows\notepad.exe" ," «,» data. txt", NULL) ;

}

void knopka3: run (void)

{

spawnl (P_WAIT, «c:\tc\bin\bc.exe» ," proga by AXE", «kursova.cpp», NULL) ;

}

void knopka4: run (void)

{

spawnl (P_WAIT," kursova. exe", NULL);

}

void knopka5: run (void)

{

exit (0);

}

void Menu: onLeft (void)

{

nomAct=(nomAct==0)?4:(nomAct-=1);

}

void Menu: onRight (void)

{

nomAct=(nomAct==4) ?0: (nomAct+=1);

}

void Menu: onDown (void)

{

maskn[nomAct]->run () ;

}

void Menu: show (void)

{

_setcursortype (_NOCURSOR) ;

for (int i=0;i<5;i++)

if (i==nomAct)

maskn[i]->show (actTextCol, actBgCol) ;

else

maskn [i]->show (pasTextCol, pasBgCol) ;

}

void Menu: getmessage (int msg)

{

switch (msg)

{

case LEFT:

onLeft () ;

show () ;

break;

case RIGHT:

onRight () ;

show () ;

break;

case DOWN:

onDown () ;

show ();

}

}

Menu:Menu (int xx, int yy)

{

x=xx;

y=yy;

nomAct=0;

maskn[0]=&kn1;

maskn[1]=&kn2;

maskn[2]=&kn3;

maskn[3]=&kn4;

maskn[4]=&kn5;

actTextCol=15;

actBgCol=1;

pasTextCol=0;

pasBgCol=2;

FILE* fin=fopen («menus.txt» ," r") ;

char str[80];

for (int i=0;i<5;i++)

{

fgets (str, 80, fin) ;

maskn[i]->setparam (x, i+1,x+strlen (str)-2,i+1,str);

}

fclose (fin) ;

show () ;

}

Показати весь текст
Заповнити форму поточною роботою