Создадим на форме квадрат.

Раскрасим его в синий цвет.

Щелчком мыши создадим процедуру обработки нажатия на кнопку мыши на квадрате.

Впишем в неё следующий текст:
if Tshape(Sender).Brush.Style =
bsDiagCross then
Tshape(Sender).Brush.Style := bsSolid
else
Tshape(Sender).Brush.Style := bsDiagCross;
Обратите внимание
на то, что зная имя объекта, обращаемся к нему через Sender. Это сделано для
использования одной общей процедуры
для всех наносимых впоследствии квадратах. А их мы создадим из программы, даже не заботясь о присваиваемых им именах.
Запустим программу и убедимся, что щелчки по квадрату
меняют его внешний вид.
В одном состоянии это будет море, а в другом палуба.
Завершим программу.
Щелчком по форме создадим процедуру:
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
и впишем в неё цикл, предварительно объявив переменные.
procedure TForm1.FormCreate(Sender: TObject);
var
i,k: integer;
begin
for
i:=1 to 10 do
begin
for
k:=1 to 10 do
begin
Kvadr(i, k);
end;
end;
А теперь добавим процедуру создания программой квадрата
аналогичного квадрату созданному вручную.
И не забудем объявить её:
procedure Kvadr(g,v:Integer);
и создаваемые ею объекты:
var
Form1: TForm1;
kvadrat: array[1..10,1..10] of TShape ;
//клетки создаст программа
До пробного запуска программы необходимо
обеспечить скрытие созданного вручную квадрата. Это можно сделать вручную,
изменив свойство:
Shape1.Visible:= False;
Но мы это сделаем программно, вставив эту строку в начало
процедуры перед циклами.
procedure TForm1.FormCreate(Sender: TObject);
var
i,k: integer;
begin
Shape1.Visible:= False;
for i:=1 to 10 do
begin
Запустим программу и пощелкаем по квадратикам.

Завершим программу.
Для отображения задания и результатов расстановки нанесём
на форму метки. Для этого вручную создадим одну метку. А необходимое количество
создадим программно.
Расположим её в стороне и будем использовать при отладке,
впоследствии с ней поступим как с квадратом – скроем. (Для программного
создания объектов на форме я создаю по одному вручную, а затем его скрываю,
если кто знает, как сделать проще - прошу поделиться опытом.)
В тексте программы добавим процедуру программного
создания и расстановки меток.
procedure TForm1.Metki(T:Integer);
var
L:byte ;
begin
for
L:=0 to 1 do
//программное
создание меток для поля боя
begin
summ_goris[T,L]:=TLabel.Create(self);
summ_goris[T,L].Parent:= form1;
summ_vetr [T,L]:=TLabel.Create(self);
summ_vetr [T,L].Parent:= form1;
summ_goris[T,L].Left:= 230 + 20 * L;
summ_vetr [T,L].Left:= 8 + 20 * T;
summ_goris[T,L].Top:= 5 + 20 * T;
summ_vetr [T,L].Top:= 230 + 20 * L;
summ_goris[T,L].Width:= 20;
summ_vetr [T,L].Width:= 20;
summ_goris[T,L].Height:= 20;
summ_vetr [T,L].Height:= 20;
summ_goris[T,L].Alignment:= taCenter;
summ_vetr [T,L].Alignment:=taCenter;
summ_goris[T,L].Caption:='0';
summ_vetr [T,L].Caption:='0';
end;
end;
Не забудем объявить процедуру и метки (аналогично
квадратам).
Добавим в цикл вызов процедуры.
for i:=
1 to 10 do
begin
for
k:= 1 to 10 do
begin
Kvadr(i, k);
end;
Metki(i);
end;
Оценку наших стараний будет выполнять следующая
процедура.
procedure TForm1.Itog();
var
t,l:byte ;
summ_g,summ_v:integer;
begin
//суммы
по горизонтали
for
t:=1 to 10 do
begin
summ_g:=0;
for
l:=1 to 10 do
begin
if kvadrat[t,l].Brush.Style
= bsDiagCross then
summ_g:= summ_g + 1;
end;
summ_goris[t,1].Caption:= IntToStr(summ_g);
if
summ_goris[t,1].Caption = summ_goris[t,0].Caption then
summ_goris[t,1].Color:= clLime
else
summ_goris[t,1].Color:= clBtnFace;
end;
//суммы по вертикали
for
l:=1 to 10 do
begin
summ_v:=0;
for
t:=1 to 10 do
begin
if kvadrat[t,l].Brush.Style
= bsDiagCross then
summ_v:= summ_v + 1;
end;
summ_vertik[l,1].Caption:= IntToStr(summ_v);
if
summ_vertik[l,1].Caption = summ_vertik[l,0].Caption then
summ_vertik[l,1].Color:= clLime
else
summ_vertik[l,1].Color:= clBtnFace;
end;
end;
Для работы с вариантами расстановки нанесём на форму
текстовое поле (аналогично метке) и две кнопки для переноса:
·
задания из текстового поля в метки «задания»
·
в текстовое поле расстановки кораблей из меток «результат»
В тексте программы появляются следующие процедуры.
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
text_:string;
begin
// переписыает
скопированные из текстового файла
// для игры цифры
text_:=
Edit1.Text;
for
i:=1 to 10 do
begin
summ_goris[i,0].Caption:= text_[i];
summ_vertik[i,0].Caption:= text_[i+10];
end
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
text_:string;
begin
// переписыает
результат расстановки
// для ручного
сохранения
// в текстовом
файле
text_:= '';
for i:=1 to 10 do
begin
text_:= text_+
summ_goris[i,1].Caption ;
end;
for
i:=1 to 10 do
begin
text_:= text_+
summ_vertik[i,1].Caption ;
end;
Edit1.Text:= text_;
end;
Изменим программно вид
формы.
procedure TForm1.FormCreate(Sender: TObject);
var
i,k: integer;
begin
Form1.Caption:='Морская
разведка';
Form1.Width:= 280;
Form1.Height:= 370;
Edit1.Left:= 20;
Edit1.Top:= 300;
Edit1.Height:=20;
Edit1.Width:=200;
Edit1.Text:= 'Скопируйте сюда цифры задания';
Shape1.Visible:= False;
Label1.Visible:= False;
Button1.Caption:=' Задание ';
Button2.Caption:=' Результат';
Button1.Left:= 20;
Button2.Left:= 140;
Button1.Top:= 270;
Button2.Top:= 270;
Button1.Width:= 80;
Button2.Width:= 80;
Button1.Height:= 25;
Button2.Height:= 25;
for i:=
1 to 10 do
begin
for
k:= 1 to 10 do
begin
Kvadr(i, k);
end;
Metki(i);
end;
end;
Остаётся для составления заданий:
·
расставить корабли
·
нажать на кнопку « Результат»
·
из текстового поля перенести цифры в текстовый
редактор «Блокнот»
повторить это несколько раз с новой строки и сохранить
файл с заданиями для игры.
Для игры:
·
скопировать любую строчку из созданного файла в
текстовое поле
·
нажать на кнопку «Задание»
Успехов.
|