Главная страница
Навигация по странице:

  • Создание многопоточных программ в среде Delphi и исследование свойств потоков

  • Отчет о лабораторной работе 1 Создание многопоточных программ в среде Delphi и исследование свойств потоков


    Скачать 1.02 Mb.
    НазваниеОтчет о лабораторной работе 1 Создание многопоточных программ в среде Delphi и исследование свойств потоков
    Дата27.03.2019
    Размер1.02 Mb.
    Формат файлаdocx
    Имя файла246873.docx
    ТипОтчет
    #71699

    Федеральное агентство по образованию

    Рязанский государственный радиотехнический университет


    Кафедра ЭВМ


    Отчет

    О лабораторной работе №1
    «Создание многопоточных программ в среде Delphi и исследование свойств потоков»

    Выполнила: ст. гр. 142

    Малахова А.В.

    Проверил:

    Засорин С.В.

    Рязань 2013 г.

    1. Примеры многопоточных программ.

    1. Создается приложение, которое содержит три потока: главный поток и два дополнительных. Потоки будут выполнять некоторые простые вычисления, а главная программа — отображать информацию об объеме вычислений в секунду, выполненных в каждом потоке. При выполнении потоков должна обеспечиваться возможность изменения их свойств и наблюдения за их реакцией.

    Форма приложения:

    Рисунок 1 – форма приложения

    Разные варианты выполнения приложения:

    Рисунок 2 – приоритет 2ого потока больше

    Рисунок 3 – приоритет 1ого потока больше

    Код программы:

    unit Unit1;

    interface

    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, ComCtrls, ExtCtrls, StdCtrls;

    type

    TForm1 = class(TForm)

    Edit1: TEdit;

    Edit2: TEdit;

    Label1: TLabel;

    Label2: TLabel;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    Timer1: TTimer;

    TrackBar1: TTrackBar;

    TrackBar2: TTrackBar;

    Button4: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure TrackBar1Change(Sender: TObject);

    procedure TrackBar2Change(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;

    var

    Form1: TForm1;

    Count1,Count2: integer; {число вычислений в секунду в потоке}

    ThreadId1,ThreadId2:dword; {идентификатор потока}

    HThread1, HThread2: THandle; {указатель на поток}

    implementation

    {$R *.dfm}

    procedure Execute1;

    var

    I, Total, Avg: integer;

    begin

    while True do

    begin

    Total:=0;

    for i:=1 to 10 do inc(Total, Random(Maxint));

    Avg:=Avg Div 10; inc(Count1);

    end;

    end;

    procedure Execute2;

    var

    I, Total, Avg: integer;

    begin

    while True do

    begin

    Total:=0;

    for i:=1 to 10 do inc(Total, Random(Maxint));

    Avg:=Avg Div 10; inc(Count2);

    end;

    end;

    procedure TForm1.Button1Click(Sender: TObject);

    begin

    HThread1:=CreateThread (nil, 0, @ Execute1, nil, 0, ThreadId1);

    end;

    1. Для работы приложения нам потребуется класс TSimpleThread унаследованный от класса TThread.

    Окна работы приложения 2 представлено на рисунках:



    Рисунок 4 – работа приложения при низких приоритетах потоков


    Рисунок 5 – работа приложения при высоких приоритетах потоков

    При максимальных приоритетах потоков увеличивается их производительность и замечается медленный отклик программ ОС.

    Код программы:

    unit Unit1;

    interface

    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, Thrd, ExtCtrls, StdCtrls, ComCtrls;

    type

    TForm1 = class(TForm)

    Edit1: TEdit;

    Edit2: TEdit;

    TrackBar1: TTrackBar;

    TrackBar2: TTrackBar;

    Timer1: TTimer;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    procedure FormCreate(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

    procedure TrackBar1Change(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    Thread1,Thread2:TSimpleThread;

    end;

    var

    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);

    begin

    Thread1:=TSimpleThread.Create(False);

    Thread1.Priority:=tpLowest;

    Thread2:=TSimpleThread.Create(False);

    Thread2.Priority:=tpLowest;

    end;

    procedure TForm1.Button3Click(Sender: TObject);

    begin

    close();

    end;

    procedure TForm1.Timer1Timer(Sender: TObject);

    begin

    Edit1.Text:=intToStr(Thread1.Count ); Thread1.Count:=0;

    Edit2.Text:=intToStr(Thread2.Count ); Thread2.Count:=0;

    end;

    procedure TForm1.TrackBar1Change(Sender: TObject);

    var

    i: Integer;

    Priority: TThreadPriority;

    begin

    Priority:=tpLowest;

    for i:=0 to (Sender as tTrackBar).Position-1 do

    inc(Priority);

    if Sender=TrackBar1

    then Thread1.Priority:=Priority else Thread2.Priority:=Priority;

    end;

    end.

    unit Thrd;

    interface

    uses

    Classes;

    type

    TSimpleThread = class(TThread)

    private

    { Private declarations }

    protected

    procedure Execute; override;

    public

    Count: Integer;

    end;

    implementation

    { Important: Methods and properties of objects in visual components can only be

    used in a method called using Synchronize, for example,

    Synchronize(UpdateCaption);

    and UpdateCaption could look like,

    procedure TSimpleThread.UpdateCaption;

    begin

    Form1.Caption := 'Updated in a thread';

    end; }

    { TSimpleThread }

    procedure TSimpleThread.Execute;

    var

    i,Total,Avg:integer;

    begin

    while True do

    begin

    Total:=0;

    for i:=1 to 10 do inc(Total,Random(Maxint));

    Avg:=Avg Div 10; inc(Count);

    end;

    end;

    end.

    1. Создается многопоточное приложение, в котором демонстрируется образование, приостановка и изменение приоритетов нескольких потоков.

    В программе создается три потока, каждый из которых перемещает изображение (например, автомобиль) по форме.

    Примеры выполнения приложения:

    Рисунок 6 – запущен только 1ый поток

    Рисунок 7 – запущен 1ый поток и 3ий поток с более высоким приоритетом

    Рисунок 8 – запущены все 3 потока, приоритет 3его выше

    Код программы:

    unit move;

    interface

    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, ExtCtrls, StdCtrls, ComCtrls, car1;

    type

    TForm1 = class(TForm)

    TrackBar1: TTrackBar;

    TrackBar2: TTrackBar;

    TrackBar3: TTrackBar;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    PaintBox1: TPaintBox;

    PaintBox2: TPaintBox;

    PaintBox3: TPaintBox;

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure TrackBar1Change(Sender: TObject);

    private

    public

    Thread1, Thread2, Thread3:TMoveThread;

    end;

    var

    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);

    var taxi00, taxi01: TBitMap;

    begin

    taxi00:=tbitmap.Create; // Создается объект BitMap

    taxi00.LoadFromFile('5.bmp'); //В него загружается изображение

    taxi01:=tbitmap.Create;

    taxi01.LoadFromFile('51.bmp');

    thread1:=TMoveThread.Create(taxi00,taxi01,PaintBox1);//Создается поток

    Thread1.Priority:=tpLowest; //Устанавливается небольшой приоритет у потока, чтобы поток был управляемым и не забирал все ресурсы.

    thread2:=TMoveThread.Create(taxi00,taxi01,PaintBox2);

    Thread2.Priority:=tpLowest;

    thread3:=TMoveThread.Create(taxi00,taxi01,PaintBox3);

    Thread3.Priority:=tpLowest;

    Thread1.Suspend;Thread2.Suspend; Thread3.Suspend;

    end;

    procedure TForm1.Button1Click(Sender: TObject);

    begin

    if Thread1.Suspended=true then

    begin

    Thread1.Resume ;

    Button1.caption:='Стоп'

    end

    else

    begin

    Thread1.Suspend ;

    Button1.caption:='Старт';

    end;

    end;

    procedure TForm1.Button2Click(Sender: TObject);

    begin

    if Thread2.Suspended=true then

    begin

    Thread2.Resume ;

    Button2.caption:='Стоп'

    end

    else

    begin

    Thread2.Suspend ;

    Button2.caption:='Старт';

    end;

    end;

    procedure TForm1.Button3Click(Sender: TObject);

    begin

    if Thread3.Suspended=true then

    begin

    Thread3.Resume ;

    Button3.caption:='Стоп'

    end

    else

    begin

    Thread3.Suspend ;

    Button3.caption:='Старт';

    end;

    end;

    procedure TForm1.TrackBar1Change(Sender: TObject);

    var I: integer;

    priority:TThreadPriority;{ Изменение приоритета соответствующего потока }

    begin

    priority:=tpIdle;

    for i:=0 to ((sender as ttrackbar).position -1) do inc(priority);

    if sender=trackbar1 then thread1.priority:=priority else

    if sender=trackbar3 then thread3.priority:=priority

    else thread2.Priority:=priority;

    end;

    end.

    unit car1;

    interface

    uses

    Classes, Graphics, ExtCtrls, SysUtils;

    type

    TMoveThread = class(TThread)

    private

    FBox: TPaintBox; // Где воспроизводится картинка

    b0,b1: tbitmap; // Сами картинки

    i:integer; // Для определения координат картинки

    procedure DoVisualSwap; // Одна процедура двигает вправо,

    procedure DoVisual; // Другая влево

    protected

    procedure Execute; override;

    public

    Thread1, Thread2, Thread3:TMoveThread;

    constructor Create(a,b: TBitmap; c:TPaintBox);

    destructor Destroy; override;

    end;

    implementation

    constructor TMoveThread.Create(a,b:tbitmap; c:TPaintBox);

    begin

    b0:=a;b1:=b;Fbox:=c;i:=0;

    inherited Create(False);

    end;

    procedure TMoveThread.DoVisualSwap;{Двигает картинку вправо}

    begin

    with FBox do

    begin

    canvas.Draw(i,0,b0);

    inc(i);

    end;

    end;

    procedure TMoveThread.DoVisual; { Двигает картинку влево }

    begin

    with FBox do

    begin

    canvas.Draw(i,0,b1);

    dec(i);

    end;

    end;

    procedure TMoveThread.Execute;

    begin

    while true do

    begin

    while i<=(fbox.Width+b0.Width) do Synchronize(DoVisualSwap);

    while i>=(0-b0.Width) do Synchronize(DoVisual);

    end;

    end;

    destructor TMoveThread.Destroy;

    begin

    b0.free;

    b1.free;

    inherited Destroy;

    end;

    end.

    1. Разработайте многопоточное приложение «Клавиатурный тренажер» по следующим условиям. Пользователь имеет возможность задать один из трех уровней: «Новичок», «Любитель», «Мастер». В зависимости от уровня в каждый момент времени от верхней до нижней границ рабочей области тренажера падает одна, две или три буквы. Пользователю необходимо за время падения букв успеть нажать соответствующие клавиши на клавиатуре. При неверном нажатии фиксируются ошибки, число которых подсчитывается. Скорость падения букв регулируется. Тренажер должен работать с русским и латинским алфавитами.

    Форма приложения:



    Рисунок 9 – форма Клавиатурного Тренажёра

    Лёгкий уровень игры:



    Рисунок 9 – лёгкий уровень игры

    Средний уровень:



    Рисунок 10 – средний уровень игры

    Сложный уровень:



    Рисунок 11 – сложный уровень игры

    Режим русского языка:



    Рисунок 12 – режим русского языка

    При изменении компонента scrollbar меняется скорость падения букв.

    При количестве ошибок, равном 10, игра заканчивается:



    Рисунок 13 – окончание игры

    Код программы:

    unit move;

    interface

    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, ExtCtrls, StdCtrls, ComCtrls, car1;

    type

    TForm1 = class(TForm)

    Button1: TButton;

    PaintBox1: TPaintBox;

    PaintBox2: TPaintBox;

    PaintBox3: TPaintBox;

    Timer1: TTimer;

    Image1: TImage;

    Edit1: TEdit;

    Label1: TLabel;

    TrackBar1: TTrackBar;

    Label2: TLabel;

    Button2: TButton;

    Button3: TButton;

    GroupBox1: TGroupBox;

    RadioButton1: TRadioButton;

    RadioButton2: TRadioButton;

    RadioButton3: TRadioButton;

    GroupBox2: TGroupBox;

    RadioButton4: TRadioButton;

    RadioButton5: TRadioButton;

    Timer2: TTimer;

    Label3: TLabel;

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

    procedure FormKeyPress(Sender: TObject; var Key: Char);

    procedure TrackBar1Change(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Timer2Timer(Sender: TObject);

    private

    public

    Thread: array[1..3] of TMoveThread;

    taxi00: char;

    end;

    var

    Level: integer;

    Form1: TForm1;

    check: boolean;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);

    var

    img: TBitMap;

    begin

    img:= tbitmap.Create;

    img.LoadFromFile('12.bmp');

    Image1.canvas.draw(0,0,img);

    RadioButton4.Checked:=true;

    thread[1]:=TMoveThread.Create(PaintBox1);//Создается поток

    Thread[1].Priority:=tpLowest; //Устанавливается небольшой приоритет у потока, чтобы поток был управляемым и не забирал все ресурсы.

    thread[2]:=TMoveThread.Create(PaintBox2);//Создается поток

    Thread[2].Priority:=tpLowest; //Устанавливается небольшой приоритет у потока, чтобы поток был управляемым и не забирал все ресурсы.

    thread[3]:=TMoveThread.Create(PaintBox3);//Создается поток

    Thread[3].Priority:=tpLowest; //Устанавливается небольшой приоритет у потока, чтобы поток был управляемым и не забирал все ресурсы.

    RadioButton2.Checked:=true;

    check:=false;

    end;

    procedure TForm1.Button1Click(Sender: TObject);

    var

    x:integer;

    begin

    RadioButton1.Enabled:=false;

    RadioButton2.Enabled:=False;

    RadioButton3.Enabled:=False;

    RadioButton4.Enabled:=False;

    RadioButton5.Enabled:=False;

    Button1.Enabled:=false;

    TrackBar1.enabled:=false;

    if RadioButton1.checked=true then level:=3;

    if RadioButton2.checked=true then level:=2;

    if RadioButton3.checked=true then level:=1;

    for x:=1 to level do

    begin

    thread[x].DoVisualSwap;

    Thread[x].resume;

    check:=true;

    end;

    end;

    procedure TForm1.Button3Click(Sender: TObject);

    var

    x:integer;

    begin

    RadioButton1.Enabled:=true;

    RadioButton2.Enabled:=true;

    RadioButton3.Enabled:=true;

    RadioButton4.Enabled:=true;

    RadioButton5.Enabled:=true;

    Button1.Enabled:=true;

    TrackBar1.enabled:=true;

    check:=false;

    for x:=1 to level do

    begin

    PaintBox1.Refresh;

    PaintBox2.Refresh;

    PaintBox3.Refresh;

    Thread[x].er:=0;

    edit1.Text:=inttostr(0);

    thread[x].terminate;

    thread[x].DoVisualSwap;

    end;

    label3.Caption:='';

    end;

    procedure TForm1.Button2Click(Sender: TObject);

    begin

    Close;

    end;

    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

    var

    x:integer;

    begin

    if check=true then

    begin

    for x:= 1 to level do

    if thread[x].b0 = Key then

    begin

    thread[x].DoVisualSwap;

    PaintBox1.Refresh;

    PaintBox2.Refresh;

    PaintBox3.Refresh;

    exit;

    end;

    thread[1].er:=(thread[1].er)+1;

    end;

    end;

    procedure TForm1.Timer1Timer(Sender: TObject);

    var

    x:integer;

    begin

    for x:=1 to level do

    begin

    if check=true then

    begin

    thread[x].Execute;

    thread[x].go:=true;

    edit1.Text:=inttostr((thread[1].er)+(thread[2].er)+(thread[3].er));

    end;

    end;

    end;

    procedure TForm1.TrackBar1Change(Sender: TObject);

    begin

    Timer1.Interval := 70 - TrackBar1.Position*20;

    end;

    procedure TForm1.Timer2Timer(Sender: TObject);

    begin

    if edit1.Text='10' then

    begin

    button3.Click;

    Button1.Enabled:=false;

    label3.Caption:='вы проиграли!';

    end;

    if edit1.Text='11' then

    begin

    button3.Click;

    Button1.Enabled:=false;

    label3.Caption:='вы проиграли!';

    end;

    if edit1.Text='12' then

    begin

    button3.Click;

    Button1.Enabled:=false;

    label3.Caption:='вы проиграли!';

    end;

    end;

    end.

    unit car1;

    interface

    uses

    Classes, Graphics, ExtCtrls, SysUtils;

    type

    TMoveThread = class(TThread)

    private

    protected

    public

    FBox: TPaintBox; // Где воспроизводится картинка

    i:integer; // Для определения координат картинки

    b0: char;

    go: boolean;

    er: integer;

    procedure Execute; override;

    procedure DoVisualSwap;

    constructor Create(c:TPaintBox);

    destructor Destroy; override;

    end;

    implementation

    uses move;

    constructor TMoveThread.Create(c:TPaintBox);

    begin

    Fbox:=c;go:=false;er:=0;

    inherited Create(False);

    end;

    procedure TMoveThread.DoVisualSwap;

    begin

    i:=0;

    if form1.RadioButton4.Checked=true then b0:=chr(random(26)+97)

    else b0:=chr(random(32)+224);

    end;

    procedure TMoveThread.Execute;

    begin

    if go=true then

    begin

    FBox.Canvas.textout(20,i,b0);

    i:=i+1;

    go:=false;

    end;

    while i>(fbox.Height) do

    begin

    er:=er+1;

    synchronize(DoVisualSwap);

    end;

    end;

    destructor TMoveThread.Destroy;

    begin

    b0:=#0;

    inherited Destroy;

    end;

    end.

    1. Разработайте приложение, демонстрирующее поиск решения задачи «Лабиринт». Формулировка задачи:

    Дано прямоугольное поле размером MxN клеток. На поле задана произвольная система препятствий, начальная клетка, в которой находится «Черепашка», и конечная клетка. Найдите маршрут выхода «Черепашки» из лабиринта, если он существует, и пронумеруйте клетки маршрута в том порядке, в котором проходит их «Черепашка». «Черепашка» может делать шаг на одну клетку в любом из четырех направлений: влево, вправо, вверх, вниз.

    Исходная форма приложения:



    Рисунок 14 – форма игры Лабиринт

    Прохождение лабиринта:



    Рисунок 15 – прохождение лабиринта

    Отсутствие решения:



    Рисунок 16 – отсутствие решения

    Код программы:

    unit Unit1;

    interface

    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, StdCtrls, Grids, ExtCtrls, Spin, ImgList;

    type

    TForm1 = class(TForm)

    Button1: TButton;

    GroupBox1: TGroupBox;

    RadioButton1: TRadioButton;

    RadioButton2: TRadioButton;

    RadioButton3: TRadioButton;

    RadioButton4: TRadioButton;

    SpinEdit1: TSpinEdit;

    SpinEdit2: TSpinEdit;

    StaticText1: TStaticText;

    StaticText2: TStaticText;

    Button2: TButton;

    Button3: TButton;

    DrawGrid1: TDrawGrid;

    ImageList1: TImageList;

    Timer1: TTimer;

    Button4: TButton;

    StringGrid1: TStringGrid;

    Button5: TButton;

    procedure Button1Click(Sender: TObject);

    procedure SpinEdit1Change(Sender: TObject);

    procedure SpinEdit2Change(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;

    var CanSelect: Boolean);

    procedure Timer1Timer(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure Button5Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;

    var

    Form1: TForm1;

    m, n, sx, sy, fx, fy: integer; //размер лабиринта, координаты в массиве лабиринта а старта и финиша

    a,b: array[0..20, 0..20] of integer; //массивы лабиринта а и b

    go: boolean;

    done: boolean;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);

    var c,r: integer;

    begin

    SpinEdit1.Text:='10'; // начальный размер

    SpinEdit2.Text:='10'; // лабиринта

    sx:=0;sy:=0;fx:=strtoint(SpinEdit1.Text)-1;fy:=strtoint(SpinEdit2.Text)-1;

    RadioButton1.Checked:=true;

    a[fx,fy]:=1;

    a[sx,sy]:=2;

    for c:=0 to m do

    for r:=0 to n do b[c,r]:=0;

    end;

    procedure TForm1.SpinEdit1Change(Sender: TObject); //изменение ширины

    var c,r: integer;

    begin

    DrawGrid1.ColCount:=strtoint(SpinEdit1.Text);

    m:=strtoint(SpinEdit1.Text);

    DrawGrid1.Canvas.Rectangle(-1,-1,DrawGrid1.Width-1,DrawGrid1.Height-1);

    DrawGrid1.Repaint;

    sx:=0;sy:=0;fx:=m-1;fy:=n-1;

    for c:=0 to m do

    for r:=0 to n do begin a[c,r]:=0; b[c,r]:=0; end;

    a[sx,sy]:=2;

    fx:=m-1;

    a[fx,fy]:=1;

    end;

    procedure TForm1.SpinEdit2Change(Sender: TObject); //изменение высоты

    var c,r: integer;

    begin

    DrawGrid1.RowCount:=strtoint(SpinEdit2.Text);

    n:=strtoint(SpinEdit2.Text);

    DrawGrid1.Canvas.Rectangle(-1,-1,DrawGrid1.Width-1,DrawGrid1.Height-1);

    DrawGrid1.Repaint;

    sx:=0;sy:=0;fx:=m-1;fy:=n-1;

    for c:=0 to m+1 do

    for r:=0 to n+1 do begin a[c,r]:=0; b[c,r]:=0; end;

    a[fx,fy]:=1;a[sx,sy]:=2;

    a[fx,fy]:=0;

    fy:=n-1;

    a[fx,fy]:=1;

    end;

    procedure TForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;

    var CanSelect: Boolean); //построение лабиринта

    begin

    if (ACol=SX) and (ARow=SY)

    then exit;

    if (ACol=FX) and (ARow=FY)

    then exit;

    if radiobutton2.Checked=true then //препятствие

    begin

    a[acol,arow]:=-1;

    DrawGrid1.Canvas.Rectangle(acol*35-1,arow*35-1,acol*35+35,arow*35+35);

    ImageList1.Draw(DrawGrid1.Canvas,ACol*35+2,ARow*35+2,0);

    end;

    if radiobutton1.Checked=true then //старт

    begin

    a[sx,sy]:=0;

    a[acol,arow]:=2;

    DrawGrid1.Canvas.Rectangle(sx*35-1,sy*35-1,sx*35+35,sy*35+35);

    sx:=acol; sy:=arow;

    DrawGrid1.Canvas.Rectangle(acol*35-1,arow*35-1,acol*35+35,arow*35+35);

    ImageList1.Draw(DrawGrid1.Canvas,ACol*35+2,ARow*35+2,2);

    end;

    if radiobutton3.Checked=true then //финиш

    begin

    a[fx,fy]:=0;

    a[acol,arow]:=1;

    DrawGrid1.Canvas.Rectangle(fx*35-1,fy*35-1,fx*35+35,fy*35+35);

    fx:=acol; fy:=arow;

    DrawGrid1.Canvas.Rectangle(acol*35-1,arow*35-1,acol*35+35,arow*35+35);

    ImageList1.Draw(DrawGrid1.Canvas,ACol*35+2,ARow*35+2,1);

    end;

    if radiobutton4.Checked=true then //удалить препятствие

    begin

    a[ACol, ARow]:=0;

    DrawGrid1.Canvas.Rectangle(acol*35-1,arow*35-1,acol*35+35,arow*35+35);

    end;

    DrawGrid1.Repaint;

    end;

    procedure TForm1.Button3Click(Sender: TObject); //очистка лабиринта полностью

    var c,r: integer;

    begin

    DrawGrid1.Canvas.Rectangle(-1,-1,DrawGrid1.Width-1,DrawGrid1.Height-1);

    DrawGrid1.Repaint;

    sx:=0;sy:=0;fx:=m-1;fy:=n-1;

    for c:=0 to m do

    for r:=0 to n do begin a[c,r]:=0; b[c,r]:=0; end;

    a[fx,fy]:=1;a[sx,sy]:=2;

    end;

    procedure TForm1.Button2Click(Sender: TObject); //поиск пути

    var

    count, k, i, j,c,r: integer;

    begin

    count:=0;

    i:=sx; j:=sy;

    a[i,j]:=0; b[i,j]:=1;

    for k:=0 to 200 do

    begin

    if ((a[i+1,j]=0)or(a[i+1,j]=1)) and (b[i+1,j]=0) then

    begin

    inc(i); if a[i,j]=1 then //идем вправо

    begin

    showmessage('Путь найден!');

    //for c:=0 to m do

    // for r:=0 to n do begin b[c,r]:=0; end;

    exit;

    end;

    b[i,j]:=1; inc(count);

    DrawGrid1.Canvas.textout(i*35+5,j*35+5,inttostr(count));

    end;

    if ((a[i-1,j]=0)or(a[i-1,j]=1)) and (b[i-1,j]=0) then

    begin

    dec(i); if a[i,j]=1 then //идем влево

    begin

    showmessage('Путь найден!');

    //for c:=0 to m do

    // for r:=0 to n do begin b[c,r]:=0; end;

    exit;

    end;

    b[i,j]:=1;inc(count);

    DrawGrid1.Canvas.textout(i*35+5,j*35+5,inttostr(count));

    end;

    if ((a[i,j+1]=0)or(a[i,j+1]=1)) and (b[i,j+1]=0) then

    begin

    inc(j); if a[i,j]=1 then //идем вверх

    begin

    showmessage('Путь найден!');

    //for c:=0 to m do

    // for r:=0 to n do begin b[c,r]:=0; end;

    exit;

    end;

    b[i,j]:=1;inc(count);

    DrawGrid1.Canvas.textout(i*35+5,j*35+5,inttostr(count));

    end;

    if ((a[i,j-1]=0)or(a[i,j-1]=1)) and (b[i,j-1]=0) then

    begin

    dec(j); if a[i,j]=1 then //идем вниз

    begin

    showmessage('Путь найден!');

    //for c:=0 to m do

    // for r:=0 to n do begin b[c,r]:=0; end;

    exit;

    end;

    b[i,j]:=1;inc(count);

    DrawGrid1.Canvas.textout(i*35+5,j*35+5,inttostr(count));

    end;

    if ((a[i+1,j]=-1)or(b[i+1,j]=1)) // условие невозможности поиска выхода

    and((a[i-1,j]=-1)or(b[i-1,j]=1))

    and((a[i,j+1]=-1)or(b[i,j+1]=1))

    and((a[i,j-1]=-1)or(b[i,j-1]=1)) then

    begin

    showmessage('Пути не существует');

    a[sx,sy]:=2;

    exit;

    end;

    end;

    end;

    procedure TForm1.Timer1Timer(Sender: TObject); //прорисовка компонентов

    var c,r:integer;

    begin

    ImageList1.Draw(DrawGrid1.Canvas,sx*35+2,sy*35+2,2);

    ImageList1.Draw(DrawGrid1.Canvas,fx*35+2,fy*35+2,1);

    for c:=0 to m do

    for r:=0 to n do

    begin

    if a[c,r]=-1 then ImageList1.Draw(DrawGrid1.Canvas,c*35+2,r*35+2,0);

    end;

    end;

    procedure TForm1.Button1Click(Sender: TObject);

    begin //выход из игры

    Close;

    end;

    procedure TForm1.Button4Click(Sender: TObject); //отображение массива а

    var c,r: integer;

    begin

    for c:=0 to m do

    for r:=0 to n do

    begin

    stringgrid1.Colcount:=m;

    stringgrid1.rowcount:=n;

    stringgrid1.Cells[c,r]:= inttostr(a[c,r]);

    end;

    end;

    procedure TForm1.Button5Click(Sender: TObject); //отображение массива b

    var c,r: integer;

    begin

    for c:=0 to m do

    for r:=0 to n do

    begin

    stringgrid1.Colcount:=m;

    stringgrid1.rowcount:=n;

    stringgrid1.Cells[c,r]:= inttostr(b[c,r]);

    end;

    end;

    end.


    написать администратору сайта