Цель работы - создать программу, выполняющую следующие действия без участия пользователя:

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

2. Картинка обновляется "сама собой". Интервал таймера может быть любым. Он зависит от компьютера, на котором работает программа.

3. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в строке заголовка.

Практическая работа № 28 Узоры

Рис. 55.

Описание плана разработки программы

1. Открыть новый проект.

2. Разместить на форме экземпляры компонентов: область рисования PaintBox, таймер Timer.

3. Область рисования представить в виде клеток (точек или пикселов). Каждая клетка покрашена в свой цвет. В ходе программы цвета меняются.

4. Описать предварительно константы в окне кода пред ключевым словом: Const size = 40;
csize = 12;

Colors: array [1..16] of TColor =

(clRed, clGreen, clYellow, clBlue, clWhite, clGray, clFuchsia, clTeal, clNavy, clMaroon, clLime, clOlive, clPurple, clSilver, clAqua, clBlack); Константа size задает число клеточек по каждому направлению, константа csize -число используемых цветов. Массив Colors (константа) определяет цвета. В разделе описаний после ключевого слова var описывается массив клеток Points: array[1..size, 1..size] of Integer;

5. Выполнить следующие действия:

Таблица 25.

Выделенный объект

Вкладка окна Object Inspector

Имя свойства/ имя события

Действие

Form1

Properties

Caption

Установка имени формы "Узор"

Events

OnCreate

В процедуре обеспечить неповторимость случайных чисел с помощью процедуры Randomize. Провести инициализацию массива пикселов.

PaintBox1

(Вкладка System)

Properties Height Задать значение 320 Width Задать значение 320

Продолжение таблицы 25.

Выделенный объект

Вкладка окна Object Inspector

Имя свойства/ имя события

Действие

Canvas

Свойства и методы этого свойства обеспечивают рисование. Метод Rectangle рисует прямоугольник с заданными вершинами. Цвет контура задается свойством Pen.Color, а цвет закраски - свойством Brush.Color.

Timer1

(Вкладка System)

Properties

Interval

Задать значение 100 (одна десятая секунды)

Events

OnTimer

В созданной процедуре-заготовке Timer1Timer описать переменные c (color), up (up), d (down), l (left), r (right). Новые значения цветов записываются в отдельном массиве NewPoints. Написать правила, по которым будут меняться цвета.

6. Сохраните проект, запустите и протестируйте его.

Листинг подпрограммы

procedure TForm1.FormCreate (Sender: TObject);
var i, j : Integer;
begin
Randomize;

for i := 1 to size do {инициализация массива пикселов} for i := 1 to size do Points[i, j] := 1 + Random (csize); {Минимально возможное значение элемента массива равно 1}

end;
procedure TForm1.Timer1Timer (Sender: TObject); var i, j : Integer;
c, l, r, u, d : Integer;

newPoints: array [1..size, 1..size] of Integer; begin { Вычислить, какого цвета будет клетка на следующем шаге} for i := 1 to size do for j := 1 to size do begin c := Points[i, j] + 1;{Вычисляется "следующий цвет" и запоминается в переменной с} if c > csize then c := 1; {После последнего цвета идет первый}

{ Вычисляются индексы для клеток, примыкающих к данной сверху, снизу, слева и справа. Края узора как бы "склеены" друг с другом} u := i - 1;
if u = 0 then u := size;
d := i + 1;
if d >
size then d := 1;
l := j - 1;
if l = 0 then l := size;
r := j + 1;
if r >
size then r := 1;
newPoints [i, j] := Points [i, j]; {Если среди "соседей" цвет отсутствует, то клетка остается без изменений} { Если хотя бы один из "соседей" имеет такой цвет, клетка перекрашивается} if (Points [u, j] = c) or (Points [d, j] = c) or (Points [i, l] = c) or (Points [i, r] = c) then newPoints [i, j] := c;
end;
c := 320 div size; {Выбирается размер клетки так, чтобы узор занимал, по возможности, всю область рисования} { Обновляется узор на экране} for i := 1 to size do for j := 1 to size do begin
Points [i, j] := newPoints [i, j];

{Настроить цвет контура прямоугольника и цвет закраски} PaintBox1.Canvas.Pen.Color := Colors[Points[i, j]]; PaintBox1.Canvas.Brush.Color := Colors[Points[i, j]]; { Выполнить рисование}

PaintBox1.Canvas.Rectangle (c*(i - 1), c*(j - 1), c*i - 1, c*j - 1); { Параметры метода Rectangle подобраны так, чтобы между клетками оставался небольшой зазор. Чтобы клетки располагались вплотную друг к другу, заменить (c*(i - 1), c*(j - 1), c*i - 1, c*j - 1) на (c*(i - 1), c*(j - 1), c*i , c*j } end;
end;

Практическая работа № 27 "Олимпийский флаг" || Оглавление || Практическая работа № 29 Перемещение рисунка


Практикум по Delphi для решения прикладных задач



Новости за месяц

  • Июль
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс