[Pascal] procedura z grafiką

0

Witam,
jestem początkujący w Pascalu, używam wersji Borlanda 7.0 i natrafiłem na problem z grafiką... Mam procedurę, która wyświetla obiekt i chciałbym tą procedurę wykonać kilka razy. Używam do tego oczywiście pętli FOR ale wychodzą mi przedziwne rzeczy... Gdy pętlę wykonuję 3 razy to obraz pokazuje się niekiedy jeden raz a niekiedy trzy razy. Gdy wykonuję pętlę z procedurą 50 razy - to obraz pokazuję się zaledwie kilka razy i na dodatek układa się w określonym schemacie a jego połorzenie X i Y jest losowe!
Nie mam pojęcia jak wyświetlać w losowym miejscu grafikę, za pomocą procedury, powiedzmy: 15 razy. Celem mojego programu jest wyświetlenie na ekranie 15 kwadracików w losowych (X,Y). Oto kod:

program telewizor;
uses crt, graph;
var driver,mode,x,y,a,b,i,n: integer;

procedure kwadracik(x,y:integer);
          begin
          Rectangle(x,y,x+20,y+20);
          SetFillStyle(1,red);
          Bar(x+1,y+1,x+7,y+18);
          SetFillStyle(1,green);
          Bar(x+8,y+1,x+13,y+18);
          SetFillStyle(1,blue);
          Bar(x+14,y+1,x+19,y+18);
          end;
BEGIN
clrscr;

{ max a: 639 }
{ max b: 479 }

driver:=DETECT;
InitGraph(driver,mode,'C:\BGI');
for i:=1 to 50 do
begin
    Randomize;
    n:=Random(21)-1;
    for i:=1 to n  do
        a:=a+30;
    Randomize;
    n:=Random(16)-1;
    for i:=1 to n do
    b:=b+30;
    kwadracik(a,b);
end;
readkey;
ClearViewPort;
CloseGraph;
END.
0

randomize; {randomize powinno sie wykonać tylko raz, na początku programu}
for i:=1 to 50 do
begin
n:=Random(21)+1; { +1 rozumiem, -1 jest calkowicie bez sensu jesli zaczynasz pętle od 1}
for i:=1 to n do
a:=a+30;
n:=Random(16)+1;
for i:=1 to n do
b:=b+30;
kwadracik(a,b);
end;

I jesli pętla ma wykonywać kilka polecen, a nie tylko pierwsze po niej, to ładuj je wszystkie w bloki begin/end, jeśli zaś chcesz tylko do a i b dodać kilkukrotnie jakąś wartośc to chyba byłoby wygodniej zamiast:

n:=Random(16)+1;
for i:=1 to n do
b:=b+30;

wpisać po prostu b:=b+30*(random(16)+1);

i odpowiednio

n:=Random(21)+1;
for i:=1 to n do
a:=a+30;

a:=a+30*(random(21)+1);

a w ogole chcesz dodawać, czy przypisac tylko :

a:=30*(random(21)+1);
b:=30*(random(16)+1);

??

0

ja grzecznie poprosiłem o wyświetl;anie grafiki wiele razy a ty mi napisałeś jak przypisywać zmiennych wartości :-/
Wykryłem jeden błąd - zmienna i powtarza się w trzech pętlach - zmieniłem więc na j ale to nic nie zmieniło... Ramdomize; również użyłem tak, jak mówisz - bez skutku... Grafika nadal wyświetla się albo jeden raz albo kilka razy i to nie losowo ale wzdłuż ukośnej linii.
Po jakimś czasie uwagę zwróciłem na zmienne a i b. Wywaliłem dodawanie w przypisaniu im wartości i, o dziwo, program działa :d :d :d

Oto poprawiony kod:

program telewizor;
uses crt, graph;
var driver,mode,x,y,a,b,i,n,j: integer;

procedure kwadracik(x,y:integer);
          begin
          Rectangle(x,y,x+20,y+20);
          SetFillStyle(1,red);
          Bar(x+1,y+1,x+7,y+18);
          SetFillStyle(1,green);
          Bar(x+8,y+1,x+13,y+18);
          SetFillStyle(1,blue);
          Bar(x+14,y+1,x+19,y+18);
          end;
BEGIN
Randomize;
clrscr;

{ max a: 639 }
{ max b: 479 }

driver:=DETECT;
InitGraph(driver,mode,'C:\BGI');
for i:=1 to 20 do
begin
    a:=30*(Random(21)-1);
    b:=30*(Random(16)-1);
    kwadracik(a,b);
end;
readkey;
CloseGraph;
END.

1 użytkowników online, w tym zalogowanych: 0, gości: 1