83066

Разработка игры Сапёр

Курсовая

Информатика, кибернетика и программирование

В данной работе реализованы многие технологии и решены проблемы, с которыми придётся столкнуться программистам при разработке программ в реальной жизни, такие как создание окна и его элементов, обработка сообщений Windows, рисование изображений, работа с системным реестром, использование ресурсов.

Русский

2015-03-07

70.5 KB

25 чел.

3

РЕФЕРАТ

Пояснительная записка к данной работе содержит 20 страницы,

1 приложение, 1 таблица, 1 рисунок.

Объект исследования – найти эффективный способ изображения интерфейса программы и алгоритм игры Сапёр.

Цель - разработать игру Сапёр.

Метод исследования – в данной программе применяются Win32 API.

Результат – создана игра Сапёр с расширенными возможностями для настройки сложности игры.

СОДЕРЖАНИЕ

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

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ…………………………………………………………………… 5

ОПИСАНИЕ ПРОГРАММЫ………………………………………………………………….. 11

1 ПРАВИЛА И ЦЕЛЬ ИГРЫ.........….………………………………………………… 11

2 РАБОТА ПРОГРАММЫ…..…..……………………………………………………. 11

   3 ИНТЕРФЕЙС ПРОГРАММЫ………….…………………………………………… 11

4 РЕСУРСЫ…………………………………………….……………………………… 12

5 ХОД СОЗДАНИЯ ПРОЕКТА…………………………………………………….… 13

6 СТРУКТУРА ПРОГРАММЫ..............................................................................…… 14

6.1 СТРУКТУРЫ И КЛАССЫ………………………………………………… 14

6.2 КОНСТАНТЫ………………………………………………………………. 16

6.3 ФУНКЦИИ ПРОГРАММЫ……………………………………………….. 17

6.4 РАБОТА ФУНКЦИЙ………………………………………………………. 18

7 ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ………………………………………… 18

8 СИСТЕМНЫЕ ТРЕБОВАНИЯ……………………………………………………… 18

ВЫВОДЫ.……………………………………………………………………………………… 19

ПЕРЕЧЕНЬ ССЫЛОК……………………………..………………………………….………. 20

ПРИЛОЖЕНИЕ А: Исходный текст программы ………………………………..…………. 21

ВВЕДЕНИЕ

 Данная работа является реализацией логической игры Сапёр. Данное приложение было названо Mines (в переводе с англ. - мины). Программа выполнена на объектно-ориентированном языке программирования C++ в среде разработки Microsoft Visual C++ 6.0, является высокоэффективной, компактной и быстрой. Mines также не требователен к системным ресурсам и работает под любой версией Windows начиная с Windows 95.

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

В эру высоких технологий игры стали развиваться ещё интенсивнее. Появление персональных компьютеров позволило автоматизировать большинство игр и создать реалистичные симуляторы. Сейчас уже никого не удивишь возможностью при помощи компьютера вместе с другими людьми проехаться на Формуле 1, принять участие в боевых действиях. Есть также игры, развивающие логическое мышление. Именно такой игрой является Сапёр.

Игра Сапёр очень популярна и в данный момент существует много версий этой игры, написанных на разных языках программирования начиная от ассемблера и заканчивая Java. Есть также версии для  разных операционных систем, а также для Internet и мобильных телефонов.

В данной работе реализованы многие технологии и решены проблемы, с которыми придётся столкнуться программистам при разработке программ в реальной жизни, такие как создание окна и его элементов, обработка сообщений Windows, рисование изображений, работа с системным реестром, использование ресурсов. Применено большое количество возможностей, которые предоставляет такой богатый язык как C++.

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

 При проектировании данной работы стал вопрос о методе реализации программы. Необходимо было выбрать, гибкий язык программирования, который бы предоставлял необходимые возможности для быстрого создания игры Сапёр, и в то же время достаточно эффективный, чтобы писать быстрые программы. Так как C++ полностью удовлетворяет этим требованиям, и был мною изучен более полно, чем Pascal и ассемблер, я выбрал именно его. Теперь рассмотрим чем же привлекателен C++.

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

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

В C++ сохранены возможности языка C по  работе с основными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемые пользователем.

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

