program FLAME;
{$R-}
type TScr = array[0..202,0..319] of Byte;
var Scr: TScr absolute $A000:$0000;
procedure SetPalette;
var N : Longint;
begin
Port[$3C8] := 0;
for N := 0 to 63 do begin
Port[$3C9] := N;
Port[$3C9] := 0{(N+64) div 65 * Sqr(63-N) div 128{};
Port[$3C9] := 0{(N+64) div 65 * Sqr(63-N) div 128{};
end;
for N := 64 to 255 do begin
Port[$3C9] := 0;
Port[$3C9] := 0;
Port[$3C9] := 0;
end;
end; {of SetPalette}
var X, Y, S, I: Integer;
begin
asm mov ax,$13; int $10; end;
SetPalette;
for X:=48 to 319-48 do
for Y:=100-7 to 100+7 do
Scr[Y,X]:=255*(X*Y and 3);
Scr[130,319-30]:=63;
{ for X:=0 to 319 do
for Y:=0 to 199 do
Scr[Y,X]:=255;
Scr[100,160]:=63;{}
repeat
for I:=1 to 1000 do begin
X:=Random(318)+1;
Y:=Random(200)+1;
S:=Scr[Y,X];
if (S<64) and (S>0) then begin
Dec(S);
if S>63 then S:=63;
{ if Scr[Y-3,X]<64 then Scr[Y-3,X]:=S else if S>0 then S:=63;{Scr[Y-3,X]:=63;{}
if Scr[Y-2,X]<64 then Scr[Y-2,X]:=S else S:=63;{Scr[Y-2,X]:=63;{}
if Scr[Y-1,X]<64 then Scr[Y-1,X]:=S else S:=63;{Scr[Y-1,X]:=63;{}
if Scr[Y+1,X]<64 then Scr[Y+1,X]:=S else S:=63;{Scr[Y+1,X]:=63;{}
if Scr[Y,X-1]<64 then Scr[Y,X-1]:=S else S:=63;{Scr[Y,X-1]:=63;{}
if Scr[Y,X+1]<64 then Scr[Y,X+1]:=S else S:=63;{Scr[Y,X+1]:=63;{}
end;
end;
until Port[$60]<128;
asm mov ax,$03; int $10; end;
end.
Просьба помочь с комментариями
Просьба помочь с комментариями и описанием алгоритма
о, а нельзя сказать хотя бы что должна делать функция? а то сидеть разбирать весь этот код мало кто захочет имхо...
оп, сори, программа иммитирует поджиг и сгорание полоски бумаги...
Код:
program FLAME;
{$R-}
{ проверка віхода за область диапазона выключена}
type TScr = array[0..202,0..319] of Byte; { массив - растр}
var Scr: TScr absolute $A000:$0000; { переменная расположена с начальной области видеопамяти в режиме $13 }
procedure SetPalette; {установка палитры всего 255 цветов}
var N : Longint;
begin
Port[$3C8] := 0; {индексный порт}
for N := 0 to 63 do begin
Port[$3C9] := n;{ red }
Port[$3C9] := 0; {green}
Port[$3C9] := 0; {blue}
end;
{обнуление оставшейся палитры }
for N := 64 to 255 do begin
Port[$3C9] := 0;
Port[$3C9] := 0;
Port[$3C9] := 0;
end;
end;
var X, Y, S, I: Integer;
begin
asm mov ax,$13; int $10; end; {установка видеорежима }
SetPalette; {установка палитры всего 255 цветов}
for X:=48 to 319-48 do {прорисовка области для огня}
for Y:=100-7 to 100+7 do
Scr[Y,X]:=255*(X*Y and 3);
Scr[130,319-30]:=63;
repeat { прорисовка огня}
for I:=1 to 1000 do begin
X:=Random(318)+1;
Y:=Random(200)+1;
S:=Scr[Y,X];
if (S<64) and (S>0) then begin
Dec(S);
if S>63 then S:=63;
if Scr[Y-2,X]<64 then Scr[Y-2,X]:=S else S:=63;
if Scr[Y-1,X]<64 then Scr[Y-1,X]:=S else S:=63;
if Scr[Y+1,X]<64 then Scr[Y+1,X]:=S else S:=63;
if Scr[Y,X-1]<64 then Scr[Y,X-1]:=S else S:=63;
if Scr[Y,X+1]<64 then Scr[Y,X+1]:=S else S:=63;
end;
end;
until Port[$60]<128; { пока не нажата клавиша}
asm mov ax,$03; int $10; end; {возврат к режиму 03h }
end.
{$R-}
{ проверка віхода за область диапазона выключена}
type TScr = array[0..202,0..319] of Byte; { массив - растр}
var Scr: TScr absolute $A000:$0000; { переменная расположена с начальной области видеопамяти в режиме $13 }
procedure SetPalette; {установка палитры всего 255 цветов}
var N : Longint;
begin
Port[$3C8] := 0; {индексный порт}
for N := 0 to 63 do begin
Port[$3C9] := n;{ red }
Port[$3C9] := 0; {green}
Port[$3C9] := 0; {blue}
end;
{обнуление оставшейся палитры }
for N := 64 to 255 do begin
Port[$3C9] := 0;
Port[$3C9] := 0;
Port[$3C9] := 0;
end;
end;
var X, Y, S, I: Integer;
begin
asm mov ax,$13; int $10; end; {установка видеорежима }
SetPalette; {установка палитры всего 255 цветов}
for X:=48 to 319-48 do {прорисовка области для огня}
for Y:=100-7 to 100+7 do
Scr[Y,X]:=255*(X*Y and 3);
Scr[130,319-30]:=63;
repeat { прорисовка огня}
for I:=1 to 1000 do begin
X:=Random(318)+1;
Y:=Random(200)+1;
S:=Scr[Y,X];
if (S<64) and (S>0) then begin
Dec(S);
if S>63 then S:=63;
if Scr[Y-2,X]<64 then Scr[Y-2,X]:=S else S:=63;
if Scr[Y-1,X]<64 then Scr[Y-1,X]:=S else S:=63;
if Scr[Y+1,X]<64 then Scr[Y+1,X]:=S else S:=63;
if Scr[Y,X-1]<64 then Scr[Y,X-1]:=S else S:=63;
if Scr[Y,X+1]<64 then Scr[Y,X+1]:=S else S:=63;
end;
end;
until Port[$60]<128; { пока не нажата клавиша}
asm mov ax,$03; int $10; end; {возврат к режиму 03h }
end.