[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{If you have any questions please send me mail at OleRom@hotmail.com}
Program Worm;
Const GetMaxX = 320;
GetMaxY = 200;
Levo = 1;
Desno = 2;
Gor = 3;
Dol = 4;
KeyPort = $60;
PortESCAPE = 01;
PortLeft = 75;
PortRight = 77;
PortUp = 72;
PortDown = 80;
X : Word = 107;
Y : Word = 100;
Smer : Byte = Levo;
UserX : Word = 213;
UserY : Word = 100;
UserSmer : Byte = Gor;
Counter : Word = 0;
Back = 5;
Type ScreenType = Array[1..200,1..320] of Byte;
Var Screen : ScreenType absolute $A000:$0000;
ScrBuff: Array[1..65535] of Byte absolute Screen;
Fo : Word;
Procedure SetPal(Color,R,G,B:Byte); assembler;
asm
mov dx,03C8h
mov al,[Color]
out dx,al
inc dx
mov al,[R]
out dx,al
mov al,[G]
out dx,al
mov al,[B]
out dx,al
end;
Procedure Delay(ms:word); assembler;
asm
mov ax,1000
mul ms
mov cx,dx
mov dx,ax
mov ah,86h
int 15h
end;
Procedure WormExit;
Begin
Halt;
End;
Procedure UserGameOver;
Begin
SetPal(0,60,30,30);
ReadLn;
Halt;
End;
Procedure GameOver;
Begin
SetPal(0,30,30,60);
ReadLn;
Halt;
End;
Function KeyPressed:boolean; assembler;
asm
mov bx,40h
mov es,bx
mov ax,word ptr es:[001Ch]
sub ax,word ptr es:[001Ah]
end;
Procedure EmptyKeyBuffer;
Begin
While KeyPressed do
asm
xor ah,ah
int 16h
end;
End;
Function LevoDesno : Byte;
Var L, D : Word;
Begin
L := 1;
D := 1;
While Screen[Y,X-L] = Back do Inc(L);
While Screen[Y,X+D] = Back do Inc(D);
If D > L then LevoDesno := Desno else LevoDesno := Levo;
End;
Function GorDol : Byte;
Var G, D : Word;
Begin
G := 1;
D := 1;
While Screen[Y-G,X] = Back do Inc(G);
While Screen[Y+D,X] = Back do Inc(D);
If D > G then GorDol := Dol else GorDol := Gor;
End;
Function TestLevoDesno : Byte; {Levo = True}
Label Konec;
Var AllCounter : Word;
LeftCounter, RightCounter : Word;
Xc, Yc : Word;
Bc : Boolean;
Begin
TestLevoDesno := Gor;
AllCounter := 0;
LeftCounter := 0;
RightCounter := 0;
For Xc := 0 to 65535 do If ScrBuff[Xc] = Back then Inc(AllCounter);
If (Screen[Y,X-1] <> Back) and (Screen[Y,X+1] = Back) then Begin TestLevoDesno := Desno; Goto Konec; End;
If (Screen[Y,X-1] = Back) and (Screen[Y,X+1] <> Back) then Begin TestLevoDesno := Levo ; Goto Konec; End;
If (Screen[Y,X-1] <> Back) and (Screen[Y,X+1] <> Back) and
(Screen[Y-1,X] <> Back) and (Screen[Y+1,X] = Back) then Begin TestLevoDesno := Dol; Goto Konec; End;
If (Screen[Y,X-1] <> Back) and (Screen[Y,X+1] <> Back) and
(Screen[Y-1,X] = Back) and (Screen[Y+1,X] <> Back) then Begin TestLevoDesno := Gor; Goto Konec; End;
If (Screen[Y,X-1] = Back) and (Screen[Y,X+1] = Back) then
Begin
{Test Levo...}
Screen[Y,X-1] := 9;
Inc(LeftCounter);
Bc := True;
While Bc do
For Yc := 2 to 199 do
For Xc := 2 to 319 do
If Screen[Yc,Xc] = 9 then
Begin
If Screen[Yc-1,Xc] = Back then
Begin
Inc(LeftCounter);
Bc := True;
End;
End;
End;
Konec:
End;
Begin
Randomize;
asm
mov ax,0013h
int 10h
end;
SetPal(0,30,40,15); {Svetlo zelena - konec}
SetPal(5,20,30,5); {Temno zelena - plac }
SetPal(9,10,20,0); {Temo Temno zelena - plac pri farbanju}
SetPal(6,10,0,0); {Crna - rob }
SetPal(7,40,50,40); {Bela - rob }
SetPal(3,60,10,15); {Rdeca - user }
SetPal(4,50,0,5); {Rdeca - user }
SetPal(1,15,10,60); {Modra - worm }
SetPal(2,5,0,50); {Modra - worm }
FillChar(Screen,64000,5);
For Fo := 1 to GetMaxX do Screen[1,Fo] := 6;
For Fo := 1 to GetMaxX do Screen[GetMaxY,Fo] := 7;
For Fo := 1 to GetMaxY do Screen[Fo,1] := 6;
For Fo := 1 to GetMaxY do Screen[Fo,GetMaxX] := 7;
Screen[UserY,UserX] := 4;
Screen[Y,X] := 2;
Repeat Until KeyPressed;
EmptyKeyBuffer;
Repeat
Case Port[KeyPort] of
PortESCAPE : WormExit;
PortLeft : UserSmer := Levo;
PortRight : UserSmer := Desno;
PortUp : UserSmer := Gor;
PortDown : UserSmer := Dol;
end;
Case UserSmer of
Desno : Inc(UserX);
Levo : Dec(UserX);
Gor : Dec(UserY);
Dol : Inc(UserY);
end;
{+++++++++++++++++++++++++++++++++++}
{++ Worm IQ ++}
{+++++++++++++++++++++++++++++++++++}
Case Smer of
Levo : Begin
Fo := 1;
While Screen[Y,X-Fo] = Back do Inc(Fo);
If Fo < Random(9)+8 then Smer := GorDol;
End;
Desno : Begin
Fo := 1;
While Screen[Y,X+Fo] = Back do Inc(Fo);
If Fo < Random(9)+8 then Smer := GorDol;
End;
Gor : Begin
Fo := 1;
While Screen[Y-Fo,X] = Back do Inc(Fo);
If Fo < Random(9)+8 then Smer := LevoDesno
End;
Dol : Begin
Fo := 1;
While Screen[Y+Fo,X] = Back do Inc(Fo);
If Fo < Random(9)+8 then Smer := LevoDesno
End;
end;
{-----------------------------------}
{-- Worm IQ --}
{-----------------------------------}
Case Smer of
Levo: Begin
If Screen[Y,X-1] <> Back then
Begin
If Screen[Y,X+1] = Back then Smer := Desno;
If Screen[Y-1,X] = Back then Smer := Gor;
If Screen[Y+1,X] = Back then Smer := Dol;
End;
End;
Desno: Begin
If Screen[Y,X+1] <> Back then
Begin
If Screen[Y,X-1] = Back then Smer := Levo;
If Screen[Y-1,X] = Back then Smer := Gor;
If Screen[Y+1,X] = Back then Smer := Dol;
End;
End;
Gor: Begin
If Screen[Y-1,X] <> Back then
Begin
If Screen[Y,X-1] = Back then Smer := Levo;
If Screen[Y,X+1] = Back then Smer := Desno;
If Screen[Y+1,X] = Back then Smer := Dol;
End;
End;
Dol: Begin
If Screen[Y+1,X] <> Back then
Begin
If Screen[Y,X-1] = Back then Smer := Levo;
If Screen[Y,X+1] = Back then Smer := Desno;
If Screen[Y-1,X] = Back then Smer := Gor;
End;
End;
end;
Case Smer of
Levo : Dec(X);
Desno : Inc(X);
Gor : Dec(Y);
Dol : Inc(Y);
end;
Inc(Counter);
If Screen[UserY,UserX] <> Back then UserGameOver;
If Screen[Y,X] <> Back then GameOver;
If Odd(Counter) then Screen[UserY,UserX] := 3 else Screen[UserY,UserX] := 4;
If Odd(Counter) then Screen[Y,X] := 1 else Screen[Y,X] := 2;
EmptyKeyBuffer;
Delay(25);
Until False;
End.
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]