После выбора языка программирования необходимо было выбрать среду разработки, в которой он был бы наиболее полно и эффективно реализован и предоставляющую необходимые средства для быстрого написания программного кода, эффективной компиляции и компоновки и удобного программирования приложений под Windows. В наибольшей степени этим требованиям удовлетворяют Microsoft Visual C++ и Borland C++ Builder. Рассмотрим некоторые особенности этих компиляторов.

В Microsoft Visual C++  можно строить обычные программы на С++, создавать статические и динамические библиотеки, но основным режимом работы является создание Windows-приложений с помощью инструмента AppWizard (Application Wizard - мастер приложений) и библиотеки базовых классов MFC (Microsoft Foundation Class Library). Такие приложения часто называют MFC-приложениями. Главная особенность этих Windows-приложений состоит в том, что они работают как совокупность взаимодействующих объектов, классы которых определены библиотекой MFC.

В состав компилятора Microsoft Visual C++ встроены средства, позволяющие программисту облегчить разработку приложений. В первую очередь к ним относятся MFC AppWisard, ClassWizard и редактор ресурсов.

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

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

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

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

C++ Builder – продукт компании Borland, представляющий собой так называемое средство RAD (средство быстрой разработки приложений), позволяющее в короткие сроки создавать программы для Windows на языке C++. В основе программирования на C++ Builder лежит библиотека VCL (библиотека визуальных компонентов), написанная на Object Pascal. Она содержит большое количество классов разного назначения, которые инкапсулируют работу программного интерфейса и поднимают программирование приложений на более высокий уровень абстракции.

Borland C++ Builder обеспечивает быстрое создание интерфейса программы и возможность легко вносить в него изменения даже на заключительных этапах проектирования приложений. Всё это создаёт благоприятные условия для создания Windows-приложений.

Реализация языка C++ в Borland C++ Builder отличается от принятых стандартов и включает в себя некоторые модификации и дополнения. Это в основном связано с компонентно-ориентированным принципом создания приложений (“перетаскивание” элементов управления прямо на форму).

Как видно, фундаментальные основы, заложенные в Microsoft Visual C++ и Borland C++ Builder, несколько отличаются, что даёт повод для размышлений над эффективностью данных компиляторов и того, насколько каждый из них подходит для реализации именно такой игры, как Сапёр. Хотя я имею необходимые навыки работы в Borland C++ Builder, после некоторых размышлений и опытов я пришел к выводу, что Visual C++ 6.0 - наиболее подходящая среда разработки для создания данной программы. Вот те причины, которые определили мой выбор.

  1.  Microsoft Visual C++ не использует те расширения языка C++, которые введены в C++ Builder и максимально соответствует стандартам, принятым для языка C++.
  2.  Алгоритм компиляции в Microsoft Visual C++  6.0 эффективнее чем в Borland C++ Builder 5.0, о чём можно судить по размеру и работе программ (при соответствии программного кода, настроек компилятора и других условий), во всяком случае при создании небольших приложений для Windows.
  3.  Алгоритм анализа программного кода также более совершенен в Microsoft Visual C++ 6.0 и компиляция программ происходит намного быстрее.
  4.  Игра Сапёр не содержит сложных элементов интерфейса, и поэтому нет необходимости в использовании таких мощных средств, как компоненты.
  5.  Большинство профессиональных программистов используют        Visual C++ и, безусловно, опыт, полученный при написании программ в этой среде разработки, благоприятно скажется на моём дальнейшем изучении программирования.

Я хочу подчеркнуть, что не говорю о полном превосходстве Microsoft Visual C++ или о том, что всегда стоит использовать только его. Просто для реализации именно этой программы он, по моему мнению, наиболее подходит.

Далее нужно было выбрать способ реализации данного проекта, а именно какие средства и библиотеки использовать. В большинстве приложений, которые создаются с помощью Microsoft Visual C++, используется MFC (Microsoft Foundation Classes - Базовые Классы Microsoft).

Библиотека MFC была разработана фирмой Microsoft для облегчения программирования Windows-приложений и впервые была представлена на рынке в 1992 г вместе с компилятором Microsoft C++ 7.0. Сейчас она представляет собой мощный набор классов C++, которые позволяют программировать приложения Windows 95,98/NT на достаточно высоком уровне абстракции, и вместе с тем открывают для опытных программистов легкий доступ к функциям более низкого уровня, что позволяет писать эффективные приложения и полностью использовать все возможности операционной системы.

