Аркадна игра "гольф" с элементами трехмерной поверхности на языке Borland C++

Написание аркадной игры "гольф" с элементами трехмерной поверхности с помощью компилятора Borland C++ 3.0. Средства организации сохранения и обработки данных для трехмерных программ. Методы организации и хранения линейных списков, их сортировка и слияние.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 26.03.2009
Размер файла 127,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

1. Если N<21, то выбрать i-тый наибольший элемент списка B обычной сортировкой.

2. Если N>21 разделим список на P=N/7 подсписков по 7 элементов в каждом, кроме последнего в котором mod(N,7) элементов.

3. Определим список W из медиан полученных подсписков (четвертых наибольших значений) и найдем в W его медиану M (рекурсивно при помощи данного алгоритма) т.е. (P/2+1) - й наибольший элемент.

4. С помощью элемента M разобьем список B на два подсписка B' с j элементами большими или равными M, и B" c N-j элементами меньшими M. При j>i повторим процедуру поиска сначала, но только в подсписке B'. При j=i искомый элемент найден, равен M и поиск прекращается. При j < i будем искать (i-j) - тый наибольший элемент в списке B".

/* алгоритм выбора делением списка почти пополам */

int search (int *b, int n, int i)

{

int findi(int *, int, int);

int t, m, j, p, s, *w;

if (n<21) return findi(b, n, i); /* шаг 1 */ p="(int) (n/7); " w="calloc(p+1,sizeof(int)); " /* шаги 2 и 3 */ for (t="0; " t < p; t++) w [t] ="findi(b+7*t," 7,3); if (n%7! ="0)" { w [p] ="findi(b+7*p,n%7,(n%7) /2); " p++; } m="search(w," p, p/2); free (w); for (j="0," t="0; " t < n; t++) /* шаг 4 */ if (b [t] >=m) j++;

if (j>i)

{

for (p=0, t=0; p < n; t++)

if (b [t] >=m)

{ b [p] =b [t] ; p++; }

m=search(b, j, i); /* поиск в B" */

}

if (j < i)

{

for (p=0, t=0; t < n; t++)

if (b [t] < m) b [p++] =b [t] ;

m=search(b, n-j, i-j); /* поиск в B" */

}

return m;

}

Рекурсивная функция search реализует алгоритм выбора i-того наибольшего значения. Для ее вызова можно использовать следующую программу

#include

#include

main()

{

int search (int *b, int n, int i);

int *b;

int l, i, k, t;

scanf("%d%d",&l,&i);

printf

("\nВыбор%d максимального элемента из%d штук", i,l);

b=(int *) (calloc(100,sizeof(int)));

for (k=0; k<100; k++) b [k] ="k; " /* заполнение массива */ for (k="1; " k < l/4; k++) { t="b [k] ; " /* перемешивание */ b [k] ="b [l-k] ; " /* массива */ b [l-k] ="t; " } k="search(b,l, i); " /* выбор элемента */ printf ("\n выбран элемент равный%d\n\n",k); return 0; }

Используя метод математической индукции, можно доказать, что для функции search требуется выполнить в самом неблагоприятном случае 28*N сравнений.

Действительно, если N<21, то выполнение функции findi потребует сравнений порядка N*(N-1) /2, т.е. меньше чем 28*N. Предположим, что для любого T<N количество сравнений при выполнении функции search не более 28*T и подсчитаем, сколько сравнений потребуется функции search при произвольном значении N. Для поиска медианы в каждом из подсписков функцией findi требуется не более 7*(7-1) /2=21 сравнений, а для формирования массива W в целом не более 21*(N/7) =3*N сравнений. По предположению индукции для поиска медианы в массиве W длины N/7 требуется 28*(N/7) =4*N сравнений. После удаления из B части элементов с помощью медианы в B' (или в B") останется не более N*5/7 элементов, и для удаления ненужных элементов необходимо количество сравнений порядка N. Для поиска в оставшейся части массива (в B' или B") по предположению индукции требуется не более 28*(N*5/7) =20*N сравнений. Таким образом, всего потребуется 3*N+4*N+N+20*N=28*N сравнений, т.е. выдвинутое предположение доказано.

2. Практическая часть

Исходный код программы

Основной модуль golf. c

#include <time. h>

#include <stdlib. h>

#include <dos. h>

#include <conio. h>

#include <math. h>

