Курсовая работа: Аркадна гра "гольф" з елементами трьохвимірної поверхні

Поставлена задача написати просту аркадну гру “гольф” з елементами трьох-вимірної поверхні. Для створення актуального програмного продукту на цю тематику був обраний шлях написання універсальної програми – яка б могла запускатись з мінімальними потребами до пам”яті та інших ресурсів. Тому в якості засобу розробки був обраний старий компілятор BORLANDC++ 3.0 і прийняте рішення не використовувати графічні функції Windows.


Теорія

Засоби організації збереження і обробки даних для графічнихпрограм

Методи організації і збереження лінійних списків

Лінійний список - це кінцева послідовність однотипних елементів (вузлів), можливо, з повтореннями. Кількість елементів у послідовності називається довжиною списку, причому довжина в процесі роботи програми може змінюватися.

Лінійний список F, що складається з елементів D1,D2,...,Dn, записують у виді послідовностізначень укладеної в кутові дужки F=, або представляють графічно.

Наприклад, F1=<2,3,1>,F2=<7,7,7,2,1,12>, F3=<>. Довжина списків F1, F2, F3 дорівнює відповідно 3,6,0.

При роботі зі списками на практиці найчастіше приходиться виконувати наступні операції:

- знайти елемент із заданою властивістю;

- визначити перший елемент у лінійному списку;

- уставити додатковий елемент до або після зазначеного вузла;

- виключити визначений елемент зі списку;

- упорядкувати вузли лінійного списку у визначеному порядку.

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

Методи збереження лінійних списків розділяються на методи послідовного і зв'язаного збереження. Розглянемо найпростіші варіанти цих методів для списку з цілими значеннями F=<7,10>.

При послідовному збереженні елементи лінійного списку розміщаються в масиві d фіксованих розмірів, наприклад, 100, і довжина списку вказується в перемінної l, тобто в програмі необхідно мати оголошення виду

float d[100]; int l;

Розмір масиву 100 обмежує максимальні розміри лінійного списку. Список F у масиві d формується так:

d[0]=7; d[1]=10; l=2;

При зв'язаному збереженні як елементи збереження використовуються структури, зв'язані по одній з компонентів у ланцюжок, на початок якої (першу структуру) указує покажчик dl. Структура утворюючий елемент збереження, повинна крім відповідного елемента списку містити і покажчик на сусідній елемент збереження.

Опис структури і покажчика в цьому випадку може мати вид:

typedef struct snd /* ????????? ???????? ?????????? */{ float val; /* ??????? ?????? */struct snd *n ; /* ???????? ?? ??????? ?????????? */} DL;DL *p; /* ???????? ????????? ???????? */DL *dl; /* ???????? ?? ??????? ?????? */

Для виділення пам'яті під елементи збереження необхідно користуватися функцією malloc(sizeof(DL)) або calloc(l,sizeof(DL)). Формування списку в зв'язаному збереженні може здійснюється операторами:

p=malloc(sizeof(DL));p->val=10; p->n=NULL;dl=malloc(sizeof(DL));dl->val=7; dl->n=p;

В останньому елементі збереження (кінець списку) покажчик на сусідній елемент має значення NULL. Одержуваний список зображений на мал.2.

Операції зі списками при послідовному збереженні

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

Нехай мається лінійний список з цілими значеннями і для його збереження використовується масив d (з числом елементів 100), а кількість елементів у списку вказується перемінної l. Реалізація зазначених раніше операцій над списком представляється наступними фрагментами програм які використовують оголошення:

float d[100]; int i,j,l; 1) ??????? ???????? ??????? ???????? (?????) if (?<0 || ?>l) printf("\n ????? ????????"); else printf("d[%d]=%f ",?,d[?]); 2) ????????? ????????, ?? ???????? ?? i-??? ?????? if (?>=l) printf("\n ????? ?????????? "); l--; for (j=?+1;j<="1" if ????? i-???? ??????? ???? ??????? 3) d[j]="d[j+1];">=l) printf("\n ????? ??????"); else printf("\n %d %d",d[?-1],d[?+1]); 4) ????????? ?????? ???????? new ?? i-??? ?????? if (?==l || ?>l) printf("\n ?? ????? ??????"); else { for (j=l; j>i+1; j--) d[j+1]=d[j]; d[i+1]=new; l++; } 5) ???????? ????????????? ?????? ? ?????????? ??1,??2,...,?l ? ?????? K1',K2',...,Ks,K1,Kt",...,Kt", s+t+1=l ???, ??? K1'= K1. { int t=1; float aux; for (i=2; i<=l; i++) if (d[i]=2; j--) d[j]=d[j-1]; t++; d[i]=aux; } }

Кількість дій Q, необхідних для виконання приведених операцій над списком, визначаєтьсяспіввідношеннями: для операцій 1 і 2 - Q=1; для операцій 3,4 - Q=l; для операції 5 - Q=l*l.

Помітимо, що взагалі операцію 5 можна виконати при кількості дій порядку l, а операції 3 і 4 для включення і виключення елементів наприкінці списку, що часто зустрічаються при роботі зі стеками, - при кількості дій 1.

Більш складна організація операцій потрібно при розміщенні в масиві d декількох списків, або при розміщенні списку без прив'язки його початку до першого елемента масиву.

Операції зі списками при зв'язному збереженні

При простому зв'язаному збереженні кожен елемент списку являє собою структуру nd, що складається з двох елементів: val - призначений для збереження елемента списку, n - для покажчика на структуру, що містить наступний елемент списку. На перший елемент списку вказує покажчик dl. Для всіх операцій над списком використовується опис:

typedef struct nd { float val; struct nd * n; } ND; int i,j; ND * dl, * r, * p;

Для реалізації операцій можуть використовуватися наступні фрагменти програм:

1) печатка значення i-го елемента

r=dl;j=1; while(r!=NULL && j++n ; if (r==NULL) printf("\n ????? ????? %d ",i); else printf("\n ??????? %d ???????? %f ",i,r->val);

2) печатка обох сусідів вузла(елемента), обумовленого покажчиком p (див. мал.4)

if((r=p->n)==NULL) printf("\n ????? ?????? ????????"); else printf("\n ????? ???????? %f", r->val); if(dl==p) printf("\n ????? ?????? ???????" ); else { r=dl; while( r->n!=p ) r=r->n; printf("\n ????? ????? %f", r->val); }

3) видалення елемента, що випливає за вузлом, на який указує р (див. мал.5)

if ((r=p->n)==NULL) printf("\n ????? ??????????"); p->n=r->n; free(r->n);

4) вставка нового вузла зі значенням new за елементом, визначеним покажчиком р (див. мал.6)

r=malloc(1,sizeof(ND));r->n=p->n; r->val=new; p->n=r;

--> ЧИТАТЬ ПОЛНОСТЬЮ <--

К-во Просмотров: 560
Бесплатно скачать Курсовая работа: Аркадна гра "гольф" з елементами трьохвимірної поверхні