GoodWind , на самом деле , всё очень просто .
Берём массив типа point ( x,y : integer), на N снежинок .
Забиваем его случайным образом , в пределах рамок (их можно регулировать при компиляции) . А дальше дело за малым :
Вот собственно Алгоритм .Код
procedure MainSnowProcedure;
var i , j , rx ,ry , Lw , k: integer;
begin
for i := 1 to n do begin
putpixel(Snow[i].x,Snow[i].y,BGcol); { Stiraem snezinku }
LW := wind;
k :=((brightx-bleftx) div 15);
repeat
rx := randomx;
if (((rx > brightx - abs(windver)*k) ) and (windver < 0 )) or (((rx < abs(windver)*k)) and (windver > 0)) then begin
ry := randomyf;
if windver < 0 then rx := brightx - random(4)+2
else rx := random(4)+2;
end
else begin
rx := randomx;
ry := randomy(dy); {random(4)+1}
end;
until (getpixel(rx,ry) <> snowcol) and (rx < brightx) and (rx > bleftx) and (ry > bupy) and (ry < bbottomy-4);
if (getpixel(snow[i].x+lw,snow[i].y+dy)=snowcol) and not(insnow(snow[i].x+lw,snow[i].y+dy)) then begin
if (getpixel(snow[i].x,snow[i].y+dy)=snowcol) and not(insnow(snow[i].x,snow[i].y+dy)) then begin
if (getpixel(snow[i].x-lw,snow[i].y+dy)<>snowcol) and not(insnow(snow[i].x-lw,snow[i].y+dy)) then begin
snow[i].x := snow[i].x - lw;
Snow[i].y := Snow[i].y + dy;
end
else begin
putpixel(snow[i].x,snow[i].y,snowcol);
snow[i].x := rx;
snow[i].y := ry;
inc(m);
end;
end
else begin
Snow[i].y := Snow[i].y + dy;
end;
end
else begin
snow[i].x := snow[i].x + lw;
Snow[i].y := Snow[i].y + dy;
end;
{-}
putpixel(Snow[i].x,Snow[i].y,SnowCol); { Risuem Snezinku}
end;
end;
Вот пару необходимых ф-ций и процедур .Код
function insnow(x,y : integer):boolean;
var res : boolean;
i : integer;
begin
res := false;
for i := 1 to n do begin
if (Snow[i].x = x ) and (snow[i].y = y) then begin
res := true;
end;
end;
insnow:=res;
end;
Код
function RandomX :integer;
begin
RandomX := random(Brightx-bleftx+1)+bleftx;
end;
{--}
function RandomY(k:integer) :integer;
begin
if k > 0 then
RandomY :=bupy + random(4)+2
else if k < 0 then
RandomY :=bbottomy -5 - (random(4)+1);
end;
{--}
function RandomYf:integer;
begin
RandomYf :=bupy + random(BbottomY-bupy-4)+2;
end;
А вот какие настройки в нем есть (есть очень даже забавные - снег падает снизу вверх
) )
Код
const weidht = 639; {639}
height = 458; {458} {Bolshe nelzja ! Mozno menshe;) }
x = 0; {0}
y =0; {0}
BleftX = x; {B - prefix = BORDER}
BrightX = bleftx +weidht;
Bupy = y;
BbottomY = Bupy +height;
CenterX = 320; {320}
n = 550; { Koli4estvo snezinok} { ot 10 }
SnowCol = white;
BGcol = black;
barcol = green;
left = #75;
right = #77;
Kend = #79;
esc = #27;
dy = 1; {1 - s verhu v niz , -1 - snizu vverh}
Если что-то непонятно , то спрашивай . ;)
Двадцать пятый час в сутках может появиться всего лишь из-за небольшой ошибки в программе.
Чтобы не воспользоваться сумасшедшими возможностями, нужно быть идиотом.