Вот такое задание: Даны два шарика диаметром М. Промоделировать движение шариков по всей плоскости экрана. Шарики могут двигаться по прямым линиям. Изменение угла движения после столкновения с границей экрана или друг с другом может быть случайной величиной. Шарик не может вылететь за пределы квадрата. Пользователь может варьировать скорости движения шариков с помощью стрелок управления курсором.
Хотелось бы разобраться в коде программы... ( дело в том, что код не мой) Объясните пожалуйста назначение каждой из процедур в тексте приведённой ниже программы!
Марина, я покажу пример программы, которая гоняет объекты по полю. Программа работает в текстовой моде и без меню, но в ней есть управление скоростями. Надеюсь, она будет тебе полезна в некотором отношении.. Дело в том, что в ней четко проведено деление: все, что относится к выводу на экран, выделено в отдельный модуль. Сама же основная программа осуществляет движение и управление. По идее, если вместо существующего модуля, работающего с текстом, написать модуль, работающий с графикой, то основную программу менять не нужно (кроме строчки uses). Модуль для графики можно написать по образу и подобию текстового, заменив текстовый вывод на графический (советы volvo тут очень пригодятся).
Попробуй разобраться в том, как все это работает. Используются абстрактные координаты и экранные, что дает гибкость и удобство. В тексте вместо кружочков - квадратики, но это не самое важное . Отражение происходит просто со сменой знака соответствующей составляющей скорости (без случайностей). Начальное положение, скорости и размеры задаются случайно. Названия процедур отражают их суть. Сами объекты называются "It" (оно, нечто ).
Управление скоростями такое: нужно выбрать объект, нажав клавишу с его номером (по умолчанию выбран первый). Стрелки вверх/вниз увеличивают/уменьшают вертикальную скорость выбранного объекта, влево/вправо - горизонтальную. Пробел делает паузу (продолжение любой клавишей), Esc завершает программу. Можкшь также поиграть параметрами в программе - например, NIt (количество объектов), скоростью.. По идее, она работает в окне любого размера.
Я не совсем до конца протестировал на точность перевода, если заметишь сбои - говори.
Вот головная программа:
{Moving It's} {By Lapp} uses CRT,ItsText;
var x1,x2,y1,y2,MaxR,MaxV0:real;
procedure CreateIt(n:integer); begin with It[n] do begin r:=Random*MaxR; rx:=Round(r/(x2-x1)*(MaxX-MinX)); ry:=Round(r/(y2-y1)*(MaxY-MinY)); x:=x1+r+Random*(x2-x1-r*2); y:=y1+r+Random*(y2-y1-r*2); vx:=Random*MaxV0-MaxV0/2; vy:=Random*MaxV0-MaxV0/2; c:=(n+8)mod 15+1 end end;
procedure MoveIt(n:integer); begin with It[n] do begin x:=x+vx; if x<x1+r then begin x:=2*(x1+r)-x; vx:=-vx end; if x>x2-r then begin x:=2*(x2-r)-x; vx:=-vx end; y:=y+vy; if y<y1+r then begin y:=2*(y1+r)-y; vy:=-vy end; if y>y2-r then begin y:=2*(y2-r)-y; vy:=-vy end; xs:=Round((x-x1)/(x2-x1)*(MaxX-MinX))+MinX; ys:=Round((y-y1)/(y2-y1)*(MaxY-MinY))+MinY; end end;
var i,NIt,The:integer; ch:char; GameOver:boolean;
begin NIt:=9; {Number of It's, 1<=NIt<=9} MaxV0:=50; {Maximum speed } MaxR:=50; {Maximum radius}
OpenBoard; x1:=0; x2:=MaxX*10; y1:=0; y2:=Round(MaxY*10*Aspect); Randomize; for i:=1 to NIt do begin CreateIt(i); MoveIt(i) end; GameOver:=false; for i:=1 to NIt do ShowIt(i); The:=1; repeat for i:=1 to NIt do begin MoveIt(i); with It[i] do if (xs<>xs0)or(ys<>ys0) then begin HideIt(i); ShowIt(i) end end; if KeyPressed then begin ch:=ReadKey; case ch of #0: begin ch:=ReadKey; with It[The] do case ch of #72:if vy<100 then vy:=vy*2; #75:if vx>0.01 then vx:=vx*0.5; #77:if vx<100 then vx:=vx*2; #80:if vy>0.01 then vy:=vy*0.5; end end; '1'..'7':The:=Ord(ch)-48; ' ':repeat ReadKey until not KeyPressed; #27:GameOver:=true end end until GameOver; for i:=1 to NIt do HideIt(i); CloseBoard end.
А это - текстовый модуль:
{unit for moving It's} {by Lapp} unit ItsText; interface uses CRT;
const MIt=9; {max number of Iteatures}
type tIt=record x,y,vx,vy,r:real; {position, speed, real radius} rx,ry,c,xs,ys,xs0,ys0:integer; {screen radius, color, screen pos, old screen pos} end;
var It:array[1..MIt]of tIt; NIt:integer; Aspect,MinX,MinY,MaxX,MaxY,x0,y0:integer; TA:byte;
procedure HideIt(n:integer); var i,j:integer; begin with It[n] do begin for j:=ys0-ry to ys0+ry do for i:=xs0-rx to xs0+rx do begin GoToXY(i,j); Write(' ') end; end end;
procedure OpenBoard; begin MinX:=1; MaxX:=WindMax and 255+1; MinY:=1; MaxY:=WindMax shr 8+1; Aspect:=2; x0:=WhereX; y0:=WhereY; TA:=TextAttr end;
procedure CloseBoard; begin GoToXY(x0,y0); TextAttr:=TA end;
begin end.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой