ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 26.10.2007, 16:32
G1yuK
Познающий
Регистрация: 25.05.2007
Сообщений: 36
Провел на форуме:
369502

Репутация: 28
По умолчанию

угу с графом на первом курсе в своё время веселились(хотя задание веселое попалось, реализовать посадку спутника на планету, увеличивая уменьшая тягу), ну это поофтопил чутка...
я раньше на с+ писал подобное, но доделланый код затерялся.
С точкой сделать проще, чем с кругом.
Как и написал ZaCo, меняешь x и y на противоположный.Например есть шаги dx и dy, вначале они равны по 1, при достигании максимому по например x2-1(так как точка будет иметь радиус=1), меняем dx=-1,это если по прямой летает, если под углом, то и соответствующий dy. Только в таком случае, фигурка летает под углом 45 градусов, а для разноообразного начала движения, использовал рандомное значения dx и dy (-1 или 1 для каждого)
 
Ответить с цитированием

  #12  
Старый 27.10.2007, 01:38
hidden
Постоянный
Регистрация: 23.04.2006
Сообщений: 622
Провел на форуме:
5887054

Репутация: 1292


По умолчанию

G1yuK ответил наиболее правильно.

Просто определяешь dx и dy
dx:=sin(угол)*скорость;
dy:=cos(угол)*скорость;

а потом в цикле прибавляешь их к x и y
x:=x+dx;
y:=y+dy;
if ((x<rect.left) or (x>rect.right)) then dx:=-dx;
if ((y<rect.top) or (y>rect.bottom)) then dy:=-dy;

и перерисовываешь точку

That's it!
 
Ответить с цитированием

  #13  
Старый 20.12.2007, 12:35
r0
Постоянный
Регистрация: 17.07.2005
Сообщений: 475
Провел на форуме:
1665310

Репутация: 488
По умолчанию