#include <malloc. h>

#define GRIDSIZE 80 /* Must be bigger than VIEWSIZE */

#define VIEWSIZE 61 /* MUST be odd */

#define DIFF (GRIDSIZE-VIEWSIZE)

#define DEF_DIST - 1100

#define DEF_PITCH 122

#define DEF_HEIGHT 120

#define DEF_ROLL 315

#define sine(X) ((long) (sn_tbl [X]))

#define cosine(X) ((long) (sn_tbl [((X) +90)% 360]))

#define C_Plot(X,Y,C) pokeb(0xa000, (X) + 320U*(Y), C)

#define SHIFT 14

#define MASK (GRIDSIZE*GRIDSIZE)

/*

#define GetGrid(X,Y) ((unsigned) grid [((X) + GRIDSIZE*(Y) +idx)% MASK])

#define PutGrid(X,Y,C) grid [((X) + GRIDSIZE*(Y) +idx)% MASK] = (unsigned char) (C)

*/

#define CalcAddress(X,Y) (&grid [((X) + GRIDSIZE*(Y) + idx)% MASK])

extern void far *view_screen;

extern void far *screen;

extern int sn_tbl [360] ;

extern unsigned char grid [GRIDSIZE*GRIDSIZE] ;

extern unsigned rand_seed;

unsigned idx = 0;

extern long pitch_sine;

extern long pitch_cosine;

extern long roll_sine;

extern long roll_cosine;

int num_points = GRIDSIZE*GRIDSIZE;

#define START (DIFF/2)

int gx = START,gy = START;

unsigned char *gp;

int cz = DEF_DIST;

int cy = DEF_HEIGHT;

int roll = DEF_ROLL;

int cpitch = DEF_PITCH;

extern void SetMyMode(void);

extern void ClearMyScreen(void);

extern void Project(void);

extern void SwapScreens(void);

extern void DoPlasma(int, int, int, int);

extern int GetRand(void);

extern unsigned GetGrid(void);

extern void PutGrid(void);

#define _GetGrid(X,Y) (_AX = (X), _BX = (Y), GetGrid())

#define _PutGrid(X,Y,C) { _CX = (C); _AX = (X); _BX = (Y); PutGrid(); }

void SetMode(void)

{

struct REGPACK regs;

regs. r_ax = 0x13;

intr(0x10, &regs);

}

void SetTextMode(void)

{

struct REGPACK regs;

regs. r_ax = 0x3;

intr(0x10, &regs);

}

void SetPalette(void)

{

register int i;

register int j;

#define DEPTH(X) max((((X) *(3-j)) /3),

3)

for (j = 0; j<4; j++)

for (i = 0; i<64; i+=4)

{

if (i+j > 0)

{

disable();

outportb(0x3c8, (i >> 2) +64*j);

outportb(0x3c9, 0);

outportb(0x3c9, 0);

outportb(0x3c9, DEPTH(2*i/3));

enable();

}

disable();

outportb(0x3c8, (i >> 2) +64*j+16);

outportb(0x3c9, DEPTH(i/2+10));

outportb(0x3c9, DEPTH(i/4+10));

outportb(0x3c9, DEPTH(i/6+10));

enable();

disable();

outportb(0x3c8, (i >> 2) +64*j+32);

outportb(0x3c9, DEPTH(max(63/2+10-i,0)));

outportb(0x3c9, DEPTH(min(64/4+10+3*i/4,63)));

outportb(0x3c9, DEPTH(max(63/6+10-i,0)));

enable();

disable();

outportb(0x3c8, (i >> 2) +64*j+48);

outportb(0x3c9, DEPTH(i));

outportb(0x3c9, DEPTH(63));

outportb(0x3c9, DEPTH(i));

enable();

}

}

/*

int RandPixel(int x, int y, int x1, int y1, int x2, int y2)

{

int col;

col = (GetRand()%200 - 100) * (abs(x-x1) +abs(y-y1)) / (GRIDSIZE/6)

+((_GetGrid(x1,y1) +_GetGrid(x2,y2)) >> 1);

if (col < 1) col = 1;

if (col > 255) col = 255;

_PutGrid(x,y,col);

return col;

}

*/

