Создание игровой программы "WP-Billiards"
Создание игровой программы, реализующей игру в бильярд на компьютере. Математическое описание законов физики, определяющих траекторию движения шаров по бильярдному столу. Существующие аналоги разрабатываемого продукта. Алгоритмы игровой программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 25.07.2012 |
Размер файла | 31,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Создание игровой программы "WP-Billiards"
Введение
Практически любая компьютерная игра на сегодняшний день в той или иной мере является цифровым представлением некоторых явлений, процессов или объектов реального мира. В доказательство этому можно привести наличие такого свойства любой динамической компьютерной игры как реалистичность. Чем лучше реалистичность, тем, как правило, лучше игра. Данный факт не является чем-то парадоксальным, особенно если вспомнить что человек живет в реальном мире, а когда у него появляется возможность сотворить виртуальный, то он делает его по образу и подобию реального, исключая либо не очень важные моменты, требующие высокой производительности, либо моменты, мешающие реализации условий поставленной задачи.
В понятие реалистичности вкладывается не только фотографическое качество картинки, выводимой на экран монитора, но и то, насколько хорошо отображены физические свойства предметов, такие как масса, скорость, ускорение и явления, как соударение, взаимопритяжение и т.д. Особенно это важно для игр-симуляторов, в том числе для спортивных симуляторов и симуляторов «традиционных» настольных игр, имеющих элемент динамики (бильярд). К ним предъявляются очень большие требования, так как спортивные игры - занятие из реального мира, где все может решить любой закон физики.
Естественно, вид компьютерной реализации любой динамической игры по ряду объективных причин должен несколько отличаться от ее традиционного вида: не считая обхода проблем с производительностью, здесь следует учитывать такие моменты: игрок должен быть избавлен от деталей (присутствующих в «живой» игре из необходимости), мешающих восприятию информации на экране; он не должен долго бездействовать, например, ожидая, когда компьютер сделает свой ход.
Однако это не означает, что компьютерный вариант какой-нибудь динамической игры не имеет перед своим реальным аналогом никаких преимуществ. Напротив: инвентарь игры может быть очень дорогостоящим, кроме того, его расположение в комнате может быть проблематичным. В компьютерную игру можно поиграть, даже находясь в одиночестве, - отпадает необходимость наличия партнера по игре. Кроме того, любая компьютерная игра, имеющая свой прототип в реальном мире, получает некоторое преимущество по успеху перед другими компьютерными играми за счет популярности своего «живого» собрата.
Существует огромное количество динамических игр, для которых можно было бы создать компьютерную реализацию. Среди них остановимся на бильярде, как одной из наиболее эффектных игр, в полной мере демонстрирующих некоторые законы механики.
Целью данной работы является создание игровой программы, реализующей игру в бильярд на компьютере. В качестве названия программы будем использовать «WP-Billiards» (Windows Programming Billiards). Для достижения этой цели необходимо решить следующие задачи:
- произвести сбор данных: выяснить математическое описание законов физики, определяющих траекторию движения шаров по бильярдному столу;
- произвести анализ существующих аналогов разрабатываемого продукта, выяснить его практическую значимость;
- произвести анализ возможных сред для работы программы, выявить лучшие;
- произвести анализ возможных сред разработки программного продукта, выбрать наиболее подходящую среду программирования, выбрать вспомогательные средства разработки (редактор графики и т.д.);
- реализовать алгоритмы программы;
- произвести тестирование и отладку программного продукта.
На сегодняшний день существует несколько реализаций бильярда на компьютере: от самых «старых» игр (Video Pool) до новейших (Perfect Pool). В данном проекте будут реализованы следующие черты, в совокупности не реализованные ни в одном из известных аналогов:
- красочная тщательно прорисованная графика (с эффектом трехмерности);
- алгоритм подсчета очков, учитывающий текущий уровень, сложность ходов, количество соударений шаров и т.д.;
- отсутствие «игры с компьютером» и соответствующая переработка правил игры. Наличие интеллекта компьютера заставило бы пользователя часто сидеть, сложа руки, дожидаясь, когда компьютер, наконец, наиграется;
- наличие таблицы рекордов (двадцать имен).
Создаваемый программный продукт предназначен для широкого круга пользователей: требованием является лишь общее знание правил игры в бильярд, а также владение клавиатурой и мышкой.
программа бильярд алгоритм физика
1. Описание предметной области
1.1 Исследование предметной области
Предметную область разрабатываемого проекта можно определить двояко: с одной стороны это совокупность всех компьютерных игр, являющихся аналогами традиционных, с другой - это игра в бильярд и ее правила, а также законы физики, описывающие поведение тел во время столкновения (имеется в виду столкновение бильярдных шаров).
Рассмотрим сначала первую сторону, а точнее коснемся возможностей реализации бильярда в виде компьютерной игры.
Помимо огромного количества классификаций компьютерных игр, их можно поделить на двухмерные и трехмерные, причем в настоящее время большинство компьютерных игр разработчики стараются сделать именно трехмерными: действительно, наш мир имеет три измерения, соответственно, логичной кажется мысль, что любая игровая программа, использующая трехмерный дизайн будет заведомо лучше двухмерной. На самом деле, когда речь идет о всяческих симуляторах и боевиках, так оно и есть. Этот факт является настолько очевидным, что не нуждается ни в каком доказательстве. Оценим теперь необходимость трехмерности в игре в бильярд.
В некотором роде, трехмерная игра в бильярд дает большую свободу для творчества: помимо бильярдного стола на сцене можно будет разместить предметы интерьера бильярдной комнаты. Однако при этом следует помнить, что все интересующие нас действия должны происходить на бильярдном столе, то есть в плоскости (за очень редким исключением «подскакивания» шаров при ударе, возможность которого можно не учитывать из-за большой степени случайности такого явления). Иными словами, для того, чтобы отобразить нужные действия, достаточно двух измерений, а третье, в случае его использования, будет носить исключительно декоративный характер. Кроме того, использование третьего измерения, как правило, подразумевает возможность смотреть на стол под произвольным углом, что может привести к таким нежелательным эффектам, как неправильное восприятие расстояния между игровыми объектами и т.д.
Рассмотрим также такой момент как реализация искусственного интеллекта противника. Как уже говорилось ранее, одним из преимуществ компьютерных игр (за исключением сетевых) является то, что играть в них можно, не имея рядом партнера по игре. Однако это не означает, что любая игра, в том числе и рассматриваемая должна обязательно иметь встроенный искусственный интеллект противника. Конечно, в некоторых случаях такое крайне желательно, например в карточных играх. Представим, что мы реализовали игру в бильярд с классическими правилами, тогда вся игра будет представлена в виде следующей цепочки «ход человека - ход компьютера», в которой человеку придется ожидать время, пока компьютер не сделает ход, и все шары не остановятся. При этом переход хода будет осуществляться далеко не всегда, а только когда одним из противников не будет забито ни одного шара. Иными словами, при полной и продуманной реализации искусственного интеллекта противника, человек, передав один раз ход компьютеру, сможет откинуться на спинку кресла и безмолвно наблюдать за тем, как компьютер загоняет в лузы шар за шаром. Естественно от такой игры трудно получить много удовольствия. В качестве выхода из данной ситуации можно предложить изменение правил игры в сторону «одноигроковости». Суть такого изменения состоит в следующем: цель игрока - забить все шары, кроме бьющего, в лузы. В случае, если он забивает в лузу бьющий шар, теряется одна попытка. Всего попыток четыре. Когда игрок забивает все шары в лузы, он переходит на другой уровень, где все повторяется. При переходе на каждый третий уровень добавляется одна попытка.
Интересным также является вопрос о начислении очков. Естественным будет, если количество очков будет зависеть от сложности удара и текущего уровня. Предлагается следующая схема:
1) При столкновении бьющего шара с любым другим - 1 очко;
2) При забивании шара в лузу, количество начисляемых очков вычисляется по формуле:
,
где I - порядковый номер шара, в котором он забивается в течении этого хода, L - номер уровня. Таким образом, выгодно в течение одного хода забивать сразу несколько шаров.
3) При переходе на следующий уровень количество очков будет начисляться по формуле .
4) При окончании 99-го уровня, уровень переключится в значение 01, а пользователь получит 10000 очков дополнительно.
1.2 Математические модели, используемые в программе
Другим важнейшим компонентов подобных игр является физико-математический аппарат. Применительно к бильярду следует выделить такие требующие особого внимания моменты: определение начальной скорости шара (когда его только что ударили кием), определение направления шара при столкновении со стенкой и с другими шарами, определение такого столкновения.
Начальная скорость бьющего шарика должна вычисляться на основе следующих данных: вектор, проведенный из центра шара к указателю, сила удара. Начальная скорость находится решением следующей системы уравнений:
.
При столкновении со стенкой соответствующая составляющая должна менять знак.
При столкновении шаров их скорости перерасчитываются по следующему алгоритму:
impactx=ball[j].vx-ball[i].vx;
impacty=ball[j].vy-ball[i].vy;
r=RasstTT (ball[i].x, ball[i].y, ball[j].x, ball[j].y); // Расстояние от точки до точки
impulsex=(ball[j].x-ball[i].x)/r;
impulsey=(ball[j].y-ball[i].y)/r;
ImpactSpeed=impactx*impulsex+impacty*impulsey;
impulsex*=ImpactSpeed*ball[i].m*ball[j].m;
impulsey*=ImpactSpeed*ball[i].m*ball[j].m;
ball[i].vx+=impulsex/ball[i].m;
ball[i].vy+=impulsey/ball[i].m;
ball[j].vx-=impulsex/ball[j].m;
ball[j].vy-=impulsey/ball[j].m;
1.3 Анализ предметной области, выяснение требований к программному продукту
Итогом исследования предметной области программного продукта должно являться выявление требований к функциональным возможностям проекта. Добавив сюда общепринятые, понятные без доказательств и комментариев требования, получаем следующий набор:
1) Программа должна реализовывать игру в бильярд в двухмерном исполнении;
2) Подсчет очков должен осуществляться с учетом сложности хода и номера уровня;
3) Расчет скоростей шаров должен пересчитываться, исходя из приведенных законов физики;
4) Программа должна иметь таблицу лучших результатов по очкам, сохраняемую на диске;
5) Ввод имени игрока должен вводиться один раз перед игрой, чтобы не запрашивать имя при каждом попадании в таблицу рекордов;
6) Программа должна иметь начальное меню, с помощью которого можно будет запустить саму игру, сменить имя игрока, просмотреть таблицу рекордов, а также выйти из программы.
Выводы
1. Исследована предметная область. Рассмотрены возможные варианты построения компьютерной реализации игры в бильярд.
2. Построена математическая модель программы.
3. Определены функциональные требования к проекту.
2. Проектирование программного продукта
Для реализации проекта на основе выдвинутых требований следует сначала определить архитектуру программы. Построение архитектуры очень важно для программиста: на этом этапе вся задача структурируется, определяются компоненты программы и их взаимодействие. Результат именно этапа проектирования используется программистом в качестве отправной точки при реализации проекта. Чем больше будет потрачено сил и времени на проектирование, тем проще будет этап реализации, и тем оптимальнее будет код проекта.
2.1 Выбор среды выполнения программы
Среда выполнения программы во многом определяет как структуру самой программы, так и некоторые эксплуатационные и функциональные характеристики проекта. Так как дело мы имеем с игровым проектом, при выборе среды выполнения программы следует в большей степени ориентироваться не на удобство программирования, а на популярность среды. На сегодняшний день наиболее популярными операционными системами во всем мире являются операционные системы семейства Windows фирмы Microsoft. По некоторым данным, они установлены на 95% всех персональных компьютеров в мире. Безусловно, при разработке программы наш выбор падет именно на эти операционные системы. К их числу будем относить Windows 95/98/Me/NT/2000/XP/2003 и их модификации.
Но сама операционная система Windows предоставляет множество возможностей и технологий для реализации проекта. При дальнейшем уточнении среды программирования будем руководствоваться следующим набором особенностей реализуемого проекта:
1) программа будет использовать множество динамических полноцветных изображений;
2) в программе должна будет обеспечиваться плавность движения объектов на экране;
3) программа должна работать в полноэкранном режиме (когда пользователь играет и игра требует от него постоянного сосредоточения, никакая посторонняя информация на экране не должна его отвлекать).
Для удовлетворения этих требований идеально подходит менеджер видеопамяти DirectDraw - компонент DirectX. Он обладает следующими свойствами:
1) Быстрый вывод поверхностей (спрайтов) на экран;
2) Возможность масштабирования изображений;
3) Возможность простой реализации двойной буферизации;
4) Кадровая синхронизация при выводе изображений;
5) Возможность работы в полноэкранном режиме.
2.2 Определение архитектуры проекта
Так как проект имеет немного функций, имеет смысл не разбивать его на множество модулей, а хранить все в одном файле. Сюда не входит использование модуля от Microsoft «ddutil.cpp», расширяющего возможности работы с DirectDraw.
Основная идея работы с DirectDraw состоит в поочередном копировании поверхностей на экран и смене поверхностей на экране. В данном проекте к экрану подключено две поверхности (такая схема является общепринятой): отображаемая и невидимая. Принцип работы программы состоит в следующем: на невидимую поверхность копируются все спрайты (тоже представленные поверхностями), после чего поверхности экрана меняются местами, и ситуация повторяется. При смене поверхностей автоматически ожидается кадровый синхроимпульс, чем достигается кадровая синхронизация, и тем самым - плавность движения. Общий алгоритм обновления информации на экране можно представить в следующем виде:
1) Регенерируем поверхности, на которых поменялось изображение;
2) Выводим нужные поверхности на невидимую экранную поверхность;
3) Меняем местами экранные поверхности;
4) Переходим к пункту 1.
Данный цикл должен быть реализован в главном цикле программы, который, тем не менее, должен еще и обрабатывать приходящие сообщения Windows. Это позволяет максимально использовать ресурсы ЭВМ, не перегружая очередь сообщений, чего нельзя было бы сказать, если бы мы для реализации цикла использовали таймер с высокой частотой.
Выводы
1. Рассмотрены возможные среды выполнения проекта. В качестве платформы выбрана операционная система Windows с использованием Microsoft DirectX.
2. Рассмотрены принципы работы с изображениями в DirectDraw. Определена архитектура проекта.
3. Программная реализация проекта
3.1 Выбор среды программирования
Количество сред программирования, позволяющих писать приложения для Windows очень велико. Однако выбор остановим на среде Microsoft Visual C++ пакета Microsoft Visual Studio 6.0, как имеющим следующие преимущества:
- наличие стандартных библиотек для работы с DirectDraw;
- автоматическое приведение типов данных. Так как все координаты во избежание потери данных представлены в виде чисел с плавающей точкой, а при выводе на экран требуются целые координаты, такое часто используется. Например строчка кода Viewball (x, y) в Delphi имела бы вид ViewBall (round(x), round(y)) что довольно неудобно;
- удобная среда создания исходных текстов;
- получаемый компактный и быстрый код;
- наличие уже готового модуля ddutil от Microsoft.
3.2 Реализация алгоритмов создания и вывода поверхностей
Все поверхности, используемые в программе можно поделить на два типа: динамические и статические. Статическими являются те поверхности, которые загружаются один раз в начале программы и не меняют своего содержания (изображения шаров и т.д.), к динамическим относятся поверхности, изображение на которых меняется в зависимости от результатов каких-либо действий (поверхности с изображением номера уровня и т.д.). К статическим относятся поверхности: GameScreen, BallSurface[11], CrossSurface, GameOverSurface, TitleSurface, PunktSurface[5], ArrowSurface, EnterSurface, AboutSurface. К динамическим: PlayerSurface, LevelSurface, ScoreSurface, StringSurface, HiScoreSurface.
При запуске программы создается окно со стилем WS_POPUP (без шапки и кнопок), инициализируется DirectDraw (функция DirectDrawInit), создаются все поверхности (функция CreateAllSurfaces), загружаются все статические (DrawAllStaticSurfaces). Динамические поверхности рисуются только по мере необходимости (функции DrawHiScore, DrawString, DrawPlayerName, DrawLevel). После этого в массив hiscore загружаются лучшие результаты (LoadHiScore).
Далее программный счетчик попадает в цикл обработки сообщений и обновления экрана. По сравнению с обычными Windows-приложениями здесь функция GetMessage заменена на PickMessage, которая в отличие от первой не ожидает прихода сообщения, а проверив очередь сообщений, завершает свою работу. Если сообщения в данный момент не пришло, то программа начинает заниматься обновлением экрана, но только в случае, если переменная GameActive имеет значение true, иначе программа пассивно ожидает сообщений. Значение переменной GameActive зависит от того, активно сейчас приложение или нет. Изменение этой переменной происходит при возникновении события WM_ACTIVATEAPP.
Перед обновлением экрана происходит небольшая задержка, работающая на основе внутреннего таймера процессора. Ее назначение - реализация одинаковой скорости работы программы на разных кадровых развертках монитора (без нее единственная задержка в программе - ожидание кадрового синхроимпульса при обработке команды Flip (обмен поверхностей экрана)).
Функция UpdateScreen производит обновление экрана каждый кадр. В зависимости от флагов CrossMustBeUpdated, BarMustBeUpdated, TurnMustBeUpdated, Gaming, EnteringName, ViewingHiScore, ViewingAbout функция обновляет те или иные изображения (функции с префиксом View, например, ViewTable, ViewBall и т.д.).
Выводы
1. Выбрана среда программирования, перечислены преимущества данного выбора.
2. Рассмотрены общие принципы обновления информации на экране с помощью DirectDraw.
3. Реализованы алгоритмы обновления изображения на экране в программе.
4. Тестирование и отладка
4.1 Тестирование программного средства
Тестирование проекта производилось по принципу «черного ящика» в реальном времени. Цель тестирования - выявление как можно большего количества ошибок в программе. Парк машин, на котором тестировался программный продукты весьма обширен: начиная от Intel Pentium 233/64Mb и заканчивая AMD Athlon-2500/512Mb. Операционными системами, на которых тестировался проект являются: Windows 98 SE, Windows 2000 Professional, Windows Me, Windows XP Home, Windows XP Professional, Windows Server 2003.
В ходе тестирования были выявлены следующие ошибки и недоработки:
1) Иногда программа зависала при попытке просмотреть таблицу рекордов.
Причина: переполнение переменной char pn[20], в результате которого уничтожались какие-то важные данные в памяти.
Устранение: максимальный номер символа, используемый в переменной, уменьшен на единицу.
2) На некоторых компьютерах программа не запускается с ошибкой «невозможно инициализировать DirectDraw».
Причина: попытка включения неподдерживаемого графического режима.
Устранение: смена используемой глубины цвета с 32 на 16 бит.
3) После переключения задач с помощью Alt+Tab и возврата в программу программа завершала свою работу с ошибкой DDERR_SURFACELOST.
Причина: при потере фокуса приложением видеопамять затиралась посторонними данными.
Устранение: добавлена обработка ошибки DDERR_SURFACELOST, теперь в случае ее возникновения вызывается новая функция Restore, перезагружающая все поверхности.
4.2 Определение характеристик полученного программного средства
Перечислим основные функциональные характеристики программы:
- программа полностью реализует компьютерную версию модифицированной игры в бильярд;
- моделирование физических процессов произведено тщательным образом, программа обладает высокой реалистичностью;
- имеется возможность просмотра информации о двадцати лучших результатах;
- программа имеет удобный интерфейс пользователя.
Выводы:
1. Произведено тестирование программы. Тестирование проводилось методом «черного ящика». Было обнаружено и устранено три неполадки.
2. Определены характеристики полученного программного средства. Все характеристики удовлетворяют определенным на этапе анализа требованиям.
Заключение
В результате выполнения работы был создан программный продукт «WP-Billiards», обладающий всеми необходимыми качествами, чтобы его можно было назвать полноценной игровой программой, частично реализующей компьютерную версию игры в бильярд.
Программа написана на языке C++ в среде программирования Visual C++ пакета Microsoft Visual Studio 6.0. В программе в полной мере используется технологии вывода графики с помощью Microsoft DirectX.
В процессе выполнения программы были выполнены следующие задачи:
1) Произведено описание предметной области программного продукта, определены требования к программному продукту;
2) Было выполнено проектирование программного средства: выбрана среда выполнения программного кода программы, определена архитектура программного средства;
3) Выбрана среда программирования, с ее помощью сделана программная реализация алгоритмов программы;
4) Произведено тестирование и отладка программы. Было выявлено и устранено 3 ошибки в программе.
Список источников
1. Microsoft Developer Network Library, April 2001.
2. http://www.brsu.brest.by/openphysics1/content/paragraph21/theory.html
3. http://faq.qbasicnews.com/? blast=BallToBallCollision
4. http://freespace.virgin.net/hugo.elias/models/m_snokr.htm
5. http://galileo.phys.virginia.edu/classes/109N/more_stuff/
Applets/Collision/applet.html
Размещено на Allbest.ru
Подобные документы
Создание программы, реализующей игру "Линии". Среда разработки программы, описание ее общего вида. Основные алгоритмы программы. Реализация программы в среде разработки Microsoft Visual Studio 2008 на языке объектно-ориентированного программирования С++.
курсовая работа [639,0 K], добавлен 16.03.2012Анализ предметной области разрабатываемого программного продукта. Разработка интерфейса пользователя и структурной схемы игровой программы "Крестики-нолики". Отладка и тестирование. Проведение исследования компонентов программной среды Borland Delphi 6.0.
курсовая работа [660,4 K], добавлен 08.03.2015Разработка полноценной правильно функционирующей игровой программы "Парные картинки", изучение процедур и функций. Использование масштабируемых средств для построения баз данных. Компоненты Delphi в программе. Описание пользовательского интерфейса.
курсовая работа [1,3 M], добавлен 13.07.2012Создание игровой системы "Тетрис": количество игр, режимы сложности, интерфейс пользователя, игровая статистика, обработка исключений. Структура входных и выходных данных. Диаграммы и описание классов. Блок-схема алгоритма программы, результаты ее работы.
курсовая работа [1,9 M], добавлен 13.06.2012Разработка игровой программы "разгадывания кроссворда". Создание схемы хранения данных, изучение возможности среды программирования. Требования к функциональным характеристикам, составу и параметрам технических средств, информационной совместимости.
курсовая работа [403,9 K], добавлен 26.03.2015Разработка игрового "движка" с использованием языка C++ для написания кода, графического пакета DirectX9 для вывода графики. Использование физического "движка" PhysX для взаимодействия объектов. Технико-математическое описание задачи, листинг программы.
дипломная работа [4,5 M], добавлен 02.09.2013Изучение истории развития и становления 3D-технологий с середины XX века до нашего времени. Основные инструменты 3D-программы. Игры как направление современного компьютерного дизайна. Способы применения 3D-технологий в оформлении игровой составляющей.
курсовая работа [7,3 M], добавлен 14.10.2016Программирование игр с использованием визуальных компонентов. Описание операторов, используемых при практической реализации разработанной программы. Работа над созданием программы "Морской бой", постановка задачи, алгоритм реализации работы, блок-схема.
курсовая работа [175,9 K], добавлен 10.05.2010Построение и анализ математической модели игры. Определение вероятности обнаружения кораблей при всевозможном их расположении и различных системах поиска. Разработка алгоритмов для работы искусственного интеллекта. Структура программы и ее компоненты.
курсовая работа [2,5 M], добавлен 22.12.2012Разработка игры "Экзамен" с применением объектно-ориентированного программирования и языка Java (в среде Eclipse Helios). Структура программы и алгоритм решения задачи. Описание методов и переменных. Экспериментальное тестирование и оценка программы.
курсовая работа [122,5 K], добавлен 19.05.2011