MFC является альтернативой системам визуального программирования, таким как Delphi или Visual Basic, предназначенной для опытных программистов. На сегодняшний день подавляющее большинство программ разрабатывается при помощи Microsoft Visual С++ и MFC. MFC - это стандарт программирования под Windows и интернациональный язык общения. Такая ситуация объясняется многими причинами. В частности, только MFC позволяет создавать наиболее эффективные и устойчивые приложения, которые будут корректно вести себя не только в системе разработчика, но и в системах реальных пользователей. Также очень важно, что MFC поддерживает все современные технологии, реализованные в Windows, и при дополнении Windows почти сразу же дополняется и MFC.

MFC - это инструмент для программирования сложных приложений, от которых требуется высокая эффективность и надежность. MFC поощряет использование объектно-ориентированного программирования, что дает ощутимые преимущества при решении сложных (не с точки зрения только интерфейса пользователя) задач, по сравнению с компонентно-ориентированным подходом, применяемым в системах RAD (быстрой разработки приложений). Разрабатывая приложение в системе RAD, программист часто вообще не использует ООП, по крайней мере, в явном виде, до тех пор, пока не соберется разработать собственный компонент. Это негативно сказывается на возможности последующего расширения возможностей. Тем не менее, не стоит воспринимать сказанное как критику систем RAD. Есть много классов приложений (например, базы данных), которые разумнее всего разрабатывать именно при помощи систем RAD, что и делают даже опытные программисты.

Несмотря на всю замечательность библиотеки MFC, программа Mines это ещё не тот уровень, где она дала бы ощутимые плоды. А ради использования MFC придётся пожертвовать килобайтами размера программы. Поэтому было принято решение о написании программы Mines только с использованием Windows API. Были также использованы функции для работы со строками из библиотеки stdio. Это сделало программу эффективной и компактной.

При разработке Windows-приложений доступ к системным ресурсам осуществляется через целый ряд системных функций. Совокупность таких функций называется прикладным программным интерфейсом, или API (Application Programming Interface). Для взаимодействия с Windows приложение запрашивает функции API, с помощью которых реализуются все необходимые системные действия, такие как выделение памяти, вывод на экран, создание окон и т.п.

Функции API содержатся в библиотеках динамической загрузки (Dynamic Link Libraries, или DLL), которые загружаются в память только в тот момент, когда к ним происходит обращение, т.е. при выполнении программы. Рассмотрим, как осуществляется механизм динамической загрузки.

Динамическая загрузка обеспечивает ряд существенных преимуществ. Во-первых, поскольку практически все программы используют API-функции, то благодаря DLL-библиотекам существенно экономится дисковое пространство, которое в противном случае занималось бы большим количеством повторяющегося кода, содержащегося в каждом из исполняемых файлов. Во-вторых, изменения и улучшения в Windows-приложениях сводятся к обновлению только содержимого DLL- библиотек. Уже существующие тексты программ не требуют перекомпиляции.

В настоящее время широко распространены две версии API. Первая называется Win16 и представляет собой 16-разрядную версию, используемую в Windows 3.1. Вторая, 32-разрядная версия, называется Win32 и используется в Windows 95 и Windows NT. Win32 является надмножеством для Win16 (т.е. фактически включает в себя этот интерфейс), так как большинство функций имеет то же название и применяется аналогичным образом. Однако, будучи в принципе похожими, оба интерфейса все же отличаются друг от друга. Win32 поддерживает 32-разрядную линейную адресацию, тогда как Win16 работает только с 16-разрядной сегментированной моделью памяти. Это привело к тому, что некоторые функции были модифицированы таким образом, чтобы принимать 32- разрядные аргументы и возвращать 32-разрядные значения. Часть из них пришлось изменить с учетом 32-разрядной архитектуры. Была реализована поддержка потоковой многозадачности, новых элементов интерфейса и прочих нововведений Windows.

