Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2010, 13:04   #1
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Вопрос Uses CRT;

Товарищи помогите найти ошибочку!
Надо, что бы буква О двигалась на экране (60,20) по закону физики:
"угол падения равен углу отражения"
Дело в том, что буква двигается не до "посинения", а совсем не долго, не входит в процедуру!
sir.andrey вне форума Ответить с цитированием
Старый 18.03.2010, 13:04   #2
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
По умолчанию

Код:
program bilyard;
uses crt;
var znach,x,y,xpred,ypred:byte;
    knopka:char;
{zapysk shara}
procedure go(var x,y,xpred,ypred:byte);
begin
repeat
clrscr;
gotoXY(x,y);
write('o');
x:=x+1;
y:=y-1;
delay(17000);
xpred:=x-1;
ypred:=y+1;
until (y=1) or (x=20);
end;
{shar vrezalsa v verx}
procedure y1(var x,y,xpred,ypred:byte);
begin
if (y=1) and (xpred<x) then begin
                            repeat
                            clrscr;
                            xpred:=x;
                            ypred:=y;
                            x:=x+1;
                            y:=y+1;
                            gotoXY(x,y);
                            write('o');
                            delay(17000);
                            until (y=20) or (x=60);
                            end;
if (y=1) and (xpred>x) then begin
                            repeat
                            clrscr;
                            xpred:=x;
                            ypred:=y;
                            x:=x-1;
                            y:=y+1;
                            gotoXY(x,y);
                            write('o');
                            delay(17000);
                            until (x=1) or (y=20);
                            end;
end;
{shar vrezalsa v niz}
procedure maxy(x,y,xpred,ypred:byte);
begin
if (y=20) and (xpred<x) then begin
                             repeat
                             clrscr;
                             xpred:=x;
                             ypred:=y;
                             x:=x+1;
                             y:=y-1;
                             gotoXY(x,y);
                             write('o');
                             delay(17000);
                             until (y=1) or (x=60);
                             end;
if (y=20) and (xpred>x) then begin
                             repeat
                             clrscr;
                             xpred:=x;
                             ypred:=y;
                             x:=x-1;
                             y:=y-1;
                             gotoXY(x,y);
                             write('o');
                             delay(17000);
                             until (y=1) or (x=1);
                             end;
end;
{shar vrezalsa vleviy bok}
procedure x1(x,y,xpred,ypred:byte);
begin
if (x=1) and (ypred>y) then begin
                            repeat
                            clrscr;
                            x:=xpred;
                            y:=ypred;
                            x:=x+1;
                            y:=y-1;
                            gotoXY(x,y);
                            write('o');
                            delay(17000);
                            until (y=1);
                            end;
if (x=1) and (ypred<y) then begin
                            repeat
                            clrscr;
                            x:=xpred;
                            y:=ypred;
                            x:=x+1;
                            y:=y+1;
                            gotoXY(x,y);
                            write('o');
                            delay(17000);
                            until (y=20);
                            end;
end;
{shar vrezalsa vpraviy bok}
procedure maxx (x,y,xpred,ypred:byte);
begin
if (x=60) and (ypred>y) then begin
                             repeat
                             clrscr;
                             x:=xpred;
                             y:=ypred;
                             x:=x-1;
                             y:=y-1;
                             gotoXY(x,y);
                             write('o');
                             delay(17000);
                             until (y=1);
                             end;
if (x=60) and (ypred<y) then begin
                             repeat
                             clrscr;
                             x:=xpred;
                             y:=ypred;
                             x:=x-1;
                             y:=y+1;
                             gotoXY(x,y);
                             write('o');
                             delay(17000);
                             until (y=20);
                             end;
end;
begin
xpred:=0; ypred:=0;
clrscr;
znach:=lastmode;
window(1,1,60,20);
textattr:=16*0+14+0;
writeln ('vvedite koordinati "o"');
write ('x='); readln (x);
write ('y='); readln (y);
gotoXY (x,y);
while keypressed do knopka:=readkey;
go(x,y,xpred,ypred);
repeat
clrscr;
maxy(x,y,xpred,ypred);
maxx(x,y,xpred,ypred);
x1(x,y,xpred,ypred);
y1(x,y,xpred,ypred);
until readkey=#27;
textattr:=znach;
end.
sir.andrey вне форума Ответить с цитированием
Старый 18.03.2010, 13:28   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Э-э-э объект гарантированно должен двигаться только по диагонали или возможны любые варианты?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.03.2010, 13:30   #4
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Вопрос

Да по диагонали, сначала работает запускающая процедура GO, затем все остальные по мере надобности! Углы будут всегда одинаковы!
Т.е. когда я нажму Esc, программа перестанет работать, еще одна проблема состоит в том, что буква может застопориться и только нажатие клавиши исправит это дело! как сделать, чтоб буква двигалась сколько угодно?

Последний раз редактировалось sir.andrey; 18.03.2010 в 13:50.
sir.andrey вне форума Ответить с цитированием
Старый 18.03.2010, 13:50   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я давно с такими вещами не возился, потому могу только намекнуть на алгоритм
Код:
Program primer;
uses Crt;
var c:char;x,y:integer;ang:real;
begin
 c:='w';x:=1;y:=1;ang:=45;
 clrscr;
 while not keypressed do begin
  x:=x+round(cos(ang/180*pi));
  y:=y+round(sin(ang/180*pi));
  gotoxy(x,y);
  write(c);
  if (y>10)or(y<0) then begin ang:=-ang;end;
  delay(100);
 end;
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.03.2010, 13:53   #6
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Вопрос

А что в нашем случае ang?
sir.andrey вне форума Ответить с цитированием
Старый 18.03.2010, 13:59   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Угол так сказать падения
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.03.2010, 14:06   #8
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Восклицание

Цитата:
Сообщение от Stilet Посмотреть сообщение
Угол так сказать падения
Я так понял, что тут углы использовать вообще не надо, т.к.
они всегда будут одинаковые!!!
Т.е. в паскале экран, можно представить как тетрадный лист!!!
Я задаю условия:
в какую стенку врезалась буква;
с какой стороны было движение;
Но в какой-то подпрограмме цикл не срабатывает или срабатывает не правильно!
sir.andrey вне форума Ответить с цитированием
Старый 18.03.2010, 14:34   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я так понял, что тут углы использовать вообще не надо,
Я ж не зря спросил насчет движения.
Я бы даже если бы угол всегда был один и тот же все равно делал именно таким способом, рассчитывая направление тригонометрическими функциями
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.03.2010, 14:43   #10
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Вопрос

Тогда зачем умножать на pi?
Цитата:
x:=x+round(cos(ang/180*pi));
y:=y+round(sin(ang/180*pi));
любая координата должна изменяться на единицу!
если умножать на pi, то она изменяется на 3.
И еще подскажите как выходить из программы через Esc?
sir.andrey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Модуль CRT Sikey Фриланс 9 04.02.2010 20:41
модуль crt ksu25 Паскаль, Turbo Pascal, PascalABC.NET 2 24.10.2009 23:10
Небольшой кроссворд на crt Extreme Паскаль, Turbo Pascal, PascalABC.NET 2 04.03.2009 18:56
модуль crt BBagi Паскаль, Turbo Pascal, PascalABC.NET 1 27.12.2007 14:10