Скачиваний:
76
Добавлен:
15.09.2014
Размер:
202.17 Кб
Скачать

ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ

Реализовать игру типа PACMAN.

Сценарий игры состоит в том, что герой должен бегать по лабиринту и собирать призы. Когда все призы собраны, в лабиринте открывается дверь, куда может выйти герой и попасть на следующий уровень. За героем охотятся несколько злодеев. Если при хождении по лабиринту герой встречается со злодеями, он погибает. Должно быть реализовано не менее 10 уровней, возможность сохранения на конкретном уровне, подсчет очков и времени затрачиваемого на уровне. Должна быть реализована сохраняемая таблица рекордов с сортировкой по очкам и затраченному времени. Сценарий игры может быть улучшен по желанию студента.

СОДЕРЖАНИЕ

ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ..…………………………………2

ВВЕДЕНИЕ…………………………………………………………………4

1 Обзор методов и алгоритмов решения поставленной задачи……..….7

2 Обоснование выбранных методов и алгоритмов………………………9

3 Описание программы для программиста….…………………………..13

4 Описание алгоритмов решения задачи….……………………………..16

5 Руководство пользователя…………………………………..………….24

ЗАКЛЮЧЕНИЕ……………………………………………………………26

ЛИТЕРАТУРА……………………………………………………………..27

Приложение А………………………………………………………….28

ВВЕДЕНИЕ

Немного истории - С был создан Деннисом Ричи (Dennis Ritchie) в лабораториях Bell Telephone Laboratories в 1972 г. Этот язык создавался не от скуки, а для конкретной задачи — разработки операционной системы UNIX (которая сейчас используется на множестве компьютеров). С самого начала язык С преследовал весьма практическую цель— помочь программистам, очень занятым людям, быстро писать программы.

Язык С оказался таким гибким и мощным, что быстро вышел за пределы лабораторий Bell. Им стали пользоваться повсюду для разработки самых разных программ. Однако вскоре различные организации стали применять свои собственные версии языка, и различия между этими версиями, пусть и небольшие, доставляли программистам немало неудобств. В ответ на возникновение этой проблемы Американский Национальный Институт Стандартов (American National Standards Institute— ANSI) сформировал в 1983 году комитет для создания стандарта языка С. Именно этот стандарт известен как стандарт ANSI языка.

Язык С++ развился из С, который в свою очередь был создан на основе двух предшествующих языков — BCPL и В. Язык BCPL был создан в 1967 году Мартином Ричардом как язык для написания компиляторов и программ­ного обеспечения операционных систем. Кен Томпсон предусмотрел много возможностей в своем языке В — дубликате BCPL и использовал В для создания ранних версий операционной системы UNIX в Bell Laboratories в 1970 году на компьютере DEC PDP-7. И BCPL, и В были «нетипичными» языками — каждый элемент данных занимал одно «слово» в памяти и бремя обработки элемента данных, например, как целого или действительного числа падало на плечи программиста.

Язык С был развит из В Деннисом Ритчи в Bell Laboratories и перво­начально реализован на компьютере DEC PDP-11 в 1972 году. С использует многие важные концепции BCPL и В, а также добавляет типы данных и другие свойства. Первоначально С приобрел широкую известность как язык разработки операционной системы UNIX. Сегодня фактически все новые опе­рационные системы написаны на С или на С++. В течение двух последних десятилетий С стал доступным для большинства компьютеров. С независим от аппаратных средств. При тщательной разработке на С можно написать мобильные программы, переносимые на большинство компьютеров.

В конце 70-х годов С развился в то, что теперь относят к «традиционному С», «классическому С» или «С Кернигана и Ритчи». Публикация издатель­ством Prentice-Hall книги Кернигана и Ритчи «Язык программирования С» привлекла широкое внимание к этому языку. Эта публикация стала одной из наиболее удачных книг по вычислительной технике за все время.

