Skrócenie danego kodu choinki

0

Witam,

Czy jest jakaś możliwość, by ten kod, który napisałem, skrócić w którejś części?

program choina; uses crt; var wiersze:byte;
procedure choinka(z:integer);
var losowa:byte; // losowy kolor
    i,j,k,l,m,n:byte; // petle sterujace
begin
for i:=1 to z do
  begin
    gotoxy(42-i,i+2);
    for j:=1 to i*2 do
    begin
      losowa:=random(14)+1;
      textcolor(losowa);
      write('*');
    end;
  end;
for k:=1 to z do
  begin
    gotoxy(42-k,i+k);
    for l:=1 to k*2 do
    begin
      losowa:=random(14)+1;
      textcolor(losowa);
      write('*');
    end;
  end;
for m:=1 to z do
  begin
    gotoxy(42-m,i+k+m);
    for n:=1 to m*2 do
    begin
      losowa:=random(14)+1;
      textcolor(losowa);
      write('*');
    end;
  end;
end;
procedure lewo(n:byte);
var i:byte;
begin
for i:=1 to n*3 do
    begin
      gotoxy(1,i);
      writeln('||');
    end;
end;
procedure prawo(n:byte);
var i:byte;
begin
for i:=1 to n*3 do
    begin
      gotoxy(75,i);
      writeln('||');
    end;
end;
procedure dol(n:byte);
var i:byte;
begin
for i:=1 to 75 do
    begin
      gotoxy(i,n*3+1);
      write('||');
    end;
end;
procedure gora(n:byte);
var i:byte;
begin
for i:=1 to 75 do
    begin
      gotoxy(i,1);
      write('||');
    end;
end;
begin
  clrscr;
  writeln('Podaj ilosc wierszy do kazdej choinki - max 8');
  readln(wiersze);
  if(wiersze > 8) then wiersze:=8;
  clrscr;
  REPEAT
    gora(wiersze);
    lewo(wiersze);
    prawo(wiersze);
    dol(wiersze);
    choinka(wiersze);
  until keypressed;
end.

Dzięki wielkie i pozdrawiam

1
for k:=1 to z do
  begin
    gotoxy(42-k,i+k);

Ile w tym miejscu wynosi i? Na oko powinno być równe z, bo poprzednia pętla była for i:=1 to z do, ale kompilator nie daje ci takiej gwarancji.
Za pętlą for jej licznik ma wartość nieokreśloną.

0

@Tytanowyy - napisz dokładnie jak powinno wyglądać wyjście to podpowiem co trzeba zrobić, aby kod był krótszy; Ten obecny wygląda dziwnie, bo pełno w nim powtórzeń (np. bardzo podobne pętle) i na pewno jest opcja nie tyle skrócić go, co przyspieszyć.

0

W oknie powinna wyświetlić się choinka, otoczona czterema od góry, dołu oraz boków paskami. Powinna składać się z trzech trójkątów

@Azarien, Ale dlaczego? Przecież najpierw wykona się pierwsza pętla, po której i będzie równe z

1

Ja tam podałem wysokość 2 i jakoś nie doliczyłem się 3-ch

0
_13th_Dragon napisał(a):

Ja tam podałem wysokość 2 i jakoś nie doliczyłem się 3-ch

A no rzeczywiście, a to za sprawą pierwszej pętli, dzięki

1

@Azarien, Ale dlaczego? Przecież najpierw wykona się pierwsza pętla, po której i będzie równe z

Nie będzie. Przy włączonej optymalizacji na pewno Free Pascal (i prawdopodobnie Delphi też) nie zachowuje zawartości tej zmiennej, albo wartość różni się o 1 od spodziewanej.

Nie licz po prostu na to, że po skończonej pętli licznik tej pętli na pewno równa się ostatniej użytej wartości.
Nauczysz się pisać kod źle ("bo przecież działa") a potem nie będziesz wiedział co się dzieje gdy nagle przestanie działać nie wiadomo dlaczego.

0
Azarien napisał(a):

@Azarien, Ale dlaczego? Przecież najpierw wykona się pierwsza pętla, po której i będzie równe z

Nie będzie. Przy włączonej optymalizacji na pewno Free Pascal (i prawdopodobnie Delphi też) nie zachowuje zawartości tej zmiennej, albo wartość różni się o 1 od spodziewanej.

Nie licz po prostu na to, że po skończonej pętli licznik tej pętli na pewno równa się ostatniej użytej wartości.
Nauczysz się pisać kod źle ("bo przecież działa") a potem nie będziesz wiedział co się dzieje gdy nagle przestanie działać nie wiadomo dlaczego.

Ok, dziękuję bardzo za radę, na pewno wezmę to pod uwagę.

1
uses crt,windows;

var Top,Row,Line,Mid,W,H,Y,X,S:Integer;
var tb:array of array of char;
begin
  Write('Podaj rozmiar choinki: ');
  ReadLn(S);
  if S<4 then S:=4 else if S>7 then S:=7;
  H:=3*S+1;
  W:=2*S+3;
  Mid:=((W)shr(1));
  SetLength(tb,H+1,W+1);
  tb[0][0]:=Chr(201);
  tb[H][0]:=Chr(200);
  tb[0][W]:=Chr(187);
  tb[H][W]:=Chr(188);
  for Y:=1 to H-1 do tb[Y][0]:=Chr(186);
  for Y:=1 to H-1 do tb[Y][W]:=Chr(186);
  for X:=1 to W-1 do tb[0][X]:=Chr(205);
  for X:=1 to W-1 do tb[H][X]:=Chr(205);
  tb[H-2][Mid+0]:=Chr(219);
  tb[H-2][Mid+1]:=Chr(219);
  Top:=2;
  for Row:=1 to 3 do
  begin
    for Line:=2 to S do
    begin
      for X:=1 to Line-1 do
      begin
        tb[Top][Mid+1-X]:='*';
        tb[Top][Mid+0+X]:='*';
      end;
      Inc(Top);
    end;
  end;
  ClrScr;
  CursorOff;
  while true do
  begin
    gotoxy(1,1);
    for Y:=0 to H do
    begin
      for X:=0 to W do
      begin
        if tb[Y][X]='*' then textcolor(random(14)+1)
        else if tb[Y][X]=Chr(219) then textcolor(2)
        else if tb[Y][X]<>' ' then textcolor(15);
        Write(tb[Y][X]);
      end;
      WriteLn;
    end;
    Sleep(50);
  end;
end.

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