Одним из подмножеств API является GDI (Graphics Device Interface – интерфейс графического устройства). GDI – это та часть Windows, которая обеспечивает поддержку аппаратно-независимой графики. Благодаря функциям GDI Windows-приложение может выполняться на самых различных компьютерах.

Из выше приведённых обоснований становится ясно, что программный интерфейс – прямой путь для написания высокоэффективной программы под Windows. Но просто использование Windows API ещё не гарантия полного успеха, в смысле эффективной работы конкретно программы Mines.

При проектировании программы Mines, была поставлена задача, написать приемлемо быстро работающую программу. Первая попытка реализовать это закончилась неудачей. Ячейки в той версии представляли собой кнопки, которые создавались каждый раз при начале новой игры. Создание кнопки в Windows занимает приемлемый промежуток времени, но создание поля размером, скажем, 20 на 20 кнопок, т.е. всего 400, занимает достаточно ощутимый  интервал времени, который достигает нескольких секунд даже на мощном компьютере. Поэтому необходимо было найти другой способ для изображения ячеек на поле.

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

Для работы с растровыми изображениями используются т. н. списки изображений (Image List) и созданные для них функции Windows API.

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

Win32 API содержит функции для списков изображений, которые позволяют рисовать изображения, создавать и удалять списки, добавлять и удалять изображения, перетаскивать изображения.

Есть два типа списков изображений: незамаскированный и замаскированный. Незамаскированный список изображений состоит из цветного точечного рисунка, который содержит одно или более изображений. Замаскированный список изображения состоит из двух точечных рисунков равного размера. Первый - цветной точечный рисунок, который содержит изображения, и второй - одноцветный точечный рисунок, который содержит ряд масок, каждый для соответствующего изображения в первом точечном рисунке.

Когда незамаскированное изображение выведено, оно просто скопировано в целевой контекст устройства; то есть оно выведено по существующему цвету фона контекста устройства. Когда замаскированное изображение выведено, биты изображения объединены с битами маски, типично производя прозрачные области в точечном рисунке, где цвет фона целевого контекста устройства становится виден. Есть несколько стилей рисунка, которые можно определить при рисовании замаскированного изображения.

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

ОПИСАНИЕ ПРОГРАММЫ

1 Правила и цель игры.

Цель игры состоит в том, чтобы как можно быстрее найти расположение  всех  мин  на  минном  поле,  не  вскрыв  ни  одну  из  них. Это осуществляется  путём  логического  анализа  взаимного  расположения открытых и неоткрытых ячеек  поля  на  основе  их  значений. При  открытии  ячейки  с  миной игрок проигрывает. Вначале игры все ячейки закрыты, и пользователь не видит их. При  открытии  очередной  клетки  на  её  месте  изображается  её  значение. Например, если  это  была мина,  то  будет изображена мина. Если  клетка не является миной, то появится цифра, указывающая, сколько мин находится в восьми  смежных  с  ней  ячейках. Если  вокруг  нет  ни  одной  мины, то эта ячейка  будет  пустой.  При  нажатии  на  такие  ячейки  открываются  все соседние ячейки.

2 Работа программы.

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

3 Интерфейс программы.

Этот пункт содержит описание вида программы, и то, как она взаимодействует с пользователем. Вид программы изображен на рисунке 3.1.

 

Рис. 3.1 Интерфейс программы Mines

Программа  Mines  имеет  графический  интерфейс,  основанный на окнах. Окно имеет заголовок, системное меню, кнопки для закрытия и минимизирования окна и бордюры, делающие вид окна трёхмерным. На форме расположены меню программы, игровое поле, разбитое на клетки, находится в центре, сверху в центре кнопка, отображающая состояние игры, в левом и правом верхних  углах  находятся  счётчики  бомб  и времени соответственно. Размер формы изменяется в соответствии с размером игрового поля.

Меню программы состоит из двух пунктов. Первый («Игра») – выпадающее меню, второй («О Mines…») вызывает диалог о программе. При выборе пункта «Игра» появляется меню, содержащее пункты:

  1.  Новая игра
  2.  Новичок
  3.  Любитель
  4.  Специалист
  5.  Другой…
  6.  Победители…

7. Выход

Выбор пункта «Новая игра» означает создание нового поля мин, следующие четыре  пункта  –  выбор  сложности  игры.  «Новичок»  -  поле  8x8,  99 мин,

