Практическая работа delphi_17

Цель: Создадим игру-головоломку с использованием приобретенных знаний.

План разработки программы

Как создать фигуру

Фигура (компонент Shape) может быть одного из шести видов, являющихся вариантами эллипса и прямоугольника. Отсутствуют треугольники, шестнадцатиугольники и т.д. Фигуры часто используются при создании фона или рамок для других компонентов. Например, если за полем ввода данных разместить серый прямоугольник, это придаст полю эффект присутствия у него тени. Можно также создать абсолютно визуальную программу, в которой пользователь будет взаимодействовать с программой, манипулируя фигурами.

Свойства

Самыми важными свойствами компонента Shape являются Shape, Pen и Brush. Свойство Shape определяет, какая именно фигура будет отображена. Комплексное свойство Pen с помощью своих подсвойств Color, Mode, Style и Width устанавливает параметры границы фигуры.

Поместим на форму два компонента Shape. Присвоим их свойству Shape значение stEllipse, a Pen.Width установим в 10. Затем выберем один из компонентов и присвоим его Pen. Style значение psInsideFrame.

Свойство Brush определяет то, как будет заполнена внутренняя часть фигуры. Это также комплексное свойство, имеющее подсвойства Color и Style. Если Style имеет значение bsClear, внутренняя часть фигуры будет пустой; если Style равно bsSolid, внутренняя часть фигуры окажется заполненной цветом Brush. Color. Остальные стили соответствуют различным линиям и штриховкам.

События

Фигура реагирует только на события OnMouseUp, OnMouseDown и OnMouseMove, а также на события, связанные с буксировкой объектов. Создадим графическую программу-головоломку, называющуюся Ханойские башни, реализованную на основе использования фигур, которые буксируются с помощью мыши.

Выберите Environment из меню Options. На странице Preferences, в прямоугольнике Form Designer, поместите х рядом с Display Grid и Snap to Grid и установите оба размера координатной сетки равными 8 пикселям. Теперь установки сетки соответствуют требованиям следующих инструкций.

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

Выберите три самых больших прямоугольника и установите их свойство Brush.Color в clGray. Свойствам Brush. Color каждого из пяти оставшихся прямоугольников определите такие значения, чтобы каждый из них имел отличающийся яркий цвет. (Можно использовать clRed, clYellow, clLime, clBlue и clFuchsia, или любые другие.)

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

Легендарные Ханойские башни хранятся в тихом храме глубоко в джунглях. Они состоят из 64 полированных медных дисков, и несколько смен молчаливых монахов в черных одеяниях непрерывно перемещают диски по одному с одной пирамиды на другую. Когда они завершат свою работу, наступит конец света. Так гласит предание. Если они смогут выполнять один ход за секунду, все мероприятие займет около половины триллиона лет, поэтому планы на ближайшие выходные менять не стоит.

Измените заголовок формы на Ханойские башни, а ее размеры сделайте такими, чтобы нарисованные фигуры как раз умещались на ней. Измените свойство Name левого, среднего и правого больших прямоугольников в нижней части формы на L, М и R соответственно. Измените свойство Name пяти прямоугольников дисков, сложенных на большом левом прямоугольнике, на А, В, С, D и Е (сверху вниз).

Свойству DragMode наименьшего диска, А, присвойте значение dmAutomatic, что позволит вам перемещать этот диск. В начале игры перемещать можно только этот диск.

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

Прямоугольник Установка
А (верх) ВХ (Ниже В; выше ничего нет)
В СА (Ниже С и выше А)
С DB (Ниже D и выше В)
D ЕС (Ниже Е и выше С)
Ё LD (Ниже L и выше D)
L (левое основание) ХЕ (Ниже ничего нет; выше Е)
М (среднее основание) XX (Ни ниже, ни выше ничего нет)
R (правое основание) XX (Ни ниже, ни выше ничего нет)

Выберите все фигуры, за исключением наименьшей (А), и создайте для них обработчик события OnDragOver, содержащий следующие строки:

Accept := ((Sender AS TShape).Hint[2] = ‘X’) AND

((Source AS TShape).Width (Sender AS TShape).Width);

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

