МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
ХАРЬКОВСКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ
РАДИОЭЛЕКТРОНИКИ
Кафедра искусственного интеллекта
Пояснительная записка
К курсовой работе по дисциплине:
«Объектно-ориентированное программирование»
Тема:
«Сапер»
Выполнил:
ст. гр.
Проверил:
Комиссия:
Работазащищена с оценкой:
Харьков 2007
/>/>/>РЕФЕРАТ
Пояснительная записка к курсовой работе содержит: 46 стр., 5рисунков
Предмет исследования – современные методы разработкипрограмм таких, как объектно-ориентированное программирование и визуальное проектирование,а также структурное и модульное программирование.
Цель курсовой работы – систематизация, углубление и активноеприменение знаний по системному программированию, закрепление знаний, полученныхв лекционном курсе, а также на практических и лабораторных занятиях.
Метод исследования – изучение литературы, составление иотладка программ на компьютере.
Данная программа используется для интересного проведениявремени за игрой, которая требует развитого логического мышления. Разработан проект«Сапер» соответствующий условию задания и имеющий удобный интерфейс.
Программа разработана в среде Visual studio 2005.
КЛЮЧЕВЫЕ СЛОВА: VISUAL, ФУНКЦИЯ,ПРОЕКТ, ПРОГРАММА, САПЕР, БОМБА, ЯЧЕЙКА
/>СОДЕРЖАНИЕ
ВВЕДЕНИЕ… 4
1. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ… 6
2. ПОСТАНОВКА ЗАДАЧИ… 6
3 ПРОЕКТИРОВАНИЕ СИСТЕМЫ… 9
4. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ… 11
ВЫВОДЫ… 11
ПЕРЕЧЕНЬ ССЫЛОК… 12
ПРИЛОЖЕНИя… 13
/>/>/>/>ВВЕДЕНИЕ
C++ — универсальный язык программирования, задуманный так,чтобы сделать программирование более приятным для серьезного программиста. Заисключением второстепенных деталей C++ является надмножеством языкапрограммирования C. Помимо возможностей, которые дает C, C++ предоставляетгибкие и эффективные средства определения новых типов. Используя определенияновых типов, точно отвечающих концепциям приложения, программист можетразделять разрабатываемую программу на легко поддающиеся контролю части. Такойметод построения программ часто называют абстракцией данных. Информация о типахсодержится в некоторых объектах типов, определенных пользователем. Такиеобъекты просты и надежны в использовании в тех ситуациях, когда их тип нельзяустановить на стадии компиляции. Программирование с применением таких объектовчасто называют объектно-ориентированным. При правильном использовании этотметод дает более короткие, проще понимаемые и легче контролируемые программы.
Ключевым понятием C++ является класс. Класс — это тип,определяемый пользователем. Классы обеспечивают скрытие данных, гарантированнуюинициализацию данных, неявное преобразование типов для типов, определенныхпользователем, динамическое задание типа, контролируемое пользователемуправление памятью и механизмы перегрузки операций. C++ предоставляет гораздолучшие, чем в C, средства выражения модульности программы и проверки типов. Вязыке есть также усовершенствования, не связанные непосредственно с классами,включающие в себя символические константы, inline — подстановку функций,параметры функции по умолчанию, перегруженные имена функций, операцииуправления свободной памятью и ссылочный тип. В C++ сохранены возможности языкаC по работе с основными объектами аппаратного обеспечения (биты, байты, слова,адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемыепользователем.
C++ и его стандартные библиотеки спроектированы так, чтобыобеспечивать переносимость. Имеющаяся на текущий момент реализация языка будетидти в большинстве систем, поддерживающих C. Из C++ программ можно использоватьC библиотеки, и с C++ можно использовать большую часть инструментальныхсредств, поддерживающих программирование на C.
1. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ
Сапер представляет собой логическую игру, основной целью которойявляется нахождения всех спрятанных бомб на минном поле. Ваша задача открытьвсе ячейки поля, не содержащие бомб, заблокировав(пометив) при этом ячейки, вкоторых расположены бомбы.
Поле игры задано в виде двухмерного массива. В этом массиверасположены ячейки. Изначально они все закрыты. Ячейки могут быть пустые, сцифрами и с бомбами. Для каждой такой ячейки мы задаем класс. При нажатии левойклавиши мыши открывается ячейка, при нажатии правой кнопки, выставляетсяфлажок, при этом левой кнопкой мыши вы уже не можете нажать на заблокированнуюячейку, но правой кнопкой можно снять пометку флажка. Ячейка с цифройобозначает то, сколько мин находится в округе этой ячейки. При первом нажатиикнопки мыши на ячейку не может открыться ячейка с бомбой.
Игра считается проигранной, если вы открыли ячейку с бомбой.
Игра считается выигранной, если на игровом поле все ячейки сбомбами отмечены и все остальные ячейки – открыты. />/>/>/>2.ПОСТАНОВКА ЗАДАЧИ
Алгоритм программы включает в себя:
случайную расстановку бомб по полю (функция Rand())
int tmp = GetBombsCount();
int tmp_cs = 0;
int tmp_rs = 0;
while(tmp! = 0)
{
tmp_cs = rand()% GetCols();
tmp_rs = rand()% GetRows();
if (field [tmp_cs] [tmp_rs]. GetPointer()== NULL)
{
tmp--;
field [tmp_cs] [tmp_rs]. SetPointer(newCMyCellBomb(tmp_cs, tmp_rs, CLOSED));
}
else
continue;
}
подсчет для каждой ячейки количества бомб вокруг нее
int value = 0;
if (CheckCell(i, j — 1))
if (GetCellByIndex(i, j — 1)! = NULL&& GetCellByIndex(i, j — 1) — >isBomb())
value++;
if (CheckCell(i — 1, j — 1))
if (GetCellByIndex(i — 1, j — 1)! = NULL&& GetCellByIndex(i — 1, j — 1) — >isBomb())
value++;
if (CheckCell(i — 1, j))
if (GetCellByIndex(i — 1, j)! = NULL&& GetCellByIndex(i — 1, j) — >isBomb())
value++;
if (CheckCell(i — 1, j + 1))
if (GetCellByIndex(i — 1, j + 1)! = NULL&& GetCellByIndex(i — 1, j + 1) — >isBomb())
value++;
if (CheckCell(i, j + 1))
if (GetCellByIndex(i, j + 1)! = NULL&& GetCellByIndex(i, j + 1) — >isBomb())
value++;
if (CheckCell(i + 1, j + 1))
if (GetCellByIndex(i + 1, j + 1)! = NULL&& GetCellByIndex(i + 1, j + 1) — >isBomb())
value++;
if (CheckCell(i + 1, j))
if (GetCellByIndex(i + 1, j)! = NULL&& GetCellByIndex(i + 1, j) — >isBomb())
value++;
if (CheckCell(i + 1, j — 1))
if (GetCellByIndex(i + 1, j — 1)! = NULL&& GetCellByIndex(i + 1, j — 1) — >isBomb())
value++;
return value;
возможность регулирования размеров поля, количества бомб
метод раскрытия пустых клеток (без бомб и цифр)
if (! CheckCell(i, j))
return;
if (GetCellByIndex(i, j) == NULL)
return;
if (GetCellByIndex(i, j) — >isBomb())
return;
else
if (countItter! = 0 &&(GetCellByIndex(i, j) — >GetState() == OPENED ||
GetCellByIndex(i, j) — >GetState() ==BLOCK))
return;
GetCellByIndex(i, j) — >SetState(OPENED);
countItter++;
// Обходим все соседние ячейки что бы их открыть
if (((CMyCellWob *) GetCellByIndex(i, j)) — >GetValue() == 0)
{
OpenNullValues(i, j — 1);
OpenNullValues(i — 1, j — 1);
OpenNullValues(i — 1, j);
OpenNullValues(i — 1, j + 1);
OpenNullValues(i, j + 1);
OpenNullValues(i + 1, j + 1);
OpenNullValues(i + 1, j);
OpenNullValues(i + 1, j — 1);
}3 ПРОЕКТИРОВАНИЕ СИСТЕМЫ
CmyCell – базовый абстрактный класс,хранит положение и состояние ячейки, выполняет необходимые ячейке действия,виртуальные функции предопределяются далее в производных классах.
GetX() – взятиеположения по X
GetY() – взятиеположения по Y
GetState() – взятиесостояния ячейки
SetX() – установкаположения по X
SetY() – установка положения по Y
SetState() – установка состоянияячейки
HitToPoint() – попадание по ячейке
DrawClosedCell() – прорисовказакрытой ячейки
DrawBlockedCell() – прорисовказаблокированной ячейки
Draw() – прорисовка ячеек
Click() – щелчок по ячейке
IsBomb() – проверяет на наличие вячейке бомбы
CmyCellBomb – класс, ячейка сбомбой, наследуется от базового класса – ячейки. Переопределяет функцииРисовать, Кликать, проверку на занятость ячейки бомбой.
CMyCellWOB – класс, ячейка безбомбы, наследуется от ячейки.
SetValue() – устанавливаетколичество бомб вокруг ячейки
GetValue() – взятие кол-ва бомбвокруг ячейки
CPMyCell – «умный»указатель на класс ячейки. Включает в себя указательно класс CmyCell.
CmyField – класс поля, наследуетсяот класса CPMyCell, генерирует расположение бомб, обрабатываетнажатие события, рисует, осуществляет все действия, что нужны для самой игры.
GetCols() – взятие количествастолбцов
GetRows() – взятие количества строк
GetBombsCount() – взятие количествабомб
GetFindBombsCount() – взятиеколичества найденных бомб
SetBombsCount() – установкаколичества бомб
SetFindBombsCount() – определениеколичества найденных бомб
GetCellByIndex() – нахождение ячейкипо индексу
SetCellByIndex() – установка ячейкипо индексу
Init() – инициализация итерации
ReInit() – повторная инициализация
DeInit() – завершение инициализации
OpenAll() – открытие ячеек
TestOnWin() – проверка на выигрыш
CalcValueForCell() – подсчетколичества бомб вокруг ячейки
CheckCell() – проверка на наличиеячейки
OpenNullValues() – открытие пустыхячеек
IncFindBombs() – увеличениеколичества найденных бомб
DecFindBombs() — уменьшениенайденных бомб4. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
Интерфейс программы был создан с помощью стандартнойбиблиотеки MFC.
При запуске программы, вы можете установить количество бомб,количество строк и столбцов. После этого нажимаете на кнопку Начать.
См. Приложение3. (Рис.1)
Далее вы щелкаете на ячейку, чтобы открыть ее, гдепредположительно нет бомбы.
См. Приложение 3. (Рис.2)
Путем дальнейших размышлений, вы щелкаете правой кнопкоймышки на ячейках, где должны располагаться бомбы. Количество бомб вокруг ячейкинаписано на самой ячейке.
См. Приложение 3. (Рис.3)
Проигрыш или выигрыш определяются в зависимости от того, всели бомбы отмечены и все ли поля без бомб раскрыты, если вы попадаете на ячейкус бомбой, вы проиграли.
См. Приложение 3. (Рис.4,5) ВЫВОДЫ
В ходе выполнения данного курсового проекта были разработанапрограмма на языке высокого уровня Visual C++. А также изучены возможностиданного языка.
Систематизированы и закреплены практические навыкииспользования ЭВМ, программного обеспечения, существующих средств обслуживаниясистемных программистов, а также теоретические знания по основным разделамкурса «Объектно-ориентированное программирование». Основное вниманиеуделено изучению современных операционных систем, способов проектированияприложений, объектно-ориентированному и системному программированию.
При выполнении курсового проекта произведено знакомство среферативными журналами и другими информационными источниками по объектно-ориентированномуи системному программированию с целью анализа состояния решаемой задачи.
Получены практические навыки работы в среде Microsoft Visual Studio. ПЕРЕЧЕНЬ ССЫЛОК
1. Бондаренко М.Ф., Бритик В.И., Свинар М.К. Конспектлекций. Часть I «Алгоритмические языки ипрограммирование». «Компания СМИТ» – Харьков, 2004. -221 с.
2. Павловская Т.А. С/С++ программирование на языке высокогоуровня. «Питер» – Санкт Петербург, 2002. -460 с.
3. Ричард С. Линкер, Том Арчер. Программирование для Windows 98. Библия разработчика. “Диалектика ” – Москва,1999. -864 с.: ил. — Парал. тит. англ. Уч. пос.
4. Джесс Либерти. С++ за 21 день. ”Вильямс” – Москва, 2000.-816 с.: ил. — Парал. тит. англ.