«Любитель»  -  16x16x40,  «Специалист» - 16x30x99,  «Другой…»  позволяет настроить  другую  сложность  игры  при  помощи  диалога (поле  от  8x8  до 50x50, число мин от 10 до 255). При выборе пункта «Победители…» появляется диалог, отображающий информацию о лучших результатах в каждой из категорий. При выборе «Выход» программа завершает работу.

Нажатие на кнопку с изображением лица равносильно выбора пункта меню «Новая игра».

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

4 Ресурсы

В этом разделе находится перечень используемых ресурсов (диалоги, меню, растровые изображения и др.) и их описание.

Данный проект содержит в себе некоторые ресурсы, созданные при помощи менеджера ресурсов в Visual C++ 6.0 (файл ресурсов – Resources.rc). Для работы с ресурсами был создан файл-заголовок Resource.h, где находятся константы-идентификаторы ресурсов.

Были использованы следующие ресурсы:

(Тип ресурса – пояснение (константа))

Диалоги – О программе (IDD_ABOUT), Победители (IDD_WINERS), Выбор сложности (IDD_SIZE), Поздравление с лучшим результатом (IDD_BEST);

Растровые изображения

для рисования клеток поля – клетка не открыта (IDB_NORMAL); клетка открыта или нажата (IDB_NONE); мина (IDB_BOMB); мина на которую попал пользователь (IDB_RBOMB); клетка, отмеченная флагом (IDB_FLAG); клетка, отмеченная вопросом (IDB_WHAT1); нажата клетка, отмеченная флагом (IDB_WHAT2); клетка не была миной (IDB_X); изображение значения (от IDB_1 до IDB_8);

для рисования счетчиков – минус (IDB_NUMMIN), цифры (от IDB_NUM0 до IDB_NUM9);

для рисования кнопки с лицом – обычное состояние (IDB_FACENORMAL), кнопка нажата (IDB_FACEDOWN), нажата клетка на поле (IDB_FACEDANGER), игрок проиграл (IDB_FACELOOS), игрок выиграл (IDB_FACEWIN);

Меню – меню программы (IDM_MAINMENU)

пункты меню: Игра (нет), О Mines…(ID_ABOUT), Новичок

(ID_GAME_SMALL), Любитель (ID_FILE_NORMAL), Специалист (ID_GAME_BIG), Другой… (ID_GAME_ANOTHER), Победители… (ID_GAME_WINERS), Выход (ID_GAME_EXIT);

Иконки – главная иконка программы (IDI_MAIN);

Версия (VS_VERSION_INFO).

5 Ход создания проекта

Данная  работа  была  выполнена  на  компиляторе Visual C++ 6.0,  без использования MFC, при помощи стандартных API, за исключением некоторых функций для работы со строками.

Для создания  этой  программы  был  начат  новый  проект  Win32,  в  него были добавлены файлы Mines.cpp и Mines.h, в которых находятся объявление и  реализация класса CMainForm и другие функции, связанные с созданием и использованием оконного интерфейса, а также файлы-заголовки.

Также был создан файл ресурсов, куда были включены все необходимые ресурсы.

После  тщательной  разработки  и  отладки  проект приобрёл тот вид, в котором он находится сейчас.

6 Структура программы

6.1 Структуры и классы

В основе программы Mines лежит класс CMainForm. Ниже приводится краткое описание его свойств и методов, кроме самых очевидных.

Функции, объявленные как public:

int Run(HINSTANCE hInst)

Выполняет подготовку к работе программы. Вызывается вначале программы.

HRESULT WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

Обрабатывает сообщения Windows. Вызывается при получении сообщения.

Свойства и методы, объявленные как private:

void Create()

Создаёт форму и элементы окна. Вызывается из функции Run.

void Destroy()

Освобождает память и завершает программу. Вызывается при закрытии окна.

void MouseDown(int x, int y, int Button)

Нажата кнопка мыши.

void MouseUp(int x, int y, int Button)

Отпущена кнопка мыши.

void MouseMove(int x, int y)

Курсор движется над формой.

x, y – координаты, Button – кнопка (0 – левая, 1 – правая)

void CreatePole(int Width, int Height, int BombCount)

