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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Помогите оптимизировать
сообщение
Сообщение #1





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

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


Вобщем написал часть кода для одной програмки и думаю что получилось слишком грамоздко. Хотелось бы выслушать предложения для оптимизации.=) Если коротко о программе, то она рисует три шара разного цвета и они рандомно двигаются, и при сталкивании меняют цвет в зависимости от условий.
Код
program cir;
uses graphABC;
var x, y, n, h, c, d, a, b, q, w, m, l, x1, y1,co,col,b1, q1, w1, m1, l1, x2, y2,col1: integer;
begin
  Window.Title := 'Круги';
  Font.Color := clwhite;//цвет шриФта
  x:=random(Window.Width); //Начальные
  y:=random(Window.height);//Позиции
  x1:=random(Window.Width);//Кругов
  y1:=random(Window.height);//.....
  x2:=random(Window.Width);//......
  y2:=random(Window.height);//.....
  c:=5;d:=5;q:=5;w:=5;q1:=5;w1:=5;// дополнительные переменные для рандомного движения
  co:=0;col:=0;col1:=0; //переменные отвечающие за цвет
repeat //цикл рисования кругов
//1 круг ////////////////////////////////////////////////////  
  //------Условия навправления движения и его изменение----------------------------------------------------------
  if a=0 then begin n:=(random(c+6)-ABS(c)); h:=(random(d+6)-ABS(d));
  c:=5;d:=5; a:=1; end;
  //------Рисование круга задание цвета условия столкновения с гарницами и текст-----------------------------------------------
  LockDrawing;
  Brush.Color := clRed;
  if co=1 then Brush.Color := clBlue;
  x:=x+n; y:=y+h;
  if x<10 then begin a:=0; c:=0; end;
  if y<10 then begin a:=0; d:=0; end;
  if x>Window.Width-10 then begin a:=0; c:=-5; end;
  if y>Window.height-10 then begin a:=0; d:=-5; end;
  if (x=0) or (y=0) then a:=0;
  circle(x,y,10);
  TextOut(x-4,y-6,'A');
  //---------------------------------------------------------------
//2 круг /////////////////////////////////////////////////////
  if b=0 then begin m:=(random(q+6)-ABS(q)); l:=(random(w+6)-ABS(w));  
  q:=5;w:=5; b:=1;end;
  if col=0 then Brush.Color := clBlack;
  if col=1 then Brush.Color := clRed;
  x1:=x1+m; y1:=y1+l;  
  if x1<10 then begin b:=0; q:=0; end;
  if y1<10 then begin b:=0; w:=0; end;
  if x1>Window.Width-10 then begin b:=0; q:=-5; end;
  if y1>Window.height-10 then begin b:=0; w:=-5; end;  
  if (x1=0) or (y1=0) then b:=0;
  circle(x1,y1,10);
  TextOut(x1-4,y1-6,'B');
  //3 круг /////////////////////////////////////////////////////
  if b1=0 then begin m1:=(random(q1+6)-ABS(q1)); l1:=(random(w1+6)-ABS(w1));  
  q1:=5;w1:=5; b1:=1;end;
  if col1=0 then Brush.Color := clBlue;
  
  x2:=x2+m1; y2:=y2+l1;  
  if x2<10 then begin b1:=0; q1:=0; end;
  if y2<10 then begin b1:=0; w1:=0; end;
  if x2>Window.Width-10 then begin b1:=0; q1:=-5; end;
  if y2>Window.height-10 then begin b1:=0; w1:=-5; end;  
  if (x2=0) or (y2=0) then b1:=0;
  circle(x2,y2,10);
  TextOut(x2-4,y2-6,'C');
//Тут круги меняют цвет при сталкивании//////////////////////////////////////////////////////////  
  if (ABS(x-x1)<=20) and (ABS(y-y1)<=20) then col:=1;
  if (ABS(x-x2)<=20) and (ABS(y-y2)<=20) then co:=1;
  if (ABS(x1-x2)<=20) and (ABS(y1-y2)<=20) and (col=1) then col:=0;
  if (ABS(x-x2)<=20) and (ABS(y-y2)<=20) and (co=0) then co:=1;
  Redraw;
  Window.Clear(clWhite);
  sleep(20);
until 2<1;
end.

С радостью выслушаю советы=) И да, так как в результате хоче получить 20 шаров, а алгоритм уже подтормажует то хотелось бы полегче код, просто в голову не лезет уже.
И да, пишу на Pascal.ABC

Сообщение отредактировано: Hatia -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Предлагаю применить массив.
Хранить координаты не в
x,y,x1,y1,x2,y2: integer;
а в
x,y: array [0..2] of integer;
тогда обработка поведения кругов упростится до

for i:=0 to 2 do begin
// то же самое, что у тебя сейчас с x,y, но теперь надо писать x[i], y[i]
end;

 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





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

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


Цитата(-TarasBer- @ 17.12.2011 13:36) *

Предлагаю применить массив.
Хранить координаты не в
x,y,x1,y1,x2,y2: integer;
а в
x,y: array [0..2] of integer;
тогда обработка поведения кругов упростится до

for i:=0 to 2 do begin
// то же самое, что у тебя сейчас с x,y, но теперь надо писать x[i], y[i]
end;



О, спасибо щас заменим)
Еще раз спасибо код уменьшился в 3 раза) Как то и забыл о массивах)

Сообщение отредактировано: Hatia -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 1.05.2024 6:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name