|
Этот пример я взял из одной книжонки по
программированию для начинающих изучать Builder C++ . Программка
довольно интересная. Словом, она может самостоятельно рисовать узоры
на экране. То есть изображение «живет собственной жизнью»!
В общем, меньше слов , больше дела! Для начала создаем проект
и кидаем на форму PaintBox (Область рисования), которая находится на
вкладке Sistems, там же находится и второй элемент, который нам
нужен. Но пока остановимся на первом. Задаем размеры PaintBox.
Допустим они будут 320:320. Теперь перетаскивай на форму таймер:
Timer из той же вкладки. Сразу же установим время срабатывания:
100. Начинаем программирование. Для
начала запишем константы, которые вставим в самое начало нашей
программы, то есть до их применения в проге. Пишем:
const size=40; const
csize=12;
Здесь ключевое слово const указывает на то, что дальше идет
описание константы. Константа size задет число клеточек по
каждому направлению, константа csize – число используемых цветов.
Число используемых цветов забацаем в массив:
Tcolor Colors[16] =
{ clRed, clGreen, clYellow, clBlue, clWhite,
clGray, clFuchsia, clTeal, clNavy, clMaroon, clLime, clOlive,
clPurple, clSilver, clAqua, clBlack};
Их может быть больше, чем мы будем использовать. Теперь
описываем двумерный массив:
int Points[size][size];
Ну что ж теперь можно приступать к описанию логики
программы. Выбираем форму, щелкаем в инспекторе объектов на
вкладке Events, далее дважды щелкаем напротив события OnCreate и
пришем:
int i, j; //
вводим необходимые переменные цикла.
randomize() //обеспечиваем
неповторимость случайных чисел.
Что бы система нашла эту процедуру в начале программы надо
добавить:
#include <stdlib.h>
Приступаем к инициализации массива квадратиков:
for (i=0; i<size; i++) for (j=0;
j<size; j++) Points[i][j] = random(csize);
Теперь выберите объект Timer1 кликайте на вкладку Events затем по
событию OnTimer и пишите:
Задаем переменные, которые будут определять состояние соседних
клеток, а так же переменные цикла двумерного массива:
int i, j; int c, d, u, l, r; int
newPoints[size][size]; for (i=0; i<size; i++) for (j=0;
j<size; j++) c = Points[i][j]+1;//
определяем следующий цвет. if (c==csize) c=0;
Аналогичным способом вычисляем индексы квадратов, которые
примыкают снизу, сверху, слева и справа:
d=i-1;
if (d<0)
d=size-1;
u=i+1;
if (u==size) u=0;
l=j-1;
if (l<0)
l=size-1;
r=j+1;
if (r==size) r=0;
newPoints[i][j]=Points[i][j]; //если среди соседей такой цвет отсутствует, то
клеточка остается такой же.
if
(Points[d][j]==c || Points[u][j]==c || Points[i][l]==c ||
Points[i][r]==c)
newPoints[i][j]=c;} // оператор || указывает на то что условие истинно,
если истинно хотя бы одно из условий. Теперь
разбиваем область рисования на клеточки:
c
= 320/size;
for (i=0; i<size; i++)
for (j=0;
j<size; j++){
Копируем новые цвета клеточек в основной
массив:
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);}
Все сделано!!! Теперь программа будет рисовать сама.
Рисунок обновляется по системным часам, то есть по таймеру, который
мы с вами установили. Посмотрите что получиться. Жми F9. Темка
интересная. Вот только сколько я не бился, никак не получалось
геометрически правильного рисунка. Попробуйте, может у вас что
нибудь да получиться!!! Далее приведен листинг программы. Если
не поняли, то качайте исходники, в разделе исходники и программули.
#include <vcl.h> #pragma
hdrstop #include <stdlib.h> #include
"Unit1.h"
//-------------------------------------------------------------- #pragma
package(smart_init) #pragma resource "*.dfm" TForm1
*Form1; const size=40; const csize=12; TColor
Colors[16]= { clRed, clGreen, clYellow, clBlue, clWhite, clGray,
clFuchsia, clTeal, clNavy, clMaroon, clLime, clOlive, clPurple,
clSilver, clAqua, clBlack}; int
Points[size][size];
//-------------------------------------------------------------- __fastcall
TForm1::TForm1(TComponent*
Owner) :
TForm(Owner) { }
//--------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject
*Sender)
{
int i, j;
randomize();
for (i=0; i<size;
i++)
for (j=0; j<size; j++)
Points[i][j] =
random(csize);
}
//--------------------------------------------------------------
void
__fastcall TForm1::Timer1Timer(TObject *Sender)
{
int i,
j;
int c, d, u, l, r;
int newPoints[size][size];
for(i=0;
i<size; i++)
for(j=0; j<size;
j++)
{c=Points[i][j]+1;
if(c==size)
c=0;
d=i-1;
if(d<0) d=size-1;
u=i+1;
if(u==size)
u=0;
l=j-1;
if(l<0) l=size-1;
r=j+1;
if(r==size)
r=0;
newPoints[i][j]=Points[i][j];
if(Points[d][j]==c ||
Points[u][j]==c
|| Points[i][l]==c ||
Points[i][r]==c)
newPoints[i][j]=c;
}
c=320/size;
for(i=0;
i<size; i++)
for(j=0; j<size;
j++)
{
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);
}
}
//--------------------------------------------------------------
Ну вот и все! Всего хорошего мой юный
друг!!! |