IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Что можно улучшить в программе?, Небольшае программка для рисования деревца в псевдографике
_Артём_
сообщение 6.09.2012 22:50
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


Недавно изучил рекурсивные функции в паскале, захотел потренироваться:

uses PTCCrt,PTCGraph;

var
gd,gm:integer;
x:char;


procedure tree (a,x,y,ls,df:integer);
var x1,y1,lsr,lsv1,lsv2,ng:integer;
begin
if df <> 1 then lsr:= (ls div df) + (ls*(random(3)*2-1) div 100)
else lsr:=ls;
x1 := round(x-sin(pi/180*a)*lsr);
y1 := round(y-cos(pi/180*a)*lsr);
line(x,y,x1,y1);
if df>1 then begin
ng:=((ls-lsr)*70 div 100);
lsv1:=random(round(sqrt(abs(sqr(ls-lsr)-((ls-lsr)*30 div 100))))-ng)+ng;
lsv2:=round(sqrt(abs(sqr(ls-lsr)-sqr(lsv1))));
if random(2)=1 then begin
tree (a+round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a-round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end
else begin
tree (a-round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a+round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end;
setcolor(white);
end;
end;


begin
gd:=10;
gm:=260;
initgraph(gd,gm,'');


randomize;
x:=readkey;
while x<>'a' do begin
tree(0,1024 div 2,768,1300,13);
x:=readkey;
cleardevice;
end;
closegraph;
end.


Что можно улучшить в этой программе?
Использую Free Pascal;
Модули PTCGraph и PTCCrt можно заменить на Graph и Crt
Пример работы:
Прикрепленное изображение

Сообщение отредактировано: _Артём_ - 6.09.2012 22:51
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 7.09.2012 16:21
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Ну мне немного не нравится только этот фрагмент:

if random(2)=1 then begin
tree (a+round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a-round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end
else begin
tree (a-round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a+round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end;

У тебя обе ветки почти одинаковые, это типа не очень хорошо - копирка же.
Можно чуток сократить:

if random(2)=0 then dr := 1 else dr := -1;
tree (a+dr*round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a-dr*round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);

Это тоже не идеал, потому что два раза вызвается tree с почти одинаковыми аргументами. Если lsv сделать массивом длины 2, то можно и это подужать.

Сообщение отредактировано: TarasBer - 7.09.2012 16:23


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
_Артём_
сообщение 7.09.2012 17:14
Сообщение #3





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


Цитата(TarasBer @ 7.09.2012 17:21) *

Ну мне немного не нравится только этот фрагмент:

if random(2)=1 then begin
tree (a+round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a-round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end
else begin
tree (a-round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a+round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end;

У тебя обе ветки почти одинаковые, это типа не очень хорошо - копирка же.
Можно чуток сократить:

if random(2)=0 then dr := 1 else dr := -1;
tree (a+dr*round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a-dr*round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);

Это тоже не идеал, потому что два раза вызвается tree с почти одинаковыми аргументами. Если lsv сделать массивом длины 2, то можно и это подужать.

Tree и должен вызываться 2 раза, а иначе как?
Правда, этот фрагмент был не очень хорош. Первоначально предполагал сделать так, что-бы наибольшая из двух веток тянулась вверх, но не понял, как.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 7.09.2012 20:08
Сообщение #4


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(_Артём_ @ 7.09.2012 17:14) *

Tree и должен вызываться 2 раза, а иначе как?

Циклом.
for i := 0 to 1 do Tree(что-то там в зависимости от i)


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
_Артём_
сообщение 7.09.2012 21:12
Сообщение #5





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


А смысл? Что-бы потом сделать большее кол-во ветвей?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 8.09.2012 15:35
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Ну смысл в том, что легче менять поведение программ, в которых меньше строк сделано под копирку.
В данном случае 2 одинаковые строки погоды не сделают, но если придираться до конца, то лучше им быть циклом.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
_Артём_
сообщение 8.09.2012 16:00
Сообщение #7





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


Спасибо! Буду это в дальнейшем учитывать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 28.03.2024 20:34
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"