Сейчас на форуме: morgot, Rio, CDK123, zds, tyns777, tihiy_grom, rmn (+4 невидимых)

 eXeL@B —› Программирование —› Оптимизировать код(C++)
Посл.ответ Сообщение


Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 10 октября 2008 20:16
· Личное сообщение · #1

Нужно было написать для одной игры элемент-> рандомный вывод объктов(мишеней) по числу от 1-3,также их расположение(x,y) тоже рандомное,но должно быть по полу кругу. Написать то получилось, но для этого объекиа кода слишком много вышло, чёта ни чё в голову не приходит, можно бы было сделать используя switch, но особо ни чё не уменьшится .
Ну вобщем-то во код:
Code:
  1. void TForm1::mishen()
  2. {
  3. int n1,n2,i;
  4. int yn1,yn2;
  5. yn1=345/2+40;
  6. //переменные координат.
  7. ml=random(3);
  8. //определяем количество мишеней,
  9. Canvas->Brush->Color=clBlue;
  10. Canvas->Pen->Color=clRed;
  11. while(1){
  12. xm[0]=random(345)+25;
  13. n1=xm[0];
  14. yn2=abs(yn1-xm[0])/2;
  15. ym[0]=yn2*yn2/100+28;
  16. Canvas->Ellipse(xm[0]-20,ym[0]-20,xm[0]+20,ym[0]+20);
  17. if(ml==0){break;}
  18. //вычислям мс 1ой мишени.
  19. while(i<=1)
  20. {xm[1]=random(345)+25;
  21. if(abs(xm[1]-n1)>40)
  22.   { yn2=abs(yn1-xm[1])/2;
  23.     ym[1]=yn2*yn2/100+28;
  24.   Canvas->Ellipse(xm[1]-20,ym[1]-20,xm[1]+20,ym[1]+20);n2=xm[1];i=2;}
  25. }
  26. if(ml==1){break;}
  27. //вычислям мс 2ой мишени.
  28. while(i<=2)
  29. {xm[2]=random(345)+25;
  30. if(abs(xm[2]-n1)>40 && abs(xm[2]-n2)>40)
  31. {yn2=abs(yn1-xm[2])/2;
  32.  ym[2]=yn2*yn2/100+28;
  33. Canvas->Ellipse(xm[2]-20,ym[2]-20,xm[2]+20,ym[2]+20);i=3;}
  34. }break;}
  35. //вычислям мс 3ой мишени.
  36. }

xm[] и ym[] глобальные,345 это нечто вроди максимума мо х.(может чё забыл)
Хотелось бы сделать, как можно прямее и оптимизированее)



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 10 октября 2008 20:37
· Личное сообщение · #2

Этот участок

Code:
  1. yn2 = abs(yn1 - xm[2]) / 2;
  2. ym[2] = yn2 * yn2 / 100 + 28;
  3. Canvas->Ellipse(xm[2] - 20, ym[2] - 20, xm[2] + 20, ym[2] + 20);


используется в 3-х местах с разными индексами, сделай функцию. И еще, что там за извращения с i? ) Он даже не инициализирован.




Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 10 октября 2008 20:51 · Поправил: Oott
· Личное сообщение · #3

Можно сделать функцией, но в проекте, где восновном одни большие функи как-то не прикольно, вот если ченить по глобальней там зафунчить)
i там используется, как флаг выхода из цикла, это чёта я оставил ещё когда у меня было всё одним цыклом и тогда действительно нужен бы этот флаг, ща надо на break; заменить)
P.S. мне сам алгоритм не нравится О_о



Ранг: 20.9 (новичок), 4thx
Активность: 0.010
Статус: Участник

Создано: 12 октября 2008 12:59
· Личное сообщение · #4

Как минимум

Code:
  1. int yn2, yn1=345/2+40;
  2. .....
  3. n1=xm[0]=random(345)+25;





Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 12 октября 2008 19:11 · Поправил: Oott
· Личное сообщение · #5

Exaktus_, спасибо за правку синтаксиса, но я хотел алгоритм изменить потому, как 4 while(1) ни в какие ворота не лезит. Ну вобщем то проблема уже решена, спасибо моему наставнику) (Player)


 eXeL@B —› Программирование —› Оптимизировать код(C++)
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати