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

> Моделирование движения шаров
18192123
сообщение 3.04.2007 21:03
Сообщение #1


Профи
****

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

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


Вот такое задание:
Даны два шарика диаметром М. Промоделировать движение шариков по всей плоскости экрана. Шарики могут двигаться по прямым линиям. Изменение угла движения после столкновения с границей экрана или друг с другом может быть случайной величиной. Шарик не может вылететь за пределы квадрата. Пользователь может варьировать скорости движения шариков с помощью стрелок управления курсором.

Хотелось бы разобраться в коде программы... ( дело в том, что код не мой)
Объясните пожалуйста назначение каждой из процедур в тексте приведённой ниже программы!


Прикрепленные файлы
Прикрепленный файл  CIRCLES.PAS ( 10.21 килобайт ) Кол-во скачиваний: 424
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Lapp
сообщение 9.04.2007 14:11
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Марина, я покажу пример программы, которая гоняет объекты по полю. Программа работает в текстовой моде и без меню, но в ней есть управление скоростями. Надеюсь, она будет тебе полезна в некотором отношении..
Дело в том, что в ней четко проведено деление: все, что относится к выводу на экран, выделено в отдельный модуль. Сама же основная программа осуществляет движение и управление. По идее, если вместо существующего модуля, работающего с текстом, написать модуль, работающий с графикой, то основную программу менять не нужно (кроме строчки uses). Модуль для графики можно написать по образу и подобию текстового, заменив текстовый вывод на графический (советы volvo тут очень пригодятся).

Попробуй разобраться в том, как все это работает. Используются абстрактные координаты и экранные, что дает гибкость и удобство. В тексте вместо кружочков - квадратики, но это не самое важное smile.gif. Отражение происходит просто со сменой знака соответствующей составляющей скорости (без случайностей). Начальное положение, скорости и размеры задаются случайно. Названия процедур отражают их суть. Сами объекты называются "It" (оно, нечто smile.gif).

Управление скоростями такое: нужно выбрать объект, нажав клавишу с его номером (по умолчанию выбран первый). Стрелки вверх/вниз увеличивают/уменьшают вертикальную скорость выбранного объекта, влево/вправо - горизонтальную. Пробел делает паузу (продолжение любой клавишей), 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 ShowIt(n:integer);
procedure HideIt(n:integer);
procedure OpenBoard;
procedure CloseBoard;

implementation

procedure ShowIt(n:integer);
var
i,j,xs1,ys1,rx,ry:integer;
begin
with It[n] do begin
TextColor©;
for j:=ys-ry to ys+ry do for i:=xs-rx to xs+rx do begin
GoToXY(i,j);
Write('█')
end;
GoToXY(xs,ys); Write(n);
xs0:=xs;
ys0:=ys;
end
end;

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.



--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 9.04.2007 18:37
Сообщение #3


Профи
****

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

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


Цитата(Lapp @ 9.04.2007 15:11) *

Марина, я покажу пример программы, которая гоняет объекты по полю.

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

