Разработка компьютерной игры "Пинг-понг"

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

СОДЕРЖАНИЕ

Введение

1. Общий раздел

1.1 Постановка задачи

1.1.1 Определение основных функций задачи

1.1.2 Требования к исходным данным

1.2 Требования к техническим, программным средствам разработки и

функционированию программы

1.2.1 Требования к техническим и программным средствам

1.2.2 Обоснование выбранного языка программирования

1.2.3 Описание языка программирования

2. Специальный раздел

2.1 Основные функции программы и их реализация

2.2 Функции интерфейса

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

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

Список литературы

ВВЕДЕНИЕ

С начала 80-х годов началось широкое внедрение ЭВМ в деятельность человека. ЭВМ позволяет повсеместно автоматизировать человеческую деятельность и высвободить интеллектуальные ресурсы для творческого труда. В связи с широким внедрением ЭВМ возникает необходимость в своеобразной «минимализации» затрат времени на освоение этой техники максимально широким кругом пользователей.

Слово «компьютер» означает «вычислить», т. е. устройство для вычислений. Это связано с тем, что первые компьютеры создавались как устройства для вычислений.

Хотя компьютеры создавались для численных расчетов, скоро оказалось, что они могут обрабатывать и другие виды информации — ведь практически все они могут быть представлены в числовой форме. Сейчас с помощью компьютеров не только проводятся числовые расчеты, но и подготавливаются к печати книги, создаются рисунки, кинофильмы, музыка, осуществляется управление заводами и космическими кораблями и т. д. Компьютеры превратились в универсальные средства для обработки всех видов информации, используемых человеком.

Большинство (более 90%) современных компьютеров являются IBM PC — совместимыми персональными компьютерами. Полная программная совместимость этих компьютеров привела к появлению сотен тысяч рассчитанных для них программ, охватывающих практически все сферы человеческой деятельности.

Относительно высокие возможности IBM PC — совместимых компьютеров по переработке информации позволили использовать их (а не более мощные компьютеры) как для решения подавляющего большинства задач в бизнесе, так и для почти всех личных нужд пользователя таких, как развлечение и компъютерные игры.

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

1. ОБЩИЙ РАЗДЕЛ

1.1 Постановка задачи

Требуется разработать компъютерную игру `пинг-понг'. Игровое поле состоит из двух подвижных прямоугольников (площадок, «ракеток»), одной из которых управляет игрок, другой противник, мячика, игрового меню, разметки поля. Двигающийся по игровому полю мячик, может отскакивать от границ поля, от площадок.

Игра длится до тех пор, пока один из игроков не получит 7 очков по пропускам мяча.

1.1.1 Определение основных функций задачи

Главные функции задачи игры `пинг-понг' это не только сделать досуг пользователя развлекательным, но и развить реакцию, и способность быстро думать

В приложении 1 показана функциональная схема.