Широкое распространение С на различных типах компьютеров (иногда называемых аппаратными платформами) привело, к сожалению, ко многим вариациям языка. Они были похожи, но несовместимы друг с другом. Это было серьезной проблемой для разработчиков программ, нуждавшихся в на­писании совместимых программ, которые можно было бы выполнять на не­скольких платформах. Стало ясно, что необходима стандартная версия С. В 1983 году при Американском Национальном Комитете Стандартов в области вычислительной техники и обработки информации был создан технический комитет X3J11, чтобы «обеспечить недвусмысленное и машинно-независимое определение языка». В 1989 году стандарт был утвержден. ANSI скооперировался с Международной Организацией Стандартов (International Standards Organizations — ISO), чтобы стандартизировать С в мировом масштабе; со­вместный стандарт был опубликован в 1990 году и назван ANSI/ISO 9899: 1990. Копии этого документа можно заказать в ANSI. Второе издание книги Кернигана и Ритчи, вышедшее в 1988 году, отражает эту версию, называемую ANSI С; эта версия языка используется теперь повсе­местно.

С++ — расширение С — был разработан Бьерном Строустропом в начале 80-х годов в Bell Laboratories. С++ обеспечивает ряд свойств, которые «при­водят в порядок» язык С, но, что более важно, он обеспечивает возможность объектно-ориентированного программирования. Это явилось революционной идеей в мире программного обеспечения. Быстрое, корректное и экономное создание программного обеспечения остается иллюзорной мечтой и это в то время, когда требуется проектирование нового и все более мощного программ­ного обеспечения. Объекты — это эффективные повторно используемые ком­поненты программного обеспечения, моделирующие элементы реального мира. Разработчики программного обеспечения обнаруживают, что исполь­зование достижений модульного, объектно-ориентированного проектирования может значительно повысить продуктивность групп разработки по сравнению с предшествующей популярной технологией программирования, такой, как структурное программирование. Объектно-ориентированные программы легче понимать, корректировать и модифицировать.

Было разработано много других объектно-ориентированных языков, включая наиболее заметный из них Smalltalk, разработанный в Центре Ис­следований Palo Alto компании Xerox (Palo Alto Research Centre — PARC). Smalltalk — чистый объектно-ориентированный язык — в нем буквально все является объектом. С++ — это гибридный язык, он предоставляет возмож­ность программировать и в стиле С, и в объектно-ориентированном стиле, и в обоих стилях сразу. Существует глубокая уверенность в том, что с се­редины 90-х годов С++ станет доминирующим системно-образующим языком.

1. Обзор методов и алгоритмов решения поставленной задачи

Фактически задачу написания игры можно разбить на 3 составляющие: реализацию графической части, реализацию взаимодействия объектов (пакмена, стен, кристаллов, злодеев) и реализацию алгоритма поиска злодеями пакмена.

Поскольку программа должна работать с графикой, возник вопрос о построении самого графического сопровождения. Вопрос состоит в том, что если при обновлении кадра стирать и перерисовывать все объекты на экране, это значительно упрощает саму программу, упрощает и процесс рисования объектов, однако замедляет работу программы, и вызывает дискомфорт, в связи с постоянным обновлением монитора. При другом же методе возрастает объем написанной программы, однако ускоряется работа программы из-за того, что приложению не нужно постоянно перерисовывать все объекты на экране, что, кстати, является более рациональным по отношению к ресурсам компьютера. Хотя если взять в учет ресурсы современных даже самых слабых компьютеров, это не имеет такого большого значения, однако, я считаю что программу всё равно нужно создавать с этим учетом. В этом плане с графическим сопровождением решено использовать второй метод. Возникает и второй вопрос, что же делать с программным сопровождением к игре, а именно как подвязать то, что нарисовано на экране, к реальным объектам. Ведь при движении, каждый из движущихся объектов должен знать, что перед ним стена, или скажем враг, при встрече с которым можно погибнуть. У него так же две стороны. К первому методу относится следующее: при чтении из файла координат объектов для рисования, их координаты заносятся в некоторый массив данных, и при движении объекта его координаты сверяются с координатами в этом массиве, и в соответствии с тем, что соответствует объекту в данном поле, уже выполняются определенные действия. Плюс данного решения в более гибких возможностях, минус в ресурсоемкости обработки алгоритма. Второй способ предполагает создание матрицы поля, тоесть двумерного массива, в которым одним измерением является координата х, а другим у. Поскольку выбирается единый масштаб, то между всеми координатами движений существует закономерность. Найдя эту закономерность можно сверяться с соответствующей ячейкой массива mass[y][x], не находится ли там какой-либо объект, и уже от этого принимать решения. Второй способ немного сложнее для написания, да и вообще для реализации, но имеет свои плюсы в отношении опять же ресурсов.

2. Обоснование выбранных методов и алгоритмов