Сообщений в этой теме
18192123   Моделирование движения шаров   3.04.2007 21:03
18192123   procedure Change(g1,g2:integer;var n:integer;a:re...   5.04.2007 20:44
Lapp   Марина, извини, но ты выбрала неправильную програм...   6.04.2007 7:54
18192123   Марина, извини, но ты выбрала неправильную програ...   7.04.2007 13:49
18192123   начни с алгоритма.. 1. Меню (где можно выбрат...   7.04.2007 20:31
Tan   Случайно на компе наткнулся на задачку с шариком п...   7.04.2007 22:32
Lapp   1. Меню (где можно выбрать радиус 2-х шариков) ...   8.04.2007 9:58
18192123   С помощью стрелок - не очень удобно, поскольку и...   8.04.2007 11:02
volvo   Для того, чтобы начать реализовывать меню (интерфе...   8.04.2007 11:13
18192123   Мои "очень скромные" наработки..... вот ...   8.04.2007 16:26
TarasBer   procedure move (x, y, dx, dy : integer); замените...   8.04.2007 16:36
18192123   procedure move (x, y, dx, dy : integer); заменит...   8.04.2007 16:51
volvo   Значит, смотри, в чем твои ошибки: 1) если ты дум...   9.04.2007 1:13
18192123   в момент касания шаром бордюра он затирается - п...   9.04.2007 21:02
Lapp   Марина, я покажу пример программы, которая гоняет ...   9.04.2007 14:11
18192123   Марина, я покажу пример программы, которая гоняет...   9.04.2007 18:37
18192123   x1,x2,y1,y2 : real; А это - текстовый мод...   10.04.2007 23:36
Lapp   за что отвечают переменные x1,x2,y1,y2 и Aspect,M...   11.04.2007 1:13
volvo   Потому, что надо сначала менять положение шара, и...   9.04.2007 21:23
18192123   А вот как менять - это уже зависит от того, наско...   9.04.2007 22:56
Lapp   Я хочу делать наиболее реалистично... Про ф-цию -...   10.04.2007 0:41
18192123   возник такой вопрос: если теоретически я должна уп...   12.04.2007 13:43
18192123   Попыталась добавить в программу движение под углом...   12.04.2007 20:49
18192123   Попыталась добавить в программу движение под угло...   14.04.2007 13:45
18192123   .... меню (не знаю, как при выборе одного из пунк...   14.04.2007 17:20
Lapp   если теоретически я должна управлять скоростью дв...   12.04.2007 22:52
18192123   Управляешь с клавы - ну, управляй. А при чем ту...   13.04.2007 8:48
volvo   Насчет #207, которая возникает в balls_hit ... Дл...   14.04.2007 15:01
volvo   Обрамляешь все, что делается в меню Repeat / Unti...   14.04.2007 18:20
18192123   вот такие вопросы появились: 1. если шарики соприк...   14.04.2007 19:54
18192123   вот такие вопросы появились: 1. если шарики сопри...   15.04.2007 22:23
18192123   вот такие вопросы появились: 1. если шарики сопри...   16.04.2007 21:46
18192123   по вопросу2: begin dx := -dx; dy := -dy; x...   17.04.2007 19:05
18192123   а насчёт варьирования скоростями: от чего отталкив...   17.04.2007 21:53
Lapp   а насчёт варьирования скоростями: от чего отталки...   18.04.2007 2:19
18192123   Если у меня положения центров шаров будут находить...   18.04.2007 22:50
Lapp   как должны выглядеть процедуры ..., которые я исп...   19.04.2007 6:29
18192123   Примерно так: по Х: angle:=180-angle; по Y: angle...   19.04.2007 13:46
Lapp   С этим получилось , но в результате , если один и...   19.04.2007 22:47
18192123   Видимо, у тебя один угол на два шара. А надо име...   20.04.2007 8:33
18192123   Мне бы хотелось, чтобы шарики, при столкновении др...   21.04.2007 23:21
18192123   но шарики только проводят друг через друга..... ...   21.04.2007 23:42
Lapp   не пойму, в чём причина? Причин несколько. 1. т...   22.04.2007 10:20
18192123   Например, функция balls_hit моогла бы выглядеть ...   22.04.2007 15:32
18192123   3. Ты пересчитываешь параметры, но обратно из пр...   22.04.2007 20:38
Lapp   не совсем тебя поняла....какие параметры я ещё до...   23.04.2007 0:47
18192123   То же самое касается других параметров, которые...   23.04.2007 21:13
Lapp   Но у меня шарики всё равно проходят друг через др...   24.04.2007 10:14
18192123   3. Скорость персчитывай по ЗСИ по [b]каждой комп...   24.04.2007 20:59
18192123   ты снова забываешь сменить углы.. а как их меня...   22.04.2007 21:01
Lapp   Дальше для каждой компоненты записываешь (на бумаж...   24.04.2007 22:10
18192123   Находишь Vx1' и Vx2' (а также Vy1' и ...   24.04.2007 23:10
Lapp   ты имел ввиду Vx1' := ?Нет, я имел в виду т...   24.04.2007 23:38
18192123   Дальше для каждой компоненты записываешь (на бума...   25.04.2007 18:38
18192123   перед тем, как шарики сталкиваются, программа выле...   26.04.2007 19:01
Lapp   перед тем, как шарики сталкиваются, программа выл...   27.04.2007 5:35
18192123   Ошибок в математике не нашла.... (но у меня получи...   27.04.2007 22:41
Lapp   в какой строке это происходит - не разберусь... ...   27.04.2007 22:49
18192123   В чем ты работаешь? в ТР/ВР или FPC? ТР   27.04.2007 23:05
Lapp   ТР ТР обычно показывает строку с ошибкой.. Стран...   27.04.2007 23:33
18192123   Перед передачей параметров в эту процедуру, расп...   28.04.2007 19:27
18192123   А если не применять з-ны сохранения ( изменение ск...   28.04.2007 22:58
Чужак   18192123, здравствуй! Читал НЕ мало твою тему,...   28.04.2007 23:16


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

 



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