Постановка задачи. На форме в ряд расположены четыре разные картинки (рис. 30). Сначала они открыты какое-то время, потом закрываются. Около них появляется одна из спрятанных картинок. Надо угадать такую же картинку в этом ряду. Проект развивает зрительную память. Это простейший пример динамического создания массива компонентов TImage .
Рис. 30. Проект «Угадай картинку»
Реализация. Нарисуйте в графическом редакторе четыре картинки размером примерно 60 х 60. Положите на форму две кнопки «Старт» и «Выход». Положите компоненты ТTimer и ТImage для отдельной картинки. Форма проекта приведена на рис. 31.
Для размещения четырех картинок необходимо программным путем создать массив из четырех компонентов TImage .
Глобальные данные
const n=4;
dx=60;dy=70; // Размеры картинок
type mas=array [1..n] of string;
mas_int=array [1..n] of integer;
const fname:mas=('Вишня.bmp','яблоко.bmp','апельсин.bmp',
'ананас.bmp');
var x0,y0,i : integer;
nom_picture:integer;
Im:array [1..n] of TImage;
number : mas_int;
Рис. 31. Форма проекта «Угадай картинку»
Ниже приведен код основных процедур.
procedure pole;
var i,x,y:integer; {Поле}
begin
y:=y0;
for i :=1 to n do
begin
x:=x0+(i-1)*dx;
with Form1.canvas do
begin
pen.Color:=clblack;
pen.Width:=2;
brush.Color:=Form1.Color;
rectangle(x,y,x+dx,y+dy);
end;
end;
end;
procedure ris;
{Выбор случайной картинки и показ ее на экране}
begin
nom_picture:=random(4)+1;
Form1.Image1.Picture.LoadFromFile(fname[nom_picture]);
Form1.Image1.Left:=5;
Form1.Image1.Top:=20;
Form1.Image1.Transparent:=true;
Form1.Image1.Visible:=true;
end;
procedure zapolnenie; {Заполнение массива числами от 1 до 4}
var i,k:integer;
b:boolean;
begin
randomize;
b:=false;
for i:=1 to n do
number[i]:=0;
for i:=1 to n do
begin
b:=false;
repeat
k:=random(n)+1;
if number[k]=0 then
begin
number[k]:=i;
b:=true;
end;
until b;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
x0:=100;
y0:=20;
Timer1.Enabled:=false;
Timer1.Interval:=50;
randomize;
zapolnenie;
for i:=1 to n do // Создание массива TImage
begin
Im[i]:=TImage.Create(Form1);
Im[i].Parent:=Form1;
Im[i].Picture.LoadFromFile(fname[number[i]]);
Im[i].Height:=60;
Im[i].Width:=45;
Im[i].OnClick:=Imclick;
Im[i].left:=x0+(i-1)*dx+5;
Im[i].Top:=y0+5;
Im[i].Transparent:=true;
Im[i].Visible:=false;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin // Некоторое время видны все картинки
Timer1.Interval:=Timer1.Interval-1;
if Timer1.Interval=0 then
begin
Timer1.Enabled:=false;
pole; // Картинки закрываются
ris; // Видна одна случайная картинка
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer; {Кнопка «Старт»}
begin
Label1.Caption:='';
Timer1.Enabled:=true;
Timer1.Interval:=50;
Image1.Visible:=false;
zapolnenie;
pole;
for i:=1 to n do
begin
Im[i].Picture.LoadFromFile(fname[number[i]]);
Im[i].Visible:=true;
end;
end;
procedure TForm1.ImClick(Sender: TObject);
var k:integer;
begin
k:=((Sender as TControl).Left-x0) div dx +1;
Label1.Caption:='';
If Im[k]<>Nil Then
Im[k].Hide;
im[k].Visible:=true;
if number[k]=nom_picture then
Label1.Caption:='Вы угадали'
else
Label1.Caption:='Не угадали';
end;
Задание. Усовершенствуйте проект так, чтобы можно было только один раз кликать на картинку, т. е. исключить возможность угадывания.