close

Вход

Забыли?

вход по аккаунту

?

отчёт 1 лаба (2)

код для вставкиСкачать
Федеральное агентство по образованию
Рязанский государственный радиотехнический университет
Кафедра ЭВМ
Отчет О лабораторной работе №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;
2) Для работы приложения нам потребуется класс 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.
3) Создается многопоточное приложение, в котором демонстрируется образование, приостановка и изменение приоритетов нескольких потоков.
В программе создается три потока, каждый из которых перемещает изображение (например, автомобиль) по форме.
Примеры выполнения приложения:
Рисунок 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.
2. Разработайте многопоточное приложение "Клавиатурный тренажер" по следующим условиям. Пользователь имеет возможность задать один из трех уровней: "Новичок", "Любитель", "Мастер". В зависимости от уровня в каждый момент времени от верхней до нижней границ рабочей области тренажера падает одна, две или три буквы. Пользователю необходимо за время падения букв успеть нажать соответствующие клавиши на клавиатуре. При неверном нажатии фиксируются ошибки, число которых подсчитывается. Скорость падения букв регулируется. Тренажер должен работать с русским и латинским алфавитами.
Форма приложения:
Рисунок 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.
3. Разработайте приложение, демонстрирующее поиск решения задачи "Лабиринт". Формулировка задачи:
Дано прямоугольное поле размером 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.
38
Документ
Категория
Рефераты
Просмотров
1 356
Размер файла
1 048 Кб
Теги
лаба, отчет
1/--страниц
Пожаловаться на содержимое документа