Так же в задаче реализована опция `выход'. Благодаря ей пользователь сможет выйти из данной игры, а результаты автоматически сохраняются.

1.1.2 Требования к исходным данным

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

Управление осуществляется следующими клавишами:

1 — Игрок:

«5"-Выход из игры

«A"-Перемещение платформы вверх

«D» -Перемещение платформы вниз

«S» — Остановка платформы

2 — Игрок:

«5"-Выход из игры

«1"-Перемещение платформы вверх

«3» -Перемещение платформы вниз

«2» — Остановка платформы

Игра длится до тех пор, пока один из игроков не получит 7 очков по пропускам мяча.

1.2 Требования к техническим, программным средствам разработки и функционированию программы

1.2.1 Требования к техническим и программным средствам

Программа занимает 52 Кб. жесткого диска. Программа функционирует под ОС DOS 6. 22 и выше. Разрешение экрана не менее 640*480, 16 цветов.

Технические требования:

Для работоспособности программы необходим процессор Intel 486. Его возможности включают в себя:

-операции с плавающей запятой и управлением памяти;

-модуль выполнения команд разработан так, чтобы выполнять часто встречающиеся операции за один цикл;

-32-разрядный процессор для выполнения арифметических и логических операций;

Также для работоспособности программы необходимо около 100Кб свободного места на жестком диске и от 500Кб свободного места в ОЗУ.

Программные требования:

Для запуска программы необходима операционная система MS-DOS 5. 0

MS DOS — это операционная система (ОС), разработанная фирмой Microsoft для ЭВМ на основе микропроцессоров серии Intel 8086. Эта система располагает набором программ средств для обеспечения прогона программ в монопольном режиме. Основные возможности системы определяются набором средств для управления файлами и устройствами ввода-вывода.

ОС MS DOS состоит из следующих частей:

Базовая система ввода-вывода (BIOS), находящаяся в ПЗУ компьютера. Эта часть ОС является «встроенной» в компьютер. Ее назначение состоит в выполнении наиболее простых и универсальных услуг ОС, связанных с осуществлением ввода-вывода. BIOS содержит также тест функционирования компьютера при включении его электропитания. Кроме того, BIOS содержит программу вызова загрузчика ОС.

Загрузчик ОС — это очень короткая программа, находящаяся в первом секторе каждой дискеты с ОС MS DOS. Функция этой программы заключается в считывании в память еще двух модулей ОС, которые и завершают процесс загрузки MS DOS.

На винчестере загрузчик ОС состоит из двух частей. Это связано с тем, что жесткий диск может быть разбит на несколько логических дисков. Первая часть загрузчика находится в первом секторе жесткого диска, она выбирает, с какого из разделов винчестера следует продолжить загрузку. Вторая часть загрузчика находится в первом секторе этого раздела, она считывает в память модули MS DOS и передает им управление.

Дисковые файлы IO. SYS и MSDOS. SYS — они загружаются в память загрузчиком ОС и остаются в памяти компьютера постоянно. Файл IO. SYS представляет собой дополнение к базовой системе ввода-вывода в ПЗУ. Файл MSDOS. SYS реализует основные высокоуровневые услуги MS DOS.

Командный процессор MS DOS обрабатывает команды, вводимые пользователем. Командный процессор находится в дисковом файле COMMAND. COM на диске, с которого загружается ОС.

Внешние команды MS DOS — программы, поставляемые вместе с ОС в виде отдельных файлов. Эти программы выполняют действия обслуживающего характера, например, форматирование дискет, проверку дисков и т. д.

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

1.2.2 Обоснование выбора языка программирования

Для реализации алгоритма в качестве основного был выбран язык программирования С++, который стал едва ли не стандартом для написания любых достаточно сложных программ. С++ - это универсальный язык программирования, задуманный так, чтобы сделать программирование более простым и приятным для серьёзного программиста. За исключением второстепенных деталей С++ является надмножеством языка программирования C (его объектно-ориентированным расширением). Основной целью разработчиков C было создание языка, который вместо неудобного и лишённого наглядности ассемблера применялся бы в самых насущных задачах системного программирования. К достоинствам языка С относятся лаконичность записи алгоритмов, логическая стройность написанных на нём программ, их переносимость между компьютерами с различной архитектурой и различными операционными средами (чего не скажешь о программах на машинно-зависимом языке ассемблера). Компиляторы языка разработаны практически для всех существующих в настоящее время платформ. Как никакой другой язык программирования, язык С «доверяет» программисту. Даже в таком существенном вопросе, как преобразование типов данных, налагаются лишь незначительные ограничения. Во многих случаях программы, написанные на этом языке программирования, сравнимы по скорости с программами, написанными на языке ассемблера, при этом они более наглядны и просты в сопровождении. Всё это делает его удобным и эффективным средством для решения разнообразных задач.

1.2.3 Описание языка программирования

C++ включает в себя элементы объектно-ориентированного программирования:

— обязательное объявление всех переменных;

— подпрограммы объявляются в разделе подпрограмм;

— использование блочной структуры;

— использование как структурированных, так и не структурированных данных.

Типы данных бывают:

1)символьные данные;

2)числовые данные;

а)с фиксированной точкой;

б) с плавающей точкой;

3) в двоично-десятичном представлении.

— const — объявление констант;

— int — объявление переменных;

3. Раздел объявления подпрограмм:

— Procedure — объявление процедуры;

— основной блок — сама программа

4. В C++ есть следующие виды операций:

-арифметические операции;

-операции отношения;

-логические операции;

-операции над символами.

Операторы языка C++:

— -А — замена знака на противоположный;

— А*В — умножение;

— А/В — деление;

— А+В — сложение;

— А-В — вычитание;

— А<В — меньше;

— А>В — больше;

— А< =В — меньше или равно;

— А> =В — больше или равно

— А=В — равно;

— А< >В — не равно;

2. СПЕЦИАЛЬНЫЙ РАЗДЕЛ

2.1 Основные функции программы и их реализация

Основными функциями программы являются:

реализация пользовательского интерфейса, в частности меню программы

описание предметной области в ключе объектно-ориентированного программирования

реализация процедуры быстрого рисования объекта (мяча)

реализация алгоритма управления платформы противника

реализация механизма поведения мяча при столкновении с препятствиями.

2.2 Функции интерфейса

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

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

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

Даже если не брать столь ответственные области применения компьютерной техники, роль пользовательского интерфейса нельзя недооценивать. Представим себе программу, с которой ежедневно работают миллионы людей во всем мире, например текстовый редактор 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.

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

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

Обнаружение ошибок в программе;

Диагностика и локализация причин ошибки;

Контрольная проверка.

#include < stdlib. h>

#include < GLglut. 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 ()(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);

}

}

void keyboard (unsigned char key, int x, int y){

switch (key){

case '1':

if ((left.y <= player. winhei — left. size/2)&&(!player. done_left))left. vy=7; /*

left.y <= player. winhei — left. size/2 упирается ли пластина в границы экрана

!player. done_left действие игрока */

player. done_left = true;

break;

case '3':

if ((left.y >= -player. winhei + left. size/2)&&(!player. done_left))left. vy=-7;

player. done_left = true;

break;

case '2':

if ((left.y >= -player. winhei + left. size/2)&&(!player. done_left))left. vy=0;

player. done_left = true; //остановка платформы//

break;

case '5': exit (0); //выход из игры//

break;

}

switch (key){

case 'a':

if ((right.y <= player. winhei — right. size/2)&&(!player. done_right))right. vy=7;

player. done_right = true;

break;

case 'd':

if ((right.y >= -player. winhei + right. size/2)&&(!player. done_right))right. vy=-7;

player. done_right = true;

break;

case 's':

if ((right.y >= -player. winhei + right. size/2)&&(!player. done_right))right. vy=0;

player. done_right = true; //остановка платформы//

break;

case '5': exit (0); //выход из игры//

break;

}

}

void Timer (int value){

player. done_left = false;

player. done_right = false;

left. move ();

right. move ();

pong_ball. move ();

pong_ball. reflection ();

player. floor_reflect ();

player. win ();

glutPostRedisplay ();

glutTimerFunc (20,Timer, 0);

}

void draw (){

glClear (GL_COLOR_BUFFER_BIT);

glPushMatrix ();

glBegin (GL_QUADS);

glColor3f (0,0,1); //цвет платформы//

right. draw_r ();//прорисовка правой части//

glColor3f (1,0,1); //цвет платформы//

left. draw_r ();//прорисовка левой части//

glColor3f (1,1,1); //цвет платформы//

pong_ball. draw_ball ();//прорисовка шара//

player. border ();

player. draw_border ();

player. draw_score_l ();

player. draw_score_r ();

glEnd ();

glPopMatrix ();

glutSwapBuffers ();

}

void Initialization (int winwid, int winhei){

glClearColor (0,0,0,1. 0);

glMatrixMode (GL_MODELVIEW);

glLoadIdentity ();

glScalef (0. 8,0. 8,0. 8); //отдаляем поле, для того чтобы нарисовать границы//

glRotatef (90,0,0,1);

glOrtho (-winwid, winwid,-winhei, winhei,-2,2); //расширение экрана//

}

int main (int argc, char ** argv) GLUT_RGB);

glutInitWindowSize (player. winwid, player. winhei);

glutInitWindowPosition (200, 100); //позиция окна//

glutCreateWindow («***PONG***»);

glutDisplayFunc (draw);

glutTimerFunc (100,Timer, 0);

glutKeyboardFunc (keyboard);

Initialization (player. winwid, player. winhei);

glutMainLoop ();

system («pause > > NULL»);

return 0;

Список использованной литературы

Джесс Либерти. Освой самостоятельно С++ за 21 день. -4-ое издание / Пер. с англ. — М.: Издательский дом «Вильямс», 2001.

КУРС ЛЕКЦИЙ По использованию динамической памяти

ПоказатьСвернуть
Заполнить форму текущей работой