Создаёт сетку ячеек. Вызывается при начале новой игры.

Width – кол-во столбцов, Height – кол-во строк, BombCount – кол-во мин

void GeneratePole()

Присваивает новые значения ячейкам. Вызывается из функции CreatePole.

void OpenCell(int Index)

Путём рекурсии открывает пустые и соседние с ними ячейки. Вызывается при нажатии на пустую ячейку. Начинается открытие с клетки с номером Index.

void DrawCell(int Index)

Перерисовывает клетку с индексом Index.

void DrawFace()

Перерисовывает кнопку с “рожицей”.

void DrawInfo()

Перерисовывает счётчики бомб и времени.

int     СellFromXY(int x, int y)

Определяет индекс ячейки в буфере (результат) по координатам на форме (x, y).

void LoadRes()

Загружает растровые изображения и инициализирует списки рисунков. (ImageList) hImage, hBtnImg и hFaceImg

void PaintPole()

Рисует всё поле целиком, включая счётчики и кнопку.

void LoadSettings()

Загружает из реестра настройки перед стартом программы.

void SaveSettings()

Сохраняет настройки в реестр перед завершением работы.

void EndGame()

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

void Win()

Игрок выиграл. Открыты все клетки поля.

SCell** CellBuf

Массив указателей на ячейки. Описание структуры SCell будет приведено ниже.

int Width 

Количество ячеек на поле по горизонтали.

int Height

Количество ячеек на поле по вертикали.

int BombCount

Количество мин на поле.

int CellLeft

Количество оставшихся ячеек. Уменьшается при открытии очередной ячейки.

HIMAGELIST hImage

Хранит рисунки для изображения ячеек.

HIMAGELIST hFaceImg

Хранит рисунки для изображения кнопки с “рожицей”.

HIMAGELIST hNumImg

Хранит рисунки для изображения счётчиков.

int FaceState

Состояние кнопки с “рожицей” (подробнее см. 6.2 Константы). По сути индекс рисунка в списке рисунков для изображения кнопки с лицом (hFaceImg).

int LastFaceState

Предыдущее состояние кнопки с “рожицей”.

bool Mouse[2]

Нажата/не нажата кнопка мыши (Mouse[0] – левая, Mouse[1] – правая).

bool FaceDown

Нажата или нет кнопка с лицом.

bool Game

Идёт ли игра. Если нет, то игрок не может нажимать ячейки поля. Это происходит после попадания на мину.

int LastIndex

Индекс последней нажатой ячейки.

int TimeValue

Значение счётчика времени.

int BombValue

Значение счётчика мин. Уменьшается при установки флага на ячейке.

bool TimeGo

Включен ли счетчик времени. Счётчик включается после открытия первой ячейки игрового поля.

SBestInfo* Best

Лучшие результаты. Описание структуры SbestInfo приводится ниже.

 Структура SCell создана для хранения свойств каждой ячейки поля.

Массив ячеек CellBuf инициализируется функцией GeneratePole.

int Value

Значение ячейки. -1 – мина, от 0 до 8 – количество мин рядом с ячейкой.

int State

Состояние ячейки в данный момент. По сути, индекс рисунка в списке рисунков для изображения ячеек (hImage). Используется при рисовании клеток и для определения текущего состояния. Может принимать одно из значений CS-констант или непосредственно значение от 1 до 8 (при изображении количества мин по соседству).

bool Closed

Закрыта (true) или нет (false) ячейка. При нажатии ячейка закрывается.

Структура SBestInfo создана для хранения имён и результатов победителей и передачи этой информации в другие функции.

SBestInfo()

Конструктор, устанавливает значения по умолчанию.

int SmallTime, NormalTime, BigTime

Лучшее время среди новичков, любителей и профессионалов соответственно.

char SmallName[15], NormalName[15] и BigName[15]

Имена игроков с лучшими результатами.

6.2 Константы

CS-константы используются для работы с свойством структуры SCell State, а FS-константы для работы с FaceState и LastFaceState. Эти константы соответствуют индексам некоторых рисунков в списках изображений для рисования ячеек и кнопки с лицом. Описание приводится в таблице 6.1. FACEBTN –10 – возвращается функцией CellFromXY, если мышь нажата на кнопке с лицом.

