2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 помогите с программированием [Pascal ]
Сообщение27.11.2010, 17:17 
:cry:
я написала рограмму но не могу выполнить поворот...
помогите пожалуйста...
смысол программы в том чтобы 4-е окружности расположенные по углам квадрата двигались по часовой стрелке с одинаковой скоростью...
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
  1. program Jyk;
  2. uses Graph,crt;
  3. var
  4.  Dr,M,Error:integer;
  5.  b,c:integer;  {первый жук}
  6.  b1,c1:integer; {второй жук}
  7.  b2,c2:integer; {третий жук}
  8.  b3,c3:integer; {четвертый жук}
  9.  r:integer; {радиус жуков}
  10. begin
  11.  Dr:=detect;
  12.  InitGraph (Dr,M,'');
  13.  if GraphResult <> 0 then
  14.   begin
  15.    writeln ('Ошибка');
  16.    halt
  17.   end
  18.  else
  19.  begin
  20.   outtextxy (245,40,'Траектория движения жуков');
  21.   {создаем окно в центре экрана для вывода "жуков"}
  22.   rectangle (170,80,500,410);
  23.   SetViewPort (171,81,499,409,ClipOn); {Все жуки нах-ся в квадрате со стороной А}
  24.   SetColor (red);              {цвет}
  25.   SetLineStyle (0,0,2*Random (2)+1);  {стиль линий}
  26.   b:=30;
  27.   c:=40;
  28.   b1:=280;
  29.   c1:=40;
  30.   b2:=30;
  31.   c2:=300;
  32.   b3:=280;
  33.   c3:=300;
  34.   SetFillStyle (6, red);
  35.   Circle (b,c,25);
  36.   FloodFill (b+1,c+1, red);
  37.   Circle (b1,c1,25);
  38.   FloodFill (b1+1,c1+1, Red);
  39.   Circle (b2,c2,25);
  40.   FloodFill (b2+1,c2+1, Red);
  41.   Circle (b3,c3,25);
  42.   FloodFill (b3+1,c3+1, Red);
  43.   repeat
  44.    delay (1000);
  45.    ClearViewPort;
  46.    delay (100);
  47.    b:=b+30;
  48.    c:=40;
  49.    b1:=280;
  50.    c1:=c1+30;
  51.    b2:=30;
  52.    c2:=c2-30;
  53.    b3:=b3-30;
  54.    c3:=300;
  55.    SetFillStyle (6, red);
  56.    Circle (b,c,25);
  57.    FloodFill (b+1,c+1, red);
  58.    Circle (b1,c1,25);
  59.    FloodFill (b1+1,c1+1, Red);
  60.    Circle (b2,c2,25);
  61.    FloodFill (b2+1,c2+1, Red);
  62.    Circle (b3,c3,25);
  63.    FloodFill (b3+1,c3+1, Red);
  64.    delay (100);
  65. Вот тут нужен поворот, а я не знаю какое условие надо
  66.    if (b<30) or (c<40) and (b+r+1>280) or (c+r+1>300) then
  67.     begin
  68.      b:=b+30;
  69.      c:=40;
  70.      b1:=280;
  71.      c1:=c1+30;
  72.      b2:=30;
  73.      c2:=c2-30;
  74.      b3:=b3-30;
  75.      c3:=300;
  76.      SetFillStyle (6, red);
  77.      Circle (b,c,25);
  78.      FloodFill (b+1,c+1, red);
  79.      Circle (b1,c1,25);
  80.      FloodFill (b1+1,c1+1, Red);
  81.      Circle (b2,c2,25);
  82.      FloodFill (b2+1,c2+1, Red);
  83.      Circle (b3,c3,25);
  84.      FloodFill (b3+1,c3+1, Red);
  85.      delay (100);
  86.      end
  87.   until KeyPressed;
  88.  { if ReadKey=#0 then
  89.    b:=ord (ReadKey); }
  90.  CloseGraph;
  91.  end;
  92. end.
  93.  

 
 
 
 Re: помогите с программированием
