Светофор
Цель работы - создать программу, выполняющую следующие действия:
1. После запуска программы в окне изображается светофор с тремя лампочками, способными реагировать на наведение указателя мыши.
2. Когда указатель мыши наведен на лампочку, она меняет свой цвет.
![]() |
3. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в строке заголовка.
Описание плана разработки программы
1. Открыть новый проект.
2. Разместить на форме экземпляры компонентов: фигура Shape.
3. Выполнить следующие действия:
Таблица 14.
Выделенный объект | Вкладка окна
Object Inspector |
Имя свойства/
имя события |
Действие |
Form1 | Properties | Caption | Установка имени формы «Светофор» |
Height | Присвоить значение 300 | ||
Width | Присвоить значение 120 | ||
BorderIcons
(Служебные кнопки) |
Выбрать для подсвойства biMinimize (Сворачивание) и biMaximize (Разворачивание) значение False | ||
Color | Задать стандартный серый цвет | ||
BorderStyle
(Стиль рамки) |
Выбрать значение bsSingle | ||
Events | OnMouseMove | В процедуру передаются дополнительные параметры: Shift – указывает, не была ли при перемещении нажата клавиша SHIFT, CTRL или ALT; X - горизонтальная координата указателя мыши; Y - вертикальная координата указателя. |
Продолжение таблицы 14. | |||
Выделенный объект | Вкладка окна
Object Inspector |
Имя свойства/
имя события |
Действие |
Shape1
(Вкладка Additional) |
Properties | Height | Присвоить значение 61 |
Width | Присвоить значение 61 | ||
Shape (Форма) | Выбрать значение stCircle (Круг) | ||
Pen (Контур) | Выбрать для подсвойства Color (Цвет) значение clRed (красный цвет) | ||
Brush (Кисть) | Выбрать для подсвойства Style (стиль) значение bsClear (прозрачный) | ||
Enabled (Включен) | Выбрать значение False (Нет) | ||
Shape2
(Вкладка Additional)
|
Properties | Height | Присвоить значение 61 |
Width | Присвоить значение 61 | ||
Shape | Выбрать значение stCircle (Круг) | ||
Pen | Выбрать для подсвойства Color (Цвет) значение clYellow (желтый цвет) | ||
Brush | Выбрать для подсвойства Style значение bsClear | ||
Enabled (Включен) | Выбрать значение False (Нет) | ||
Shape3
(Вкладка Additional)
|
Properties | Height | Присвоить значение 61 |
Width | Присвоить значение 61 | ||
Shape | Выбрать значение stCircle (Круг) | ||
Pen | Выбрать для подсвойства Color (Цвет) значение clLime (ярко-зеленый цвет) | ||
Brush | Выбрать для подсвойства Style значение bsClear | ||
Enabled (Включен) | Выбрать значение False (Нет) |
4. Написать функцию OnShape, которая вызывается из процедуры FormMouseMove.
5. Работа функции определяет следующие события:
Если указатель мыши не наведен на лампочку, то ее цвет будет прозрачным.
Если указатель мыши наведен на лампочку, то ее цвет будет соответствовать цветам светофора.
r := sh.Width div 2; {r - радиус фигуры}
cx := sh.Left + r; {cx, cy – координаты центра фигуры}
cy := sh.Top + r;
d2 := (X – cx) * (X – cx) + (Y – cy) * (Y – cy); {d2 – квадрат расстояния от центра}
OnShape := bsClear; {указатель мыши не наведен на лампочку, т.е. находиться за пределами фигуры}
if d2 > r*r then ObShape := bsSolid; {указатель мыши наведен на лампочку, т.е. находиться внутри фигуры}
6. Выравнивание элементов:
1) Выделить все три фигуры.
2) Выбрать команду Edit > Align (Правка > Выровнить).
3) Откроется диалоговое окно Alignment (Выравнивание).
4) Установить слева переключатель Center in Window (Центрировать в окне).
5) Установить справа переключатель Space Equally (С равными промежутками).
6) Щелкнуть на кнопке OK.
7. Сохраните проект, запустите и протестируйте его.
Листинг подпрограммы
Function OnShape (sh: TShape: X, Y: Integer): TBrushStyle;
var r, cx, cy, d2: Integer;
begin
r := sh.Width div 2;
cx := sh.Left + r;
cy := sh.Top + r;
d2 := (X – cx) * (X – cx) + (Y – cy) * (Y – cy);
OnShape := bsClear;
if d2 > r*r then ObShape := bsSolid;
end;
procedure TForm1.FormMouseMove (Sender: TObject, Shift: TShiftState; X, Y: Integer););
begin
Shape1.Brush.Color := clRed;
Shape1.Brush.Style := OnShape (Shape1, X, Y);
Shape2.Brush.Color := clYellow;
Shape2.Brush.Style := OnShape (Shape2, X, Y);
Shape3.Brush.Color := clLime;
Shape.Brush.Style := OnShape (Shape3, X, Y);
end;
Практическая работа № 15
«Ханойские башни»
Цель работы - создать компьютерную версию игры-головоломки «Ханойские башни». Игровая доска содержит семь клеток, расположенных в ряд. На трех левых клетках стоят белые фишки, на трех правых – черные. Центральная клетка пуста. Задача заключается в том, чтобы, делая допустимые ходы, поменять фишки местами. Правила ходов такие.
1. Белые фишки могут ходить только вправо, а черные – только влево.
2. Ходить разрешается только на свободное поле.
3. Разрешены перемещения на соседнее поле и «прыжок» через одну фишку.
В роли фишек выступают кнопки с изображением, например, цветных треугольников, направленных так, чтобы они указывали допустимое направление ходов. Кнопки будут передвигаться по игровой доске, созданной при помощи панели.
![]() |
Описание плана разработки программы
1. Открыть новый проект.
2. Разместить на форме экземпляры компонентов: панель Panel, кнопка с изображением BitBtn.
3. Выполнить следующие действия:
Таблица 15.
Выделенный объект | Вкладка окна
Object Inspector |
Имя свойства/
имя события |
Действие |
Form1 | Properties | Caption | Установка имени формы «Головоломка» |
Panel1
(Вкладка Standard) |
Properties | Height | Присвоить значение 65 |
Width | Присвоить значение 401 | ||
Caption | Очистить значение | ||
BitBtn1
(Вкладка Additional)
|
Properties | Height | Присвоить значение 49 |
Width | Присвоить значение 49 | ||
Left | Присвоить значение 8 | ||
Top | Присвоить значение 8 | ||
BitBtn2
|
Properties | Height | Присвоить значение 49 |
Width | Присвоить значение 49 | ||
Left | Присвоить значение 64 | ||
Top | Присвоить значение 8 | ||
BitBtn3 | Properties | Height | Присвоить значение 49 |
Width | Присвоить значение 49 | ||
Left | Присвоить значение 120 | ||
Top | Присвоить значение 8 | ||
BitBtn4
|
Properties | Height | Присвоить значение 49 |
Width | Присвоить значение 49 | ||
Left | Присвоить значение 232 | ||
Top | Присвоить значение 8 | ||
BitBtn5
|
Properties | Height | Присвоить значение 49 |
Width | Присвоить значение 49 | ||
Left | Присвоить значение 288 | ||
Top | Присвоить значение 8 |
Продолжение таблицы 15. | |||
Выделенный объект | Вкладка окна
Object Inspector |
Имя свойства/
имя события |
Действие |
BitBtn6 | Properties | Height | Присвоить значение 49 |
Width | Присвоить значение 49 | ||
Left | Присвоить значение 344 | ||
Top | Присвоить значение 8 |
4. Сохраните проект.
5. Создать рисунки при помощи стандартной программы Paint. Задайте размеры рисунков 45x45 пикселов (в режиме увеличения).
6. Создать две картинки с именами Left.bmp и Right.bmp, поместить их в папку проекта. Рисунок с именем Left.bmp предназначен для левых кнопок, рисунок с именем Right.bmp – для правых кнопок.
7. Назначить рисунки кнопкам.
Продолжение таблицы 15.
BitBtn1, BitBtn2, BitBtn3, BitBtn4, BitBtn5, BitBtn6
|
Properties | Caption | Очистить значение |
Glyph (Значок) | Щелкнуть на кнопке построителя. Открыть окно Picture Editor. Щелкните на кнопке Load. В диалоговом окне выберете файл с изображением кнопки и щелкните на кнопке Открыть. Щелкнуть на кнопке Ok, и выбранная картинка появится на кнопке. |
8. Необходимо хранить два числа: номер клетки, в которой находится кнопка; признак «цвета» фишки», т.е. в какую сторону может ходить кнопка.
9. Номер клетки умножить на два. Если фишка черная, прибавить к числу единицу.
10. Задать свойство Tag (Тег) для всех кнопок.
Таблица 16.
Значение свойства Tag | Комментарий |
2 | Первая клетка, белая фишка |
4 | Вторая клетка, белая фишка |
6 | Третья клетка, белая фишка |
11 | Четвертая клетка, черная фишка |
13 | Пятая клетка, черная фишка |
15 | Шестая клетка, черная фишка |
11. Создать дополнительную переменную для пустой клетки
var n: Integer = 4;
12. Создать глобальную переменную
win : Integer = 24; {все фишки в сумме должны переместиться на 24 клетки}
13. Программируем выполнение хода фишки.
Таблица 17.
Выделенный объект | Вкладка окна
Object Inspector |
Bмя события | Действие |
BitBtn1 | Events | OnClick | В процедуру BitBtn1Click передается параметр – объект Sender. Он представляет именно тот объект, который вызвал событие, и может дать доступ к его свойствам. Надо специально указать, что объект Sender в данном случае следует считать кнопкой. Чтобы обратиться к свойству Tag данного объекта, записывают (Sender as TBitBtn).Tag. |
14. Сохраните проект, запустите и протестируйте его.
Листинг подпрограммы
procedure TForm1.BitBtn1Click (Sender: TObject);
var i, c, k, ak: Integer;
begin
with Sender as TBitBtn do {объект Sender используется многократно}
begin {свойство Tag указывает, какая именно кнопка нажата}
i := Tag div 2; {переменная i хранит номер клетки, где находится кнопка}
с := Tag mod 2; {переменная c определяет цвет фишки}
k := n – i; {k – величина перемещения}
ak := Abs (k); {ak – длина хода}
if ak < 3 then {проверка допустимости хода}
if ((c = 0) and (k > 0)) or ((c = 1 ) and (k < 0)) {белые фишки могут ходить только вправо, черные - влево}
then {делаем ход}
begin
Tag := Tag + 2 * k;
Left := Left + 56 * k;
win := win – ak; {при каждом ходе уменьшается значение переменой win на длину хода}
n := i; {пустая клетка находиться там, где раньше была фишка}
end;
end;
if win = 0 then {проверка завершения решения}
begin
Caption := ‘Победа!’;
Panel1.Color := clFuchsia;
Panel1.Enabled := False; {отключаем панель, и одновременно все расположенные на ней объекты}
end;
end;