/*

void DoPlasma(int x1, int y1, int x2, int y2)

{

int x,y,s,p;

if (x2-x1 <= 1 && y2-y1 <= 1)

return;

x = (x1+x2) >> 1;

y = (y1+y2) >> 1;

if ((p = _GetGrid(x, y1)) == 0)

p = RandPixel(x,y1,x1,y1,x2,y1);

s = p;

if ((p = _GetGrid(x2,y)) == 0)

p = RandPixel(x2,y,x2,y1,x2,y2);

s += p;

if ((p = _GetGrid(x,y2)) == 0)

p = RandPixel(x,y2,x1,y2,x2,y2);

s += p;

if ((p = _GetGrid(x1,y)) == 0)

p = RandPixel(x1,y,x1,y1,x1,y2);

s += p;

if (_GetGrid(x,y) == 0)

_PutGrid(x,y,s >> 2);

DoPlasma(x1,y1,x,y);

DoPlasma(x,y1,x2,y);

DoPlasma(x1,y,x,y2);

DoPlasma(x,y,x2,y2);

}

*/

void BlankGrid(int x1, int y1, int x2, int y2)

{

register int x,y;

for (y = y1; y <= y2; y++)

for (x = x1; x <= x2; x++)

_PutGrid(x,y,0);

}

void NewLand(int x1, int y1, int x2, int y2)

{

unsigned av = 0;

int val;

int num = 0;

if ((val = _GetGrid(x1,y1)) > 0)

{

av += val;

num++;

}

if ((val = _GetGrid(x2,y1)) > 0)

{

av += val;

num++;

}

if ((val = _GetGrid(x2,y2)) > 0)

{

av += val;

num++;

}

if ((val = _GetGrid(x1,y2)) > 0)

{

av += val;

num++;

}

if (! av || GetRand()% 32 == 0)

av = GetRand()% 256;

else

av /= num;

if (_GetGrid(x1,y1) == 0)

_PutGrid(x1,y1, av + (GetRand()% 80 - 40));

if (_GetGrid(x2,y1) == 0)

_PutGrid(x2,y1, av + (GetRand()% 80 - 40));

if (_GetGrid(x2,y2) == 0)

_PutGrid(x2,y2, av + (GetRand()% 80 - 40));

if (_GetGrid(x1,y2) == 0)

_PutGrid(x1,y2, av + (GetRand()% 80 - 40));

DoPlasma(x1,y1,x2,y2);

}

void Test(void)

{

register int p;

register int x;

int y;

for (y = 0,p = idx; y < GRIDSIZE; y++)

for (x = 0; x < GRIDSIZE; x++, p = (p+1)% MASK)

C_Plot(x,y,max(grid [p],63) >> 2);

for (x = 0; x < VIEWSIZE; x++)

{

C_Plot(gx+x, gy, 0);

C_Plot(gx+x, gy+VIEWSIZE, 0);

C_Plot(gx, gy+x, 0);

C_Plot(gx+VIEWSIZE, gy+x, 0);

}

/*

for (y = 0, p = gp; y < VIEWSIZE; y++, p += DIFF)

for (x = 0; x < VIEWSIZE; x++,p++)

C_Plot(gx+x,gy+y,*p >> 3);

*/

}

void ClearScr(void)

{

register unsigned i;

for (i = 0; i < (320U*150); i++)

pokeb(0xa000, i,0);

}

void check_gx(void)

{

if (gx < 0)

{

idx = (idx-DIFF/2 + MASK)% MASK;

gx = START-1;

BlankGrid(0,0, DIFF/2-1, GRIDSIZE-1);

NewLand(0,0,DIFF/2,GRIDSIZE/4);

NewLand(0,GRIDSIZE/4,DIFF/2,2*GRIDSIZE/4);

NewLand(0,2*GRIDSIZE/4,DIFF/2,3*GRIDSIZE/4);

NewLand(0,3*GRIDSIZE/4,DIFF/2,GRIDSIZE-1);

}

else if (gx >= DIFF)

{

idx = (idx+DIFF/2)% MASK;

gx = START+1;

BlankGrid(GRIDSIZE-DIFF/2,0, GRIDSIZE-1, GRIDSIZE-1);

NewLand(GRIDSIZE-DIFF/2-1,0,GRIDSIZE-1,GRIDSIZE/4);

NewLand(GRIDSIZE-DIFF/2-1,GRIDSIZE/4,GRIDSIZE-1,2*GRIDSIZE/4);

NewLand(GRIDSIZE-DIFF/2-1,2*GRIDSIZE/4,GRIDSIZE-1,3*GRIDSIZE/4);

NewLand(GRIDSIZE-DIFF/2-1,3*GRIDSIZE/4,GRIDSIZE-1,GRIDSIZE-1);

}

}

