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

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

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

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

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

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

Задание 7, часть 2

Игра Сапер

В этой части работы Вы завершите разработку программы «Игра Сапер», написав процедуры вывода изображения клеток минного поля и процедуру обработки события OnMouseDown.

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

В процессе игры игрок делает шаг по минному полю, открывая указанную курсором мыши клетку. С клеткой игрового поля, стоящей на пересечении i-го ряда и j-ой колонки, мы связали элемент массива Pole[i][j], который хранит ее состояние, определяемое начальным значением и действиями игрока. По ходу игры может открываться одна клетка, все поле или группа соседних клеток, в которых нет мин. В этой ситуации наиболее естественно сделать универсальную процедуру для вывода изображения одной клетки и процедуры, которые вызывают ее для изображения всего поля или группы клеток.

Для вывода изображения отдельной клетки разработаем процедуру Kletka(), для вывода изображения всего поля – процедуру ShowPole(), а для вывода изображения указанного пустого поля и всех соседних полей, в которых нет мин - процедуру Open().Управление выводом изображений клеток в процессе игры будет выполнять процедура обработки события OnMouseDown.

После того как процедура NewGame() расставит мины, процедура ShowPole() выводит изображение всего игрового поля последовательно, клетка за клеткой. Процедура ShowPole() вызывается по событию FormCreate в начале игры и по событию MouseDown в процессе игры при успешном завершении игры или подрыве на мине (нажата левая кнопка мыши на поле, в котором есть мина).

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

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

Все действия игрока должны фиксироваться в массиве Pole.

Шаг 4. Процедуры обработки событий Form1Create и N1Click.

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

Процедура обработки события Form1Create должна вызывать процедуру NewGame() и устанавливать размеры поля (свойства Form1.ClientHeight и Form1.ClientWidth) в соответствии с количеством клеток игрового поля и размером клетки.

Процедура обработки события N1Click (выбор меню Новая игра) должна вызывать процедуры NewGame() и ShowPole().

На этапе отладки вместо ShowPole() можно вызывать процедуру Kletka() и выводить содержимое отдельной клетки, а не всего поля. Для удобства отладки расстановку мин в процедуре NewGame() следует выполнять вручную (без использования ГСЧ), уменьшив число расставляемых мин.

Шаг 5. Процедура Kletka().

Процедура Kletka() используется для вывода изображения поля в начале игры, во время игры и в ее конце. В начале игры (значение параметра status = 0) процедура выводит только пустые клетки, во время игры (значение параметра status = 1) - количество мин в соседних клетках или флажок, а в конце отображает исходное состояние клетки и действия поль­зователя. Информацию о фазе игры процедура Kletka() получает через пара­метр status, а положение клетки на игровом поле определяется параметрами row и col.

Вывод изображений выполняется с помощью метода Canvas.Rectangl. Неоткрытые клетки отображаются прямоугольниками серого цвета, а открытые – прямоугольниками белого цвета. Клетка, на которой сапер подорвался – красного цвета.
После вывода прямоугольника на него, если нужно, накладывается изображение мины, флага или числа мин в соседних клетках.

Прототип процедуры:

Procedure Kletka(Canvas:TCanvas; row,col,status: integer);

Вызов процедуры: Kletka(Canvas, row, col, status);

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

  1. преобразовать значения параметров row и col в координаты области вывода;

  2. если status=0, то вывести контур клетки (метод Canvas.Rectangle), закрасить ее серым цветом и выйти из процедуры;

  3. если Pole[row][col] < 100 (клетка не открыта), то вывести серую клетку;

  4. если Pole[row][col] < 100 and status=2, то показать мину (если она есть) и выйти из процедуры;

  5. если клетка открыта и в ней нет мины, (Pole[row][col] >= 100 and Pole[row][col] < 109), то закрасить ее белым цветом, вывести число мин в соседних клетках с помощью метода Canvas.TextOut (если Pole[row][col]=100, то ничего не выводить) и выйти из процедуры;

  6. если Pole[row][col] >= 200, то показать флаг;

  7. если Pole[row][col] = 109, то изобразить красный прямоугольник (на этой мине подорвались).

