Программирование на OpenGL

Автор работы: Пользователь скрыл имя, 29 Октября 2014 в 19:11, курсовая работа

Описание работы

Компьютерные игры так же существуют для того , чтобы превратить досуг или свободную минутку человека в развлекательное, а иногда даже поучительное время препровождение. Многие компъютерные игры имеют не только развлекательную функцию, но и так же способные развивать реакцию, скорость мышления. Данная игра ‘пинг-понг’ с компъютером направлена на развитие быстроты реакции. Ведь с каждым новым уровнем скорость передвижения мяча по игровому полю становится значительно быстрее, что потребует от игрока молниеносную реакцию и способность думать на шаг вперед.

Содержание работы

Введение 3.
1 Общий раздел 5.
1.1 Постановка задачи 5.
1.1.1 Определение основных функций задачи 7.
1.1.2 Требования к исходным данным 7.
1.2 Требования к техническим, программным средствам разработки и
функционированию программы 7.
1.2.1 Требования к техническим и программным средствам 7.
1.2.2 Обоснование выбранного языка программирования 9.
1.2.3 Описание языка программирования 9.
2 Специальный раздел 12.
2.1 Основные функции программы и их реализация 12.
2.2 Функции интерфейса 12.
2.3 Описание алгоритма решения задачи 14.
2.4 Тестирование основных функций задачи 17.

Файлы: 1 файл

Курсовая работа на тему Ping Pong.doc

— 138.50 Кб (Скачать файл)

 


 

 

 

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

Информативность представления информации жизненно важна во многих прикладных областях, например управление технологическим процессом на ответственных участках производства. По тому насколько быстро оператор увидит выход какой-либо величины за заданные границы, тем быстрее он среагирует на эту исключительную ситуацию, тем меньшие последствия будут. Кроме того, его реакция на подобную ситуацию опять же должна использовать некие органы управления технологическим процессом, находящиеся перед ним, другими словами – это также пользовательский интерфейс.

Даже если не брать столь ответственные области применения компьютерной техники, роль пользовательского интерфейса нельзя недооценивать. Представим себе программу, с которой ежедневно работают миллионы людей во всем мире, например текстовый редактор Word. Возьмем, к примеру, операцию поиска. Если представить, что такая операция в новой версии будет экономить при работе одну десятую секунды времени, а за час один человек будет прибегать к такой операции хотя бы один раз, то за рабочий день (8 часов) один миллион человек сэкономит 222 часа рабочего времени! А из-за чего может получиться разница в 0,1 секунду? Да практически из-за ничего – разное положение кнопок, например.

Таким образом, важность пользовательского интерфейса ни в коем случае не стоит приуменьшать.

2.3 Описание алгоритма решения задачи

 

Для решения поставленной задачи необходимо разработать несколько объектов и реализовать их методы.

Базовым объектом – предком является статический объект. Статический объект характеризуется координатами x,y расположения объекта. Динамический объект является наследником от статического. Дополнительными характеристиками динамического объекта являются экранные координаты, на которые он был прорисован последний раз, а также указатель на битовую матрицу экранного изображения объекта.

Основными объектами программы являются: мяч, и выбиваемый прямоугольник.

Прямоугольник – объект, наследующий все свойства статического объекта. Дополнительными характеристиками этого объекта являются ширина и высота прямоугольника а также условная единица показывающая твердость объекта, то есть количество попаданий необходимых для его уничтожения.

Мяч – объект, наследующий все свойства динамического объекта. Дополнительные параметры – величины смещения по обоим осям координат за один такт игры и радиус мяча.

Все объекты содержат процедуру Draw, рисующую изображение объекта на экране. При этом динамические объекты рисуются путем предварительного стирания себя на экране копированием себя по маске XOR, а затем уже обычным способом копируют свое изображение в новое положение на экране.

Для объединения всех объектов в одно логическое целое. Разработан класс – игровое поле, содержащее в себе указатели на все объекты игры и реализующий общее управление программой.

Игровое поле содержит следующие методы:

- процедура производит  первоначальную инициализацию переменных. Расстанавливает игровые прямоугольники.

- void game – содержит в себе основной цикл игры.

- void keyboard – проверяет нажатие пользователем кнопок управления и реализует соответствующее управление кареткой игрока. Обрабатываются следующие кнопки:

а) A – увеличивает скорость перемещения платформы вверх до максимальной.

б) D – увеличивает скорость перемещения платформы вниз до максимальной.

