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

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

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

> Целенаправленное движение со случайной составляющей
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 8
Пол: Мужской

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


Захотелось написать забавную задачку, но возникла проблемка при её реализации.
Задаются начальные координаты точки и её цвет, для нее генерится точка-цель. Точка устремляется к цели, причем на каждом шаге к координатам точки довешивается рандомное значение (назовем его заносом), лежащее в промежутке [-foo,foo]. Как только расстояние от точки до цели меньше половины заноса, задается новая цель и цвет и так далее.
Например, при foo = 0 точка просто движется к цели без всяких заносов.
Вот что у меня получилось:
uses crt,graph;
var gd,gm:integer;
x,y,dx,dy,v,w,color,foo:integer;
ch:char;
function Sign(x:integer):shortint;
begin
sign:=ord(x>0)-ord(x<0); {обычная сигнатура, люблю я её через ord'ы писать}
end;
begin gd:=Detect;
randomize;
initgraph(gd,gm,'');
foo:=0;
x:=0; {задание координат исходной точки}
y:=0;
v:=random(getmaxx+1); {задание координат точки-цели}
w:=random(getmaxy+1);
color:=random(15)+1;
moveto(x,y);
readln;
repeat;
setcolor(color);
lineto(x,y);
moveto(x,y);
delay(200);
dx:=random(2*foo+1)-foo; {генерация случайной составляющей движения}
dy:=random(2*foo+1)-foo; {рандом генерит значения в промежутке [-foo,foo]}
if (x+dx>getmaxx) or (x+dx<0) then dx:=-dx; {проверка выхода за границы экрана}
if (y+dy>getmaxy) or (y+dy<0) then dy:=-dy;
inc(x,dx+sign(v-x)); {устремление точки к цели за счет сигнатуры расстояния до цели + занос}
inc(y,dy+sign(w-y));
if (abs(v-x)<=(foo div 2)) and (abs(w-y)<=(foo div 2)) then {проверка достижения цели}
begin
color:=random(15)+1;
v:=random(getmaxx+1); {задание новой цели}
w:=random(getmaxy+1);
end;
if keypressed then begin {интерфейс}
ch:=readkey;
case ch of
'+':inc(foo);
'-':if foo>0 then dec(foo);
'0':foo:=0;
'c':begin
cleardevice;
moveto(x,y);
end;
end;
end;
until ch=#27;
closegraph;
end.

Во время работы проги кнопками '+' и '-' можно изменять величину заноса, '0' - устанавливать занос = 0, 'c' - чистить экран.
Собственно, не устраивает меня реализация устремления точки к цели. Сейчас она движется сначала по диагонали |x|=|y|, а как только одна из координат становится равной координате цели, то сигнатура начинает выдавать нуль и точка движется только по горизонтали или только по вертикали. Каким бы ни был занос, точка всегда пытается выйти на такой путь.
Естественно, хочется, чтобы точка пыталась двигаться не по этому галкообразному маршруту, а сразу по диагонали.
Поскольку объяснил я чуток кривовато, прилагаю картинку с тем, чего мне хочется. ;)
Прикрепленное изображение
Буду дико благодарен за помощь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





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