Шаг 6. Процедура ShowPole().

Процедура ShowPole() выводит изображение всего игрового поля последовательно, клетка за клеткой. Вывод изображения отдельной клетки выполняет процедура Kletka(Canvas, row, col, status). Прототип процедуры:

Procedure ShowPole (Canvas:TCanvas, status: integer);

Вызов процедуры: ShowPole (Form1.Canvas, status);

Шаг 7. Процедура Open().

Процедура Open() вызывается при нажатии на левую кнопку мыши на клетке, в которой нет мины и которая не граничит с миной. Эта процедура должна вызывать процедуру Kletka() для открытия указанной и всех соседних пустых клеток (и так для всех «соседних клеток») а также клеток, ограничивающих «пустую» область. В пограничных клетках мин нет, но они граничат с минами.

Так как здесь при открытии пустых клеток явно присутствует рекурсия, то процедуру Open() естественно сделать рекурсивной. Так как число клеток ограничено размерами поля, то переполнения стека не будет. Краткие рекомендации по разработке рекурсивных процедур приведены ниже. (В процедуре Open() открытие пустой клетки – рекурсивное утверждение, а открытие пограничной клетки – базисное.)

Прототип процедуры:

Procedure Open(row,col: integer);

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

1. Если клетка пустая (не граничит с миной) и не открыта, то установить Pole(row,col)=100 и вызвать процедуру Kletka() для ее отображения;

1.1. Вызвать процедуру Open() для всех соседних клеток (открытие смежных пустых клеток – это рекурсивная часть процедуры);

2. Если клетка не пустая (граничит с миной), не открыта и находится не на границе игрового поля (Pole(row,col)<>-3), то установить Pole(row,col)= Pole(row,col)+100 и вызвать процедуру Kletka() для ее отображения (открытие соседних с минами клеток для области, содержащей пустые клетки - это базисная часть процедуры).

Разработка рекурсивных процедур.

В математике строгое определение некоторых понятий может опираться на то же понятие. Такие определения называют рекурсивными или индук­тивными. Например, рекурсивно определяется факториал:

N ! = 1, если N=0;

N*(N-l)!, если N>0.

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

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

Различают два вида рекурсии подпрограмм:

  • прямая или явная рекурсия - характеризуется существованием в теле подпрограммы оператора обращения к самой себе;

  • косвенная или неявная рекурсия - образуется при наличии цепочки вызовов других подпрограмм, которые в конечном итоге приведут к вызову исходной.

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

Фрейм активации включает:

  • копии всех локальных переменных подпрограммы;

  • копии параметров-значений;

  • четырехбайтовые адреса параметров-переменных и параметров-констант;

  • копию строки результата (для функций типа string);

  • служебную информацию - около 12 байт.

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

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



Рис. 1. Состояние стека после 3-го вызова некоторой рекурсивной процедуры.

В случае косвенной рекурсии функция обраща­ется к себе путем вызова другой подпрограммы, которая и содержит обращение к этой функции. Например:

PROCEDURE A ( k : byte );

BEGIN . . .

В(к); //Вызов процедуры В

END;

PROCEDURE В ( N : byte );

BEGIN ... // Косвенная рекурсия

A(N) ; // вызов процедуры А

END);

Однако эта программа не будет работать: она не сможет вызвать из процедуры А процедуру В, так как для этого описание процедуры В должно быть расположено до ее вызова. Чтобы осуществить такой вызов в Delphi (и в Паскале) имеется опережающее описа­ние. Оно состоит в том, что до вызывающей процедуры (в примере это А) дается только заголовок вызываемой процедуры (в примере - B), а вместо тела вызываемой процедуры В пишется ключевое слово FORWARD.

Тот же пример, уточненный в соответствии с приведенными выше пояснениями:

PROCEDURE В ( N : byte ); // - опережающее описание В

FORWARD; // заголовок функции с параметрами, но нет текста процедуры В

PROCEDURE A { k : byte ) ;

BEGIN ...

В(к); // - вызов процедуры В

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