Для реализации данной программы используются возможности языка «С++», а именно - работа с потоками ввода-вывода, наследование, классы, связные списки, массивы данных, работа со строками… Также не обошлось и без использования средств языка «С» - структуры данных, и других функций из библиотек «С»…

Игровая программа начинает свою реализацию с класса рисования Drawing, основного класса в котором описаны все функции рисования различных объектов, а так же их уничтожения. Так же имеются два класса, которые открытым наследованием получают доступ к графическим функциям класса Drawing. Что значительно уменьшает количество написанного кода, упрощает дальнейшую работу по графическому сопровождению, ведь разработчику не нужно каждый раз описывать рисование определенного объекта, достаточно просто вызвать нужную функцию, передать в нее координаты объекта, дополнительные параметры (при необходимости), и объект уже создастся автоматически, а так же дает возможность повторного использования кода.

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

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

После того как данные считаны начинается сам игровой процесс. При движении объектов вносятся изменения в матрицу игрового поля, для того что бы можно было делать проверку на разрешение хода. Для этого реализован класс Enemy, в котором созданы 2 динамических массива, и одна динамическая переменная. Назначение их в следующем: один динамический массив содержит в себе все координаты х, а второй все координаты у, соответствующего i-го врага, а переменная подсчитывает их общее количество. После чего при вызове функции хода, циклом для каждого врага, анализируя его положение в матрице, создается движение. При движении героя, изначально производится проверка на то, не находится ли на нем враг, а он не двигается, игра продолжается, что является одним из недостатков. Однако при игре, это практически не заметно, так как игрок, пытаясь уйти от врага, постоянно создает движение, а значит и проверку на соответствие позиций, после чего при положительном результате вызывается функция смерти героя, и игра, при условии, что еще есть жизни, возобновляется на текущем уровне. Если врагов на нем нет, то выполняется проверка на соответствие другим объектам, в том числе и повторная проверка на врага, для того чтобы определить что герой будет съеден. В случае если там звездочка, вызывается функция съедения звездочки, очки прибавляются, и игра продолжается в ожидании следующей команды.

Если будет нажата клавиша ESC, то изначально проверяется была ли смена уровня, если уровень старше чем был изначально, то программа предлагает сохраниться, но сохранение происходит с тем учетом, что очки сохраняются те, которые были на момент начала текущего уровня, время же не изменяется, это сделано с той целью, что таблица рекордов сортируется по количеству очков и времени, но ведь количество очков у любого игрока будет одинаковое, так как, не предусмотрены никакие бонусы, поэтому таблица больше имеет смысл сортировки по времени, вот время и не изменяется. Игроку предлагается таблица с 10-ю позициями для сохранения. Игрок, нажимая клавиши перехода, вверх, вниз может свободно выбрать любую ячейку для сохранения своей игры. После нажатия клавиши «Enter» программа спросит имя для сохраняемой игры, после чего произойдет запись в файл. Если же игрок не хочет сохраняться, он просто нажимает клавишу «Esc». Возобновить игру можно из меню игры «Load game», таким же образом, просто выбирая свою игру указательными клавишами. В случае если игрок попытается загрузить пустую ячейку, он просто опять окажется в главном меню.

Если игрок прошел последний 10-й уровень, то вызывается функция highScore(int), которая вызывается с параметром 1, что означает что должно выполниться следующее:

Появится поздравительное окно с предложением ввести свое имя, для того, что бы попасть в таблицу рекордов. После того как игрок ввел свое имя, создается очередь, которая читает данные из отдельно отведенного файла, при условии что данные не равны нулю, после чего добавляет в текущую очередь данные о текущем пользователе, сортирует очередь, и записывает только 14 записей (если их больше 14) в файл. Таким образом, наибольшее время просто удаляется из фала, и данные занимают свои надлежащие места.

Если игрок в главном меню выбирает «High scores», то вызывается все та же функция, но с передаваемым ей параметром 0, что говорит ей о том, что она должна просто отобразить данные содержащиеся в файле. Данные из файла в красивом структурированном виде отображаются на экране в таблице рекордов.

При выборе пункта меню «New game», игроку даются все начальные данные, а именно время равно 0, очки равны 0, жизни равны 3, и текущий уровень 1. Далее игрок очищая поле от звезд, зарабатывает тем самым очки и просто проходит один за другим уровни.

Соседние файлы в папке pacman