void check_gy(void)

{

if (gy < 0)

{

idx = (idx-DIFF/2*GRIDSIZE + MASK)% MASK;

gy = START-1;

BlankGrid(0,0, GRIDSIZE-1, DIFF/2-1);

NewLand(0,0,GRIDSIZE/4,DIFF/2);

NewLand(GRIDSIZE/4,0,2*GRIDSIZE/4,DIFF/2);

NewLand(2*GRIDSIZE/4,0,3*GRIDSIZE/4,DIFF/2);

NewLand(3*GRIDSIZE/4,0,GRIDSIZE-1,DIFF/2);

}

else if (gy >= DIFF)

{

idx = (idx+DIFF/2*GRIDSIZE)% MASK;

gy = START+1;

BlankGrid(0,GRIDSIZE-DIFF/2,GRIDSIZE-1, GRIDSIZE-1);

NewLand(0,GRIDSIZE-DIFF/2-1,GRIDSIZE/4,GRIDSIZE-1);

NewLand(GRIDSIZE/4,GRIDSIZE-DIFF/2-1,2*GRIDSIZE/4,GRIDSIZE-1);

NewLand(2*GRIDSIZE/4,GRIDSIZE-DIFF/2-1,3*GRIDSIZE/4, GRIDSIZE-1);

NewLand(3*GRIDSIZE/4,GRIDSIZE-DIFF/2-1,GRIDSIZE-1,GRIDSIZE-1);

}

}

void main(void)

{

int rollspeed = 0;

int xspeed = 0, yspeed = 0;

int i;

rand_seed = (unsigned) time(NULL);

/*rand_seed = 2; */

for (i = 0; i<(360+90); i++)

sn_tbl [i] =(int) (sin((double) i / 180.0*3.14159265) * (double) (1<<SHIFT));

NewLand(0,0,GRIDSIZE-1,GRIDSIZE-1);

SetMode();

SetPalette();

// goto skip;

for (;;)

{

Test();

switch(getch())

{

case 27:

SetTextMode();

exit(0);

case 'e':

gx--;

check_gx();

break;

case 'r':

gx++;

check_gx();

break;

case 'w':

gy--;

check_gy();

break;

case 's':

gy++;

check_gy();

break;

case ' ':

goto skip;

}

gp = CalcAddress(gx,gy);

while (kbhit())

getch();

}

skip:

;

SetMyMode();

SetPalette();

gp = CalcAddress(gx,gy);

// yspeed = - 1;

// rollspeed = (rollspeed+358)% 360;

for (;;)

{

if (kbhit())

{

switch(getch())

{

case 27:

SetTextMode();

exit(0);

case 'q':

cz += 50;

break;

case 'a':

cz - = 50;

break;

case 'u':

cy - = 50;

break;

case 'j':

cy += 50;

break;

case 'Q':

cpitch = (cpitch+1)% 360;

break;

case 'A':

cpitch = (cpitch+359)% 360;

break;

case 'E':

if (xspeed > - 1) xspeed--;

break;

case 'R':

if (xspeed < 1) xspeed++;

break;

case 'e':

gx--;

break;

case 'r':

gx++;

break;

case 'W':

if (yspeed > - 1) yspeed--;

break;

case 'S':

if (yspeed < 1) yspeed++;

break;

case 'w':

gy--;

break;

case 's':

gy++;

break;

case 'i':

roll = (roll+1)% 360;

break;

case 'o':

roll = (roll+359)% 360;

break;

case 'I':

rollspeed = (rollspeed+1)% 360;

break;

case 'O':

rollspeed = (rollspeed+359)% 360;

break;

case ' ':

rollspeed = 0;

xspeed = yspeed = 0;

cz = DEF_DIST;

cy = DEF_HEIGHT;

roll = DEF_ROLL;

cpitch = DEF_PITCH;

break;

}

while (kbhit())

getch();

}

gy += yspeed;

gx += xspeed;

check_gx();

check_gy();

gp = CalcAddress(gx,gy);

roll = (roll+rollspeed)% 360;

roll_sine = sine(roll);

roll_cosine = cosine(roll);

pitch_sine = sine(cpitch);

pitch_cosine = cosine(cpitch);

ClearMyScreen();

Project();

SwapScreens();

}

}