Сообщение27.11.2010, 17:30 
Проставьте отступы побольше ( :-) ).

 
 
 
 Re: помогите с программированием
Сообщение27.11.2010, 17:46 
Аватара пользователя
 i  Переехали в Программирование

 
 
 
 Re: помогите с программированием
Сообщение28.11.2010, 14:20 
вообще если все "жуки" одного цвета, то можно схитрить и не делать поворота ;), а просто сделать так, чтобы каждый "жук" доходил до конца - 1 шаг стороны А и цикл тупо начинался сначала )

Если жуки все же разных цветов и необходимо сделать движение по кругу, то нужно следующее:
1. точно определиться с шагом "жуков", чтобы сделать движение равномерным и с одинаковым отступом у краев квадрата. Либо рассчитывать шаг автоматически если сторона квадрата произвольная. пример для "жука" сверху: А=310, r=30, shag=30, отступ от края=по 5 с двух сторон, шагов нужно пройти 10, x(начальное)=20, x(конечное)=290 (x - твое b; y - твое c)
2. условие для поворота можно использовать такое: if (x + shag = A) то делаем поворот
3. реализация поворота у тебя неправильная (если ты ее описал так, как у тебя в коде). общий случай движения по кругу для каждого из жуков при его нахождении в определенной позиции (сверху, справа, снизу, слева) будет выглядеть так: "жук" сверху - x = x + shag, "жук" справа - y = y - shag, "жук" снизу - x = x - shag, "жук" слева - y = y - shag.
поворотом же будет просто смена знака у shag'a при определенной позиции
4. через if делать геморно, в данной ситуации лучше воспользоваться циклом while. Все это будет выглядеть так:
Код:
//начальные координаты
//рисуем круги
 
repeat
   
   while (x + shag <> A)
      begin
         x = x + shag;
         y1 = y1 + shag;
         x2 = x2 + shag;
         y3 = y3 - shag;
         
         //рисуем круги
      end
      
   while (x3 + shag <> A)
      begin
         y = y + shag;
         x1 = x1 - shag;
         y2 = y2 - shag;
         x3 = x3 + shag;
         
         //рисуем круги
      end
      
   while (x2 + shag <> A)
      begin
         x = x - shag;
         y1 = y1 - shag;
         x2 = x2 + shag;
         y3 = y3 + shag;
         
         //рисуем круги
         end
      
   while (x1 + shag <> A)
      begin
         y = y - shag;
         x1 = x1 + shag;
         y2 = y2 + shag;
         x3 = x3 - shag;
         
         //рисуем круги
      end
 
until KeyPressed;


циклы while пишутся именно в такой последовательности

-- Вс ноя 28, 2010 13:20:42 --

 
 
 
 Re: помогите с программированием
Сообщение28.11.2010, 16:47 
[quote="v0lkan0 в сообщении #381382"]вообще если все "жуки" одного цвета, то можно схитрить и не делать поворота ;), а просто сделать так, чтобы каждый "жук" доходил до конца - 1 шаг стороны А и цикл тупо начинался сначала )

да все "жуки" одного цвета вот именно этот цикл я не могу написать... :cry:

а цикл который предложили вы он не работает и зацикливается :cry:

 
 
 
 Re: помогите с программированием
Сообщение28.11.2010, 16:58 
точно ) совсем забыл еще определять другие координаты ) сорри

ну а для одноцветных жуков цикл без поворота таков:

Код:
repeat
//определяем начальные координаты всех "жуков"
while (x + shag < A)
      begin
         x = x + shag;
         y1 = y1 + shag;
         x2 = x2 - shag;
         y3 = y3 - shag;
         
         //рисуем круги
      end
until KeyPressed


должно работать

 
 
 
 Re: помогите с программированием
Сообщение29.11.2010, 00:28 
спасибо спасибо спасибо...прога заработала...)))))

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group