Константа

Значение

Описание

Рисунок

CSNORMAL

0

Ячейка не открыта и не нажата (обычное состояние)

CSBOMB

9

Мина, нарисованная после проигрыша игрока

CSFLAG

10

Ячейка, на которой установлен флаг

CSNONE

11

Открыта пустая или нажатая ячейка

CSRBOMB

12

Мина, на которую попал игрок

CSWHAT1

13

Не нажатая ячейка со знаком вопроса

CSWHAT2

14

Нажата клетка со знаком вопроса

CSX

15

Отмеченная флагом ячейка не была миной

FSDOWN

0

Кнопка нажата

FSNORMAL

1

Обычное состояние

FSDANGER

2

Нажата ячейка

FSLOOS

3

Игрок проиграл

FSWIN

4

Игрок выиграл

Таблица 6.1 - Константы

6.3 Функции программы

Перед более подробным описанием действий, выполняемых функциями, рассмотрим функции, которые не являются методами класса CMainForm, но выполняют много важной работы.

int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

Главная функция приложения. В ней создаётся экземпляр класса CMainForm и вызывается его метод Run.

HRESULT __stdcall MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

Функция, которую вызывает Windows для передачи сообщений главному окну программы. В свою очередь эта функция вызывает метод класса CMainForm WindowProc, который и обрабатывает сообщения.

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

(Имя_функции – диалог, для которого используется эта функция)

DlgSizeProc – изменение размера минного поля, DlgWinersProc – лучшие результаты, DlgBestProc – поздравление с лучшим результатом и просьба ввести своё имя, DlgAboutProc – о программе.

 6.4 Работа функций

Ниже описываются важные моменты работы методов класса CMainForm и других функций программы.

 DlgSizeProc. При получении сообщения WM_INITDIALOG (создание диалога) функция инициализирует элементы диалога значениями, которые ей передаются 4ым параметром (lParam), который сформирован так:

ширина поля (в ячейках) + высота поля + кол-во мин + 0

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

 WindowProc. Сообщение WM_TIMER: увеличивается TimeValue, перерисовываются счётчики, и если время вышло, то игрок проиграл. Если получено сообщение WM_COMMAND, значит, выбран пункт меню и младшее слово lParam – идентификатор этого пункта (см. 4 Ресурсы).

 OpenCell. Циклы проходят все соседние ячейки и если ячейка не открыта и на ней не установлен флаг, то проверяется пустая ли ячейка. Если да, то снова вызывается функция OpenCell, в которую передаётся индекс этой ячейки.  Макрос SAFESET проверяет, существует ли ячейка с координатами x, y, если началом координат считать левую верхнюю ячейку. Если CellLeft равно BombCount это значит, что остались только ячейки с минами.

 CreatePole. Вначале функции проверяется, чтобы размер поля и кол-во мин были в позволенных рамках. Количество мин не может быть больше чем четверть от количества ячеек на поле.

 GeneratePole. Будет или нет ячейка миной, зависит от значения, которое генерирует функция rand(). Но т.к. она генерирует псевдослучайные числа, то перед этим нужно вызвать функцию rand() определённое количество раз, чтобы получать действительно случайные числа. Переменная Value принимает значение от –1 до количества ячеек делённое на количество мин минус 2. Это обеспечивает равномерное распределение мин на поле. В третьем цикле значения (Value) всех ячеек, которые не являются минами, устанавливаются равными количеству мин расположенных рядом с этой ячейкой.

 7 Инструкция по использованию

Программа не требует установки, достаточно скопировать её на жесткий диск компьютера. Для запуска ввести в командной строке Mines.exe, находясь в каталоге, где находится программа, или запустить с помощью любой файловой оболочки.

8 Системные требования

 Процессор Pentium 66Mhz, 16 Mb оперативной памяти, операционная система Windows 95 или выше.

ВЫВОДЫ

При выполнении курсовой роботы была написана программа Mines, удовлетворяющая необходимым требованиям эффективности. При выполнении были приобретены и закреплены знания, полученные при изучении курса "Основы программирования и алгоритмические языки", навыки работы с интегрированной средой программирования Microsoft Visual C++ 6.0, был получен опыт программирование Windows-приложений.