Source и Sender являются важными параметрами, передаваемыми Delphi каждому обработчику события OnDragOver. Source — это перемещаемый компонент, а Sender — компонент, над которым происходит перемещение. Эти компоненты могут относиться к любому старому типу компонентов, но мы знаем, что в данном случае оба они являются фигурами, и поэтому используем ключевое слово AS, чтобы сообщить об этом Delphi. Таким образом, выражение (Source AS TShape) относится к перемещаемому диску, a (Sender AS TShape) — к опускаемому.

Запустите программу и попробуйте перемещать верхний диск по форме. Сначала курсор примет вид символа НЕТ (перечеркнутая окружность). Продолжайте перемещать диск над каждым из пустых оснований, и они выразят готовность принять диск, изменив форму курсора на стрелку с прямоугольником.

Снова выберем все фигуры, за исключением наименьшей. Перейдем на страницу Events окна Object Inspector и дважды щелкнем на событии OnDragDrop. Строки begin—end обработчика события OnDragDrop, предоставленного Delphi, заменим следующими:

Var

Moved, Still: TShape;

Begin

Moved := Source AS TShape;

Still := Sender AS TShape;

Moved.Top := Still.Top — Moved.Height;

Moved.Left := Still.Left + (Still.Width DIV 2) — (Moved.Width DIV 2);

with FindComponent(Moved.Hint[1])

As TShape do

Begin

if Name

Hint := Hint[1] + ‘X’;

end;

Moved.Hint := Still.Name + ‘X’;

Still.Hint := Still.Hint[1] + Moved.Name;

Still. DragMode :=dfnManual;

if (L.Hint = ‘XX’) AND (M.Hint = ‘XX’) then

Caption := ‘Ханойские башни — OK!’;

end;

Обработчик события OnDragDrop, благодаря множеству повторяющихся фрагментов (Source AS TShape и т.п.), несколько великоват. Новый обработчик будет еще более пространным. Решить проблему можно, объявив пару локальных переменных. Переменная Move будет представлять перемещаемую фигуру, а переменная Still — неподвижную. Первые две строки обработчика события будут присваивать этим переменным значения, соответствующие параметрам Source и Sender, передаваемым от Delphi. В остальной части обработчика при необходимости указать два диска будут использоваться эти простые имена.

Прежде всего, необходимо установить свойства Тор и Left перемещаемого диска таким образом, чтобы центрировать его относительно диска, на который он будет опускаться. Далее используется удобный метод FindComponent главной формы для поиска диска, который ранее был под перемещаемым диском. Метод FindComponent ищет компонент на форме по имени, а именем в данном случае является первый символ значения свойства Hint перемещаемой фигуры.

Если вновь найденная фигура не является одним из трех прямоугольников-оснований, ее следует сделать перемещаемой, присвоив ее свойству DragMode значение dmAutomatic. Кроме того, второй символ значения свойства Hint требуется заменить на X, так как теперь над этим диском уже ничего нет. Нужно привести в соответствие свойства Hint перемещаемой и неподвижной фигур таким образом, чтобы они отражали, что один диск в данный момент расположен над другим, а свойствам DragMode неподвижных фигур присвоить значение dmManual, чтобы блокировать их перемещение. Наконец, необходимо проверить, все ли диски теперь сложены на правом основании, что является решением головоломки.

Программа готова. Обработчик события OnDragOver следит за соблюдением правил головоломки, допуская только перемещения, которые не противоречат этим правилам, а обработчик OnDragDrop заботится о перемещении дисков, когда делается ход. Минимальным количеством ходов для решения данной головоломки является 31 — сможете ли вы переместить все диски на правое основание всего за 31 ход?

Чтобы усложнить задачу, можно увеличить количество дисков, поместив их между диском Е и левым основанием, назвав их F, G и т.д. При добавлении новых дисков следует привести в соответствие все свойства Hint. С добавлением каждого нового диска минимальное количество ходов увеличивается вдвое плюс один. Например, с 6 дисками минимальное количество ходов составит 63 (31 * 2 + 1). С 16 дисками (максимум, который вы можете использовать без риска неприятностей с именами, используя основание с именем L) для решения головоломки потребуется не менее 65535 ходов!

Delphi, делаем часть практической №3

Похожие статьи:

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock
detector