3. Работа с программой

Дальше приведены три скриншоти, которые описывают процесс удара по мячику.

Выводы

Была разработанная компьютерная игра “Гольф 3D” с элементами трехизмеримой графики на основе функций прямого доступа к видеопамяти в системе MS DOS. При разработке программы использовался пакет BORLAND C++ 3.0 и библиотека BGI.

Литература

Касаткин А.И., Вальвачев А.Н. Профессиональное программирование на языке Си. Мн., 1992. 240 С.

Нейбауэр А. Моя первая программа на С/С++.П., 1995. 368 С.

Бруно Бабэ. Просто и ясно о Borland C++.М., 1996. 400 С.

Шамас Н.К. Основы С++ и объектно-ориентированного программирования. К., 1996. 448 С.

Справочник по классам Borland C++ 4.0. К., 1994. 256 С.

ObjectWindows для C++.К., 1993., 208 С.

Том Сван. Программирование для Windows в Borland C++.М., 480 С.

Н. Барканати. Программирование игр для Windows на Borland C++. М., 1994. 512 С.


Подобные документы

  • Изучение основных возможностей создания трехмерных объектов в программе OpenGL, методика наложения текстур. Механизм подключения библиотек. Создание поверхности ландшафта. Реализация ориентирования на поверхности. Изменение поверхности ландшафта.

    курсовая работа [21,5 K], добавлен 29.11.2010

  • Назначение компьютерной графики. Особенности трехмерной анимации. Технология создания реалистичных трехмерных изображений. Компьютерная графика для рисования на SGI: StudioPaint 3D. Пакет PowerAnimator как одна из программ трехмерной анимации на SGI.

    реферат [25,7 K], добавлен 31.03.2014

  • Построение динамической трехмерной сцены, включающей заданные тело и поверхность определенного вида средствами графической библиотеки. Наложение текстур на тела, поверхности с помощью функции SetupTextures. Графическое представление тела с текстурой.

    курсовая работа [582,9 K], добавлен 24.12.2010

  • Базовые приемы работы при создании трехмерной модели в пакете Компас. Абсолютная система координат, координатные плоскости. Управление изображением, цветом и свойствами поверхности объектов. Этапы процесса разработки трехмерной модели "Форма для льда".

    курсовая работа [963,3 K], добавлен 11.06.2012

  • Разработка программных продуктов на языке программирования Borland Delphi. Применяемые таблицы и связи между ними. Пользовательский интерфейс работы с базой данных. Алгоритм работы программы "Футбольные команды и игроки". Защита от ввода неверных данных.

    курсовая работа [788,1 K], добавлен 22.06.2011

  • Работа в Borland C++ Builder. Среда разработки и компоненты C++ Builder. Свойства компонентов. Менеджер проектов. Создание приложений в C++ Builder. Выбор компонентов для групповых операций. Работа с базами данных в Borland C++ Builder.

    курсовая работа [35,8 K], добавлен 11.06.2007

  • Выбор алгоритма решения задачи. Разработка программы, обеспечивающую эффективную обработку и хранение информации с использованием линейных списков. Написание программы на псевдокоде и на языке программирования высокого уровня. Результаты работы программы.

    курсовая работа [2,1 M], добавлен 21.04.2012

  • Игра "Пятнашки": исходные данные, условия задачи и цели ее решения. Основные приемы программирования и типы данных, используемые при решении аналогичных задач. Для разработки программы использовался язык С и среда программирования Borland C++ Builder.

    курсовая работа [674,1 K], добавлен 03.07.2011

  • Построение банков данных. Инструментальные средства баз данных Borland. Принцип работы и архитектура баз данных в Delphi. Навигационный способ доступа к базам данных: операции с таблицей, сортировка и перемещение по набору данных, фильтрация записей.

    курсовая работа [642,7 K], добавлен 06.02.2014

  • Характеристика предприятия ООО "РН-Информ" и организации сети в виде топологии звезды. Подключение к интернет с помощью широкополосного маршрутизатора. Описание используемых программных комплексов. Построение модели в Borland Together Architect.

    отчет по практике [1,8 M], добавлен 09.04.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.