Ну вот что-то написал, может кто-нибудь поможет дописать? Очень надо =(
Код:
uses crt,graph;
var q,p,err,det,dm,x1,y1,x2,y2,i:integer;

function point(c,d:integer):integer;
begin

putpixel(c,d,2);
delay(10000);

putpixel(c,d,0);
end;

function lie(c,d,e,f:integer):integer;
begin
for i:=c to d do
begin
  delay(1000);
  setcolor(5);
  LineTo(i,d);
  delay(500);
  setcolor(15);
  LineTo(i+5,d);
end;
for i:=d to f do
begin
  delay(1000);
  setcolor(5);
  LineTo(e,i);
  delay(500);
  setcolor(15);
  LineTo(e,i+5);
end;

for i:=e downto c do
begin
  delay(1000);
  setcolor(5);
  LineTo(i,f);
  delay(500);
  setcolor(15);
  LineTo(i-5,f);
end;
for i:=f downto d do
begin
  delay(1000);
  setcolor(5);
  LineTo(c,i);
  delay(500);
  setcolor(15);
  LineTo(c,i-5);
end;


end;


begin
det:=detect;
initgraph(det,dm,'c:\coding\bp\bgi\');
err:=graphresult;
if err<>grOk then writeln(grapherrormsg(err));
readln(x1,y1,x2,y2);
rectangle(x1,y1,x2,y2);

{вычисление приращений для отскока}  
p:=x1;
q:=y1;
repeat
p:=p+1;
q:=q+2;
point(p,q);
if p>=x2 then
p:=p-2;
if q>=y2 then
q:=q-4;

lie(x1,y1,x2,y2);
until keypressed;


readkey;
closegraph;
end.
 
Ответить с цитированием

  #14  
Старый 20.12.2007, 16:30
G1yuK
Познающий
Регистрация: 25.05.2007
Сообщений: 36
Провел на форуме:
369502

Репутация: 28
По умолчанию

вот этот кусок кода
Код:
det:=detect;
initgraph(det,dm,'c:\coding\bp\bgi\');
err:=graphresult;
if err<>grOk then writeln(grapherrormsg(err));
помести после readln( у тебя включается графика, а в ней readln не работает и не может считать данные), а лучше все эти 4 координаты прямоугольника сделай константами. Легче потом в коде разбираться. Это пока явные ошибки.
Ещё ты писал что точка начинает двигаться под углом А. Но у тебя нигде нет ввода угла А.
Так же немного не ясно, зачем функция lie. Она вроде как рисует прямоугольник вручную?

Последний раз редактировалось G1yuK; 20.12.2007 в 16:38..
 
Ответить с цитированием

  #15  
Старый 20.12.2007, 16:35
Xserg
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме:
426226

Репутация: 726
По умолчанию

Для угла 45гр добавь две переменные vx,vy:integer;
Код:
{вычисление приращений для отскока}  
p:=x1; vx:=+1;
q:=y1; vy:=+1;
repeat
if ((p+vx)<x2) and ((p+vx)>x1) then p:=p+vx else if vx>0 then vx:=-1 else vx:=+1;
if ((q+vy)<y2) and ((q+vy)>y1) then q:=q+vy else if vy>0 then vy:=-1 else vy:=+1;
point(p,q);
lie(x1,y1,x2,y2);
until keypressed;
Паскалей нет проверить не могу
 
Ответить с цитированием

  #16  
Старый 20.12.2007, 20:47
r0
Постоянный
Регистрация: 17.07.2005
Сообщений: 475
Провел на форуме:
1665310

Репутация: 488
По умолчанию

Цитата:
помести после readln( у тебя включается графика, а в ней readln не работает и не может считать данные), а лучше все эти 4 координаты прямоугольника сделай константами.
У меня все работает, данные readln считывает.
На угол мне уже пофик, лишбы двигалась точка, хотя, конечно, и угол не помешал бы.
Цитата:
Так же немного не ясно, зачем функция lie. Она вроде как рисует прямоугольник вручную?
http://forum.antichat.ru/showpost.php?p=487880&postcount=61
Xserg с п а с и б о!)
Переделал вот так:

Код:
p:=x1; vx:=trunc(sin(a))+3;
q:=y1; vy:=trunc(cos(a))+3;
repeat
if ((p+vx)<x2) and ((p+vx)>x1) then p:=p+vx else if vx>0 then vx:=-3 else vx:=+3;
if ((q+vy)<y2) and ((q+vy)>y1) then q:=q+vy else if vy>0 then vy:=-3 else vy:=+3;
point(p,q);
lie(x1,y1,x2,y2);
until keypressed;
Хм.. теперь осталось вычислить соприкасается ли Удав и точка...
 
Ответить с цитированием

  #17  
Старый 21.12.2007, 20:42
r0
Постоянный
Регистрация: 17.07.2005
Сообщений: 475
Провел на форуме:
1665310

Репутация: 488
По умолчанию

Так, как я уже писал, остается вычислить соприкасается ли Удав и точка...
Чтобы мне сравнить координаты точки(он же зайчек) и удава, мне нужно чтобы ф-я возвращала в программу параметры? Правильно я написал? Что-то нет у меня радостного сообщения на экране "congrats!"
Код:
uses crt,graph;
var vx,vy,q,p,err,det,dm,x1,y1,x2,y2,i,a:integer;


function point(k,l:integer):integer;
begin

putpixel(k,l,2);
delay(9000);

putpixel(k,l,0);
end;

procedure lie(var c,d,e,f:integer);
begin
for i:=c to d do
begin
  delay(1000);
  setcolor(5);
  LineTo(i,d);
  delay(500);
  setcolor(15);
  LineTo(i+5,d);
end;
for i:=d to f do
begin
  delay(1000);
  setcolor(5);
  LineTo(e,i);
  delay(500);
  setcolor(15);
  LineTo(e,i+5);
end;

for i:=e downto c do
begin
  delay(1000);
  setcolor(5);
  LineTo(i,f);
  delay(500);
  setcolor(15);
  LineTo(i-5,f);
end;
for i:=f downto d do
begin
  delay(1000);
  setcolor(5);
  LineTo(c,i);
  delay(500);
  setcolor(15);
  LineTo(c,i-5);
end;


end;


begin
det:=detect;
initgraph(det,dm,'e:\bp\bgi\');
err:=graphresult;
if err<>grOk then writeln(grapherrormsg(err));
readln(x1,y1,x2,y2,a);
rectangle(x1,y1,x2,y2);

{вычисление приращений для отскока}

p:=x1; vx:=round(sin(a)+3);
q:=y1; vy:=round(cos(a)+3);
repeat
if ((p+vx)<=x2) and ((p+vx)>=x1) then p:=p+vx else if vx>=0 then vx:=-3 else vx:=+3;
if ((q+vy)<=y2) and ((q+vy)>=y1) then q:=q+vy else if vy>=0 then vy:=-3 else vy:=+3;
point(p,q);
lie(x1,y1,x2,y2);
if ( (p=x1) or (p=x2) ) and ( (q=y1) or (q=y2) ) then
begin
     setcolor(10);
     settextstyle(3,0,8);
     outtextxy(150,200,'CONGRATS! Udav fucked the rabbit! ');

end;
until keypressed;


readkey;
closegraph;
end.
 
Ответить с цитированием

  #18  
Старый 22.12.2007, 03:49
G1yuK
Познающий
Регистрация: 25.05.2007
Сообщений: 36
Провел на форуме:
369502

Репутация: 28
По умолчанию

Код:
if (k=1) then
begin
     clrscr;
     setcolor(10);
     settextstyle(3,0,8);
     outtextxy(150,200,'CONGRATS! Udav fucked the rabbit! ');
     delay(1000);
end;
немного код переписать и поставить после слов until ((keypressed) or (k=1)) и в самом начале программы k:=0; . А на место того кода при выполнении условия k:=1; У тебя даже если зайчика поймали, он продолжит рисовать поверх надписи о победе.
Так же тебе надо синхронизировать передвижение зайца и удава. А то у тебя удав делает полный круг и заяц делает ход. Может хотя бы разбить те 4 цикла на 4 функции. Передвижение по нижней планке ,левой правой, верхней. И вызывать по определённому условию

Последний раз редактировалось G1yuK; 22.12.2007 в 03:52..
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