Задание7_Сапер_ч1 (Лабораторная работа №7)

2018-01-10СтудИзба

Описание файла

Файл "Задание7_Сапер_ч1" внутри архива находится в следующих папках: Лабораторная работа №7, 7. Документ из архива "Лабораторная работа №7", который расположен в категории "". Всё это находится в предмете "вычислительный практикум" из 3 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "вычислительный практикум" в общих файлах.

Онлайн просмотр документа "Задание7_Сапер_ч1"

Текст из документа "Задание7_Сапер_ч1"

Задание 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, которая показывает все мины, в том числе и те, которые игрок не успел найти.

Шаги разработки программы:

  1. разработка формы;

  2. разработка процедуры NewGame();

  3. разработка процедур Mina() и Flag();

  4. процедуры обработки событий Form1Create и N1Click;

  5. разработка процедуры Kletka();

  6. разработка процедуры ShowPole();

  7. разработка итерационной процедуры Open();

  8. разработка процедуры обработки события OnMouseDown на поверхности игрового поля;

  9. комплексная отладка программы;

  10. тестирование и исправление обнаруженных ошибок.

Шаг 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; // кол-во мин в соседних клетках

Описание алгоритма:

  1. очистить элементы массива, соответствующие клеткам игрового поля;

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

  3. расставить NM мин, используя для задания координат клетки, в которую ставится мина, ГСЧ и «заполнить минами» массив Pole;

  4. для каждой клетки вычислить количество мин в соседних клетках и сохранить эти значения в массиве Pole;

  5. установить начальные значения глобальных переменных
    status := 0; // начало игры

nMin := 0; // нет обнаруженных мин

nFlag := 0; // нет поставленных флагов

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5250
Авторов
на СтудИзбе
422
Средний доход
с одного платного файла
Обучение Подробнее