Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет «Львівська політехніка»
/
Лабораторна робота на Delphi №7.
Створення багатопотокових ужитків
Створення багатопотокових ужитків
Мета роботи: Вивчення можливостей системи програмування Delphi 7 по створенню багатопотокових ужитків.
Завдання
Створити проект - модель гри "Рухомий хробак". Переміщення хробака здійснюється в основному модулі, для відображення появи маленьких кульок, які з’їдає хробак, використати окремий потік.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
food: TShape;
s1: TShape;
s2: TShape;
s3: TShape;
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Thread : Time;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Thread:=Time.Create(True);
Thread.FreeOnTerminate:=true;
Thread.Priority:=tpTimeCritical;
Thread.Resume;
score:=0;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key=vk_left) then begin dx:=-1; dy:=0; end;
if (key=vk_right) then begin dx:=1; dy:=0; end;
if (key=vk_up) then begin dx:=0; dy:=-1; end;
if (key=vk_down) then begin dx:=0; dy:=1; end;
end;
end.
unit Unit2;
interface
uses
Classes, SysUtils, Dialogs;
type
Time = class(TThread)
private
procedure Myfood;
procedure snake;
procedure eat;
procedure crash;
protected
procedure Execute; override;
end;
var dx,dy,oldx1,oldy1,oldx2,oldy2,score:integer;
implementation
uses Unit1;
procedure Time.Myfood();
begin
Repeat
Form1.food.Top:=(Random(11)*25);
Form1.food.Left:=(Random(11)*25);
until ((Form1.food.Top<>Form1.s1.Top) and (Form1.food.Left<>Form1.s1.Left)) or
((Form1.food.Top<>Form1.s2.Top) and (Form1.food.Left<>Form1.s2.Left)) or
((Form1.food.Top<>Form1.s3.Top) and (Form1.food.Left<>Form1.s3.Left));
end;
procedure Time.snake();
begin
oldx1:=Form1.s1.Left;
oldy1:=Form1.s1.Top;
Form1.s1.Top:=Form1.s1.Top+dy*25;
Form1.s1.left:=Form1.s1.left+dx*25;
if ((dx=-1) and (dy=0)) then
begin
oldx2:=Form1.s2.Left;
oldy2:=Form1.s2.Top;
Form1.s2.Left:=oldx1;
Form1.s2.Top:=oldy1;
Form1.s3.Left:=oldx2;
Form1.s3.Top:=oldy2;
end;
if (dx=1) and (dy=0) then
begin
oldx2:=Form1.s2.Left;
oldy2:=Form1.s2.Top;
Form1.s2.Left:=oldx1;
Form1.s2.Top:=oldy1;
Form1.s3.Left:=oldx2;
Form1.s3.Top:=oldy2;
end;
if (dx=0) and (dy=1) then
begin
oldx2:=Form1.s2.Left;
oldy2:=Form1.s2.Top;
Form1.s2.Left:=oldx1;
Form1.s2.Top:=oldy1;
Form1.s3.Left:=oldx2;
Form1.s3.Top:=oldy2;
end;
if (dx=0) and (dy=-1) then
begin
oldx2:=Form1.s2.Left;
oldy2:=Form1.s2.Top;
Form1.s2.Left:=oldx1;
Form1.s2.Top:=oldy1;
Form1.s3.Left:=oldx2;
Form1.s3.Top:=oldy2;
end;
sleep(500);
end;
procedure Time.eat();
begin
if ((Form1.s1.Top=Form1.food.Top) and (Form1.s1.Left=Form1.food.Left)) then
Begin
score:=score+1;
Myfood();
end;
end;
procedure Time.crash();
begin
if (Form1.s1.Top<0) or (Form1.s1.Top>300) or (Form1.s1.Left<0) or (Form1.s1.Left>300) then
begin
MessageDlg('You crashed. Your score = '+inttostr(score), mtError,[mbOk], 0);
Form1.Close();
end;
end;
procedure Time.Execute;
begin
repeat
Synchronize(Snake);
Synchronize(Crash);
Synchronize(eat);
until Terminated;
end;
end.