Задание7_Сапер_ч1 (1076724)
Текст из файла
Задание 7, часть 1
Игра Сапер
Всем, кто работает с операционной системой Windows, хорошо знакома игра Сапер. В этой работе вы разработаете аналогичную программу — игру Сапер 2002.
Задачи работы:
- освоение работы с массивами;
- использование графики;
- применение рекурсии;
- использование генератора случайных чисел (ГСЧ);
- использование компонентов MainMenu и StringGrid.
Правила
Игровое поле состоит из клеток, в каждой из которых может быть мина. Задача игрока - найти все мины и пометить их флажками.
Используя кнопки мыши, игрок может открыть клетку или поставить в неe флажок, указав тем самым, что в клетке находится мина. Клетка открывается щелчком левой кнопки мыши, флажок ставится щелчком правой. Если в клетке, которую открыл игрок, есть мина, то происходит взрыв (сапер ошибся, а он, как известно, ошибается только один раз) и игра заканчивается. Если в клетке мины нет, то в этой клетке появляется число, соответствующее количеству мин, находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках, соседних с уже открытыми, игрок может обнаружить и пометить флажками все мины. Ограничений на количество клеток, помеченных флажками, нет. Однако для завершения игры (выигрыша) флажки должны быть установлены только в тех клетках, в которых есть мины. Ошибочно установленный флажок можно убрать, щелкнув правой кнопкой мыши в клетке, в которой он находится.
Рис.1. Окно программы Сапер 2002
Пример окна программы в конце игры, после того как игрок открыл клетку, в которой находится мина, приведен на рис.1.
Представление данных
В программе игровое поле представлено массивом N+2 на М+2, где N*M размер игрового поля. Элементы массива с номерами строк от 1 до N и номерами столбцов от 1 до М соответствуют клеткам игрового поля (рис. 2), первые и последние столбцы и строки соответствуют границе игрового поля.
Рис. 2. Клетке игрового поля соответствует элемент массива
В начале игры каждый элемент массива, соответствующий клеткам игрового поля, может содержать число от 0 до 9. Ноль соответствует пустой клетке, рядом с которой нет мин. Клеткам, в которых нет мин, но рядом с которыми мины есть, соответствуют числа от 1 до 8. Элементы массива, соответствующие клеткам, в которых находятся мины, имеют значение 9. Элементы массива, соответствующие границе поля, содержат -3.
В качестве примера на рис. 3 изображен массив, соответствующий состоянию поля в начале игры.
Рис. 3. Массив в начале игры
В процессе игры состояние игрового поля меняется (игрок открывает клетки и ставит флажки) и, соответственно, меняются значения элементов массива. Если игрок поставил в клетку флажок, то значение соответствующего элемента массива увеличивается на 100. Например, если флажок поставлен правильно в клетку, в которой есть мина, то значение соответствующего элемента массива станет 109. Если флажок поставлен ошибочно, например, в пустую клетку, элемент массива будет содержать число 100. Если игрок открыл клетку, то значение элемента массива увеличивается на 200. Такой способ кодирования позволяет сохранить информацию об исходном состоянии клетки.
Для представления элементов игры в программе будем использовать следующие переменные и процедуры.
const
MR = 10; // кол-во клеток по вертикали
МС =10; // кол-во клеток по горизонтали
NM = 10; // кол-во мин
W =40; // ширина клетки поля
Н =40; // высота клетки поля
var
Pole: array[0..MR+1, 0.. MC+1] of integer; // минное поле. Значение элемента массива:
// 0..8 — количество мин в соседних клетках
// 9 — в клетке мина
// 100..109 — клетка открыта
//200..209 — в клетку поставлен флаг
nMin : integer; // кол-во найденных мин
nFlag : integer; // кол-во поставленных флагов
status : integer; // 0 — начало игры; 1 - игра; 2 - результат
Procedure NewGame(); forward; // генерирует новое поле
Procedure ShowPole(Canvas : TCanvas; status : integer); forward; // Показывает поле
Procedure Kletka(Canvas : TCanvas; row, col, status : integer); forward; // выводит содержимое клетки
Procedure Open(row, col : integer); forward; // открывает текущую и все соседние клетки,
//в которых нет мин
Procedure Mina(Canvas : TCanvas; x, у : integer); forward; // рисует мину
Procedure Flag(Canvas : TCanvas; x, у : integer); forward; // рисует флаг
Разработка программы
Во время игры программа воспринимает нажатия кнопок мыши и, в соответствии с правилами игры, открывает клетки или ставит в клетки флажки.
Основную работу выполняет процедура обработки события OnMouseDown. Сначала процедура преобразует координаты точки, в которой игрок нажал кнопку мыши, в координаты клетки игрового поля. Затем делает необходимые изменения в массиве Pole и, если нажата правая кнопка, рисует в клетке флажок. Если нажата левая кнопка в клетке, в которой нет мины, то эта клетка открывается, на экран выводится ее содержимое. Если нажата левая кнопка в клетке, в которой есть мина, то вызывается процедура ShowPole, которая показывает все мины, в том числе и те, которые игрок не успел найти.
Шаги разработки программы:
-
разработка формы;
-
разработка процедуры NewGame();
-
разработка процедур Mina() и Flag();
-
процедуры обработки событий Form1Create и N1Click;
-
разработка процедуры Kletka();
-
разработка процедуры ShowPole();
-
разработка итерационной процедуры Open();
-
разработка процедуры обработки события OnMouseDown на поверхности игрового поля;
-
комплексная отладка программы;
-
тестирование и исправление обнаруженных ошибок.
Шаг 1. Форма приложения
Главная (стартовая) форма игры Сапер 2002 приведена на рис. 4.
Рис. 4. Главная форма программы Сапер 2002
Следует обратить внимание, что размер формы не соответствует размеру игрового поля. Нужный размер формы будет установлен во время работы программы. Делает это процедура обработки события onFormActivate, которая на основе информации о размере клеток и игрового поля (количестве клеток по вертикали и горизонтали) устанавливает значение свойств ClientHeight и ClientWidth, определяющих размер клиентской области главного окна программы.
Основное окно программы содержит компонент MainMenu1, который представляет собой главное меню программы. Значок компонента MainMenu находится на вкладке Standard (рис. 5).
Рис. 5. Компонент MainMenu
Значок компонента MainMenu можно поместить в любое место формы, так как во время работы программы он не виден. Пункты меню появляются в верхней части формы в результате настройки меню. Для настройки меню используется редактор меню, который запускается двойным щелчком левой кнопкой мыши на значке компонента или выбором из контекстного меню компонента команды Menu Designer. В начале работы над новым меню, сразу после добавления компонента к форме, в окне редактора находится один-единственный прямоугольник — заготовка пункта меню. Чтобы превратить эту заготовку в меню, нужно в окне Object Inspector в поле Caption ввести название меню.
Если перед какой-либо буквой в названии меню ввести знак &, то во время работы программы можно будет активизировать этот пункт меню путем нажатия комбинации клавиши <Alt> и клавиши, соответствующей символу, перед которым стоит знак &. В названии меню эта буква будет подчеркнута.
Чтобы добавить в главное меню элемент, необходимо в окне редактора меню выбрать последний (пустой) элемент меню и ввести название нового пункта.
Чтобы добавить в меню команду, необходимо выбрать пункт меню, в который нужно добавить команду, переместить указатель активного элемента меню в конец списка команд меню и ввести название команды.
На рис. 6. приведено окно редактора меню, в котором находится меню программы Сапер 2002.
После того как будет сформирована структура меню, нужно, используя окно Object Inspector, выполнить настройку элементов меню (выбрать настраиваемый пункт меню можно в окне формы приложения или из списка объектов в верхней части окна Object Inspector). Каждый элемент меню (пункты и команды) — это объект типа TMenuItem. Свойства объектов TMenuItem (табл. 1) определяют вид меню во время работы программы.
Рис. 6. Структура меню программы Сапер 2002
Таблица 1. Свойства объекта TMenuItem
Свойство Определяет
N ame Имя элемента меню. Используется для доступа к свойствам
Caption Название меню или команды
Bitmap Значок, который отображается слева от названия элемента меню
Enabled Признак доступности элемента меню. Если значение свойства равно False,
то элемент меню недоступен, при этом название меню отображается серым цветом
П ри выборе во время работы программы элемента меню происходит событие Click. Чтобы создать процедуру обработки этого события, нужно в окне формы выбрать пункт меню и щелкнуть левой кнопкой мыши — Delphi создаст шаблон процедуры обработки этого события.
Шаг 2. Процедура NewGame ()
В начале игры нужно расставить мины, затем для каждой клетки поля подсчитать, сколько мин находится в соседних клетках. Процедура NewGame () решает эту задачу, заполняя массив Pole [0..MR+1, 0.. MC+1] - минное поле. Значение элемента массива:
0..8 — количество мин в соседних клетках
9 — в клетке мина.
Представление данных задачи:
row,col : integer; // координаты клетки (индексы массива)
n : integer; // количество поставленных мин
k : integer; // кол-во мин в соседних клетках
Описание алгоритма:
-
очистить элементы массива, соответствующие клеткам игрового поля;
-
В неотображаемые элементы массива, которые соответствуют клеткам по границе игрового поля, записать число -3. Это значение используется функцией Open для завершения рекурсивного процесса открытия соседних пустых клеток.
-
расставить NM мин, используя для задания координат клетки, в которую ставится мина, ГСЧ и «заполнить минами» массив Pole;
-
для каждой клетки вычислить количество мин в соседних клетках и сохранить эти значения в массиве Pole;
-
установить начальные значения глобальных переменных
status := 0; // начало игры
nMin := 0; // нет обнаруженных мин
nFlag := 0; // нет поставленных флагов
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.