г) Кнопка «5» - означает отказ игрока от дальнейшей игры.

Общий алгоритм работы игры следующий. В начале игры запускается метод Start, инициализирующий переменные игры. Затем идет основной игровой цикл. В нем прорисовываются все визуальные объекты игры. Затем производится задержка, необходимая для соразмерения скорости игры со скоростью компьютера. Если не ставить этой задержки, то скорость игры будет слишком быстрой. Далее в цикле опрашивается клавиатура и если нажата какая либо управляющая кнопка, то обновляется скорость и направление движения платформы игрока. Затем осуществляется один условный шаг игры путем запуска class game объекта игрового поля. Внутри данного метода вызываются одноименные методы для кареток игрока и компьютера а также мяча. Здесь же анализируется попадание мяча во все препятствия. При попадании производится расчет нового направления движения мяча по обеим осям координат. При необходимости производится изменение направления движения по каждой из осей за счет изменения знака величины vx или vy мяча на противоположный. После одного шага игры проверяется текущее ее состояние. Если мяч вылетел за пределы игрового поля то увеличивается количество пропущенных мячей того из игроков в чью сторону улетел мяч. Также проверяется факт окончания игры. Игра считается оконченной, если у одного из игроков количество пропущенных мячей достигло максимальной величины, либо пользователь отказался от игры. Выход из игрового цикла осуществляется, если такой факт установлен.

 

 

2.4  Тестирование основных функций задачи.

 

Тестирование программы производилось методом практического перебора игровых ситуаций.

       Для проверки  соответствия курсового задания  поставленной задаче были разработаны  тесты, которые представлены в  таблице номер 1.

       Основная задача  тестирования – выявление отклонений  от эталонных значений.

               Основные задачи тестирования:

      1. Обнаружение ошибок в программе;
      2. Диагностика и локализация причин ошибки;
      3. Контрольная проверка.

 

 

 

 

 

#include <stdlib.h>

#include <GL\glut.h>

#include <time.h>

#include <cmath>

 

class game{

public:

        int score_left; //очки левого игрока//

        int score_right; //очки правого игрока//

        int winwid; // ширина //

        int winhei; // высота//

        bool done_right; //ход правой части//

        bool done_left; //ход левой части//

        game(){

                score_left = 0; //изночальные очки//

                score_right = 0;

                winwid = 800;

                winhei = 800;

                done_right = false;

                done_left = false;

        }

        void win(); //функция отвечающая за побду игрока//

        void start_settings(); //базовые настройки//

        void floor_reflect(); //отражение шара от экрана//

        void border(); //границы  по середине//

        void draw_border(); //граница  вокруг поля//

        void draw_score_l(); // прорисовывает очки левого//

        void draw_score_r(); //и  правого игрока //

}player;

 

class ball{

public:

int x; //координаты шара//

double y; //координаты шара//

double vx; //скоросто шара//

double vy; //скорость шара//

void move(){ //движение шара//

        x += vx; //по х//

        y += vy; //по y//

}

void reflection(); // отражение шара от  пластин//

void draw_ball(); //рисуем наш шар//

}pong_ball;

 

class reflector{ //пластины//

public:

        int x; //координаты пластины//

        int y; //координаты пластины//

        double vy; //скорость  пластины//

        int size; //размер пластины//

        reflector(){

         x = 0;

         y = 0;

         vy = 0;

         size = 250; //размер пластины//

        }

        void draw_r(); //рисуем пластину//

        void move();

}left,right; //левая,правая пластина//

 

void reflector::draw_r(){//рисует пластину  отражающая шар//

glVertex2f(x + 10,y + size/2);

glVertex2f(x + 10,y - size/2);

glVertex2f(x - 10,y - size/2);

glVertex2f(x - 10,y + size/2);

}

 

void ball::reflection(){//функция отражателя//

        if((x < left.x+10)&&(fabs(double(y - left.y)) < left.size/2)){vx = -vx;vy+=left.vy*1;}/*

        x < left.x+10 шар достигает пластину

        fabs(double(y - left.y) сравнивает расстояние по у от шара до центра пластины

        left.size/2 размер  пластины попалам

        если fabs(double(y - left.y) > left.size/2, то шар проходит  мимио пластины

        если fabs(double(y - left.y) < left.size/2, то шар ударяется  об пластину

        vx = -vx его скорость меняется на противоположную

        1 коэффициент  скольжения*/

        if((x > right.x-10)&&(fabs(double(y - right.y)) < right.size/2)){vx = -vx;vy+=right.vy*1;}

}

 