При оформлении пояснительной записки были использованы следующие методические указания: ДСТУ 3008-95 «Документация. Отчеты в сфере науки и техники. Структура и правила оформления» и методические указания по оформлению библиографических ссылок и списков к курсовым, дипломным и научным работам для студентов всех форм обучения и всех специальностей.


 

А также другие работы, которые могут Вас заинтересовать

37036. Дружба в нашем классе 36.5 KB
  Вводная часть Здравствуйте ребята Вы же помните первый классный час который мы у вас проводили На какую тему он был Ответы детей Да ребятаон был про дружбу. Не имей 100 рублей а Старый друг лучше Нет друга – ищи а Друг познаётся А знаете ли вы ещё какиенибудь пословицы о дружбе Ответы детей Молодцы ребята – Считаете ли вы свой класс дружным Ответы детей – Что нужно сделать для того чтобы все в классе жили дружно Ответы детей Ребята для этого нужно уважать и помогать друг другу. одноклассники...
37037. СКАЖИ ТЕЛЕФОНУ ДОВЕРИЯ ДА! 192.5 KB
  Информировать учеников о том для чего предназначен и как работает Телефон доверия 2.Мотивировать обращение за помощью на Телефон доверия в трудных жизненных ситуациях ЗАДАЧИ: 1.Рассказать о Телефоне доверия как о виде психологической помощи 2.
37038. Вред курения 56 KB
  Судья Займите свое место. Итак внимание: суд идет Судья: Начинаем наше судебное заседание. Ввести подсудимую Входит сигарета Судья: У нас присутствуют со стороны защиты: Табак рода многолетних трав из семейства пасленовых. Судья:Не понятно что Владимир Иванович Даль имел в виду.
37039. Думаем о будущем сегодня. Классный час о вреде курения 47 KB
  Откуда же пришла к нам эта напасть Из истории табака О курении табака европейцам стало известно после открытия Америки Христофором Колумбом. привез листья табака из Лиссабона для Екатерины Медичи. Вследствие неумеренного курения табака появились случаи отравления что побудило власти к преследованию курения.
37040. Общение в моей жизни 62.5 KB
  КОНСПЕКТ ЗАЧЕТНОГО ВНЕКЛАССНОГО ВОСПИТАТЕЛЬНОГО МЕРОПРИЯТИЯ Францкевич Алина Алексеевна ФРЯиЛ 4 курс 2 группа Гимназия № 62 7 Г класс Общение в моей жизни Практикум занятие с элементами практических упражнений и последующим их обсуждением; ролевая игра. Цель: дать первоначальное представление о значении общения в жизни человека; воспитать необходимых для жизни в современном социуме качеств личности; охарактеризовать общение как своеобразную деятельность. Задачи: познакомить с различными формами общения; формировать...
37041. Классный час «Правила этикета» 46 KB
  Ход классного часа: Преподаватель:ЗдравствуйтедетиСегодня у нас не обычный внеклассный часа урокигракоторая называется Мастерская этикета. Преподаватель:что нужно сделать перед началом урокавикториныну конечно же разминку. Преподаватель:Хорошоа теперь познакомимся с Нехочухойнашим домовёнкомкоторый ничего не знает об этикетевывешивает на доску изображение толстенького домовенкаименно он поможет нам ответить на этот вопрос Ученикам раздаются карточки с одним словомкоторое содержится в понятии этикет....
37042. Правила дорожного движения 185 KB
  Тема: Правила дорожного движения.Образовательная: формировать представления младших школьников о безопасности дорожного движения; повторить правила движения пешеходов по улице и дороге; 2. Воспитательная: воспитывать уважительное отношение ко всем участникам дорожного движения.
37043. Твоё здоровье и личная гигиена 96 KB
  Ход классного часа: Классный воспитатель: Здоровье – состояние полного физического психического и социального благополучия а не только отсутствие болезни. слайд 4 слайд 5 Личная гигиена – это в том числе: закаливание; гигиена кожи; гигиена зубов и полости рта; гигиена одежды и обуви; подвижный образ жизни. Классный воспитатель: Рассмотри по подробнее каждый пункт личной гигиены слайд 6 Закаливание – это...