void ball::draw_ball(){ //прорисовка шара//

        glColor3f(1,(rand()%10)/10,(rand()%10)/10);

glVertex2f(x+10+rand()%7,y+10+rand()%7);

glVertex2f(x+10+rand()%7,y-10+rand()%7);

glVertex2f(x-10+rand()%7,y-10+rand()%7);

glVertex2f(x-10+rand()%7,y+10+rand()%7);

        glColor3f(0,0,0);

}

 

void game::floor_reflect(){//отражение от верхней и нижней границы//

if((pong_ball.y < -player.winhei)||(pong_ball.y > player.winhei))pong_ball.vy = -pong_ball.vy;/*

если координаты шара pong_ball.y меньше координат отрицательной границы-player.winhei,

то шар меняет скорость на противоположную pong_ball.vy = -pong_ball.vy

если pong_ball.y > player.winhei, то pong_ball.vy = -pong_ball.vy */

}

 

void game::start_settings(){

left.x = -710;//координаты отражателя по х//

right.x = 710;//координаты отражателя  по у//

int i = rand()%2;

if(i == 0)pong_ball.vx = 7; //базовая скорость по х//

if(i == 1)pong_ball.vx = -7; //скорость отраженного  шара//

pong_ball.vy = 0; //базовая скорость по  у//

pong_ball.x = 0; //координаты шара//

pong_ball.y = 0; //координаты шара//

}

 

void game::border(){ //прорисовка границы между правой и левой частью//

glColor4f(0,1,0,0);

glVertex2f(-2,800);

glVertex2f(2,800);

glVertex2f(2,-800);

glVertex2f(-2,-800);

glColor3f(1,1,1);

}

 

void game::draw_border(){ //прорисовка границы вокруг поля//

glColor3f(0.1,0.8,0.1);

glVertex2f(810,810);

glVertex2f(800,810);

glVertex2f(800,-810);

glVertex2f(810,-810);

glColor3f(1,1,1);

 

glColor4f(0.1,0.8,0.1,0);

glVertex2f(810,810);

glVertex2f(810,800);

glVertex2f(-810,800);

glVertex2f(-810,810);

glColor3f(1,1,1);

 

glColor4f(0.1,0.8,0.1,0);

glVertex2f(-810,-810);

glVertex2f(-810,810);

glVertex2f(-800,810);

glVertex2f(-800,-810);

glColor3f(1,1,1);

 

glColor4f(0.1,0.8,0.1,0);

glVertex2f(-810,-810);

glVertex2f(810,-810);

glVertex2f(810,-800);

glVertex2f(-810,-800);

glColor3f(1,1,1);

}

 

void reflector::move(){ //передвижение платформ//

if((y >= -player.winhei + size/2)&&(y <= player.winhei - size/2)){y += vy;} //движение платформ//

if((y < -player.winhei + size/2)){y =-player.winhei + size/2;vy = 0;} /*сталкновение платформ

                                                                        с верхней границой*/

if((y > player.winhei - size/2)){y = player.winhei - size/2;vy = 0;} /* сталкновение платформ

                                                                        с нижней границей*/

}

 

void game::win(){

        if(pong_ball.x < left.x){ //шар вышел за пределы левой платформы//

        player.start_settings(); //обнуление настроек иры, игра начинается сачала//

        score_right++; //правой  платформе прибавляется одно  очко//

        }

        if(pong_ball.x > right.x){ //шар вышел за пределы правой платформы//

        player.start_settings(); //обнуление настроек иры, игра  начинается сачала//

        score_left++; //левой  платформе прибавляется одно  очко//

        }

        if((score_left==7)||(score_right==7))exit(0); //если одна из платформ набрала 7 очков, выходим из игры//

}

 

void game::draw_score_l(){ //прорисовка очков  левой части//

        glColor3f(1,1,1);

        for(int i = 0; i < score_left; i++){

        glVertex2f(-810 + i*50,830);

        glVertex2f(-808 + i*50,830);

        glVertex2f(-808 + i*50,820);

        glVertex2f(-810 + i*50,820);

        }

}

 

void game::draw_score_r(){

        glColor3f(1,1,1);

        for(int i = 0; i < score_right; i++){

        glVertex2f(810 - i*50,830);

        glVertex2f(806 - i*50,830);

        glVertex2f(806 - i*50,820);

        glVertex2f(810 - i*50,820);

Информация о работе Программирование на OpenGL