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

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

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

> столкновение прямоугольников
kr3v3tkus
сообщение 23.03.2006 23:47
Сообщение #1


Пионер
**

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

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


вот задачка:
12. На середине экрана по вертикали медленно движется минимальный прямоугольник. Стрелками мы можем перемещать по вертикали другой минимальный прямоугольник по левому краю экрана. Клавишей ENTER можем "толкнуть" левый прямоугольник в правую сторону. Если левый попадет в правый, они вместе летят дальше до правого края.

подскажите как сделать, чтобы можно было управлять левым, и в это же время двигался правый. Я честно говоря в тупике unsure.gif никогда не встречался ещё стаким mega_chok.gif

Код

program lol;
uses crt;
label m1,m2,endm;
var a,b,z,x:integer;
    ch:char;
begin
clrscr;

a:=1;
b:=25;
z:=40;
x:=25;

gotoxy(a,b);

while true do    {' dvijka pravogo '}
begin
  repeat
    gotoxy(z,x);
    textcolor(black);
    write('Ы');
    dec(x);
    gotoxy(z,x);
    textcolor(white);
    write('Ы');
    gotoxy(z,x);
    delay(25000);
  until x=1;
    
    
  repeat
    gotoxy(z,x);
    textcolor(black);
    write('Ы');
    inc(x);
    gotoxy(z,x);
    textcolor(white);
    write('Ы');
    gotoxy(z,x);
    delay(25000);
  until x=25;
end;


repeat  {'  leviy kvadrat '}
gotoxy(a,b);
m2:
ch:=readkey;

  if ch=#72 then
    if b<>1 then
      begin
        gotoxy(a,b);
        textcolor(black);
        write('Ы');
        dec(b);
        gotoxy(a,b);
        textcolor(white);
        write('Ы');
        gotoxy(a,b);
      end;

  if ch=#80 then
    if b<>25 then
      begin
        gotoxy(a,b);
        textcolor(black);
        write('Ы');
        inc(b);
        gotoxy(a,b);
        textcolor(white);
        write('Ы');
        gotoxy(a,b);
      end;

  if ch=#27 then goto endm;

until ch=#13;


while a<>80 do    {' dvijka levogo '}
begin
  gotoxy(a,b);
  textcolor(black);
  write('Ы');
  inc(a);
  gotoxy(a,b);
  textcolor(white);
  write('Ы');
  delay(500);
  gotoxy(a,b);
end;

if (a=z)and(b=x) then goto m1 else goto m2;

m1:
begin
  clrscr;
  writeln('popal!!!');
  goto endm;
end;

endm:
end.

зы столкновение я ещё не писал, проверить просто низя будет без синхронности


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 3)
Lapp
сообщение 24.03.2006 6:38
Сообщение #2


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

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

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


Общий принцип примерно такой.

1. Оформляешь элементарный шаг движения каждого объекта отдельной процедурой. Входными параметрами для них делаешь параметры движения (величина шага в каждом направлении). Временной промежуток между шагами будет зависеть от желаемой скорости движения объекта.

2. Делаешь основной управляющий цикл. В нем проверяешь:
- KeyPressed. Если нажато - читать клаву и обрабатывать, изменять параметры движения, если нужно (величина шагов по координатам, а также шаг по времени для каждого объекта).
- Таймер, то есть точное текущее время. Если пришло время двигать объект номер 1 (2, 3...) - вызываешь соответствующую процедуру. То есть тебе нужно иметь массив времен, когда нужно двигать i-ый объект в следующий раз. Сравниваешь все его элементы с текущим временем, двигаешь те объекты, которые созрели, и обновляешь время следующего шага (прибавляешь шаг по времени).

Так можно и двигать все объекты (каждый со своей скоростью), и управлять ими с клавиатуры.


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


Пионер
**

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

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


пасибки, ща пошаманю smile.gif


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
kr3v3tkus
сообщение 24.03.2006 19:31
Сообщение #4


Пионер
**

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

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


сделал почти всё, только столкновение не работает, ну и медленно всётаки очень, может както переработать чтоб быстрее было?
Код
program lol;
uses crt;
label m1,m2,endm;
var a,b,z,x,s:integer;
    ch:char;
    f:boolean;

procedure l_up(var a,b:integer);
begin
if b<>1 then
begin
  gotoxy(a,b);
  textcolor(black);
  write('Ы');
  dec(b);
  gotoxy(a,b);
  textcolor(white);
  write('Ы');
  gotoxy(a,b);
end;
end;


procedure l_down(var a,b:integer);
begin
if b<>25 then
begin
  gotoxy(a,b);
  textcolor(black);
  write('Ы');
  inc(b);
  gotoxy(a,b);
  textcolor(white);
  write('Ы');
  gotoxy(a,b);
end;
end;


procedure l_run(var a,b:integer);
begin
  gotoxy(a,b);
  textcolor(black);
  write('Ы');
  inc(a);
  gotoxy(a,b);
  textcolor(white);
  write('Ы');
  gotoxy(a,b);
  delay(500);
end;


procedure r_up(var z,x:integer);
begin
    gotoxy(z,x);
    textcolor(black);
    write('Ы');
    dec(x);
    gotoxy(z,x);
    textcolor(white);
    write('Ы');
    gotoxy(z,x);
    delay(50000);
end;


procedure r_down(var z,x:integer);
begin
    gotoxy(z,x);
    textcolor(black);
    write('Ы');
    inc(x);
    gotoxy(z,x);
    textcolor(white);
    write('Ы');
    gotoxy(z,x);
    delay(50000);
end;


procedure r_run(var z,x:integer);
begin
  gotoxy(z,x);
  textcolor(black);
  write('Ы');
  inc(z);
  gotoxy(z,x);
  textcolor(red);
  write('Ы');
  gotoxy(z,x);
end;


begin
m2:
clrscr;

s:=1;
a:=1;
b:=25;
z:=40;
x:=25;
f:=true;

gotoxy(a,b);


repeat
inc(s);
if s=26 then f:=false;

if s=50 then
begin
s:=2;
f:=true;
end;


  if f=true then r_up(z,x)
  else r_down(z,x);


  if keypressed then
  begin
    ch:=readkey;
    if ch=#72 then l_up(a,b)
      else if ch=#80 then l_down(a,b);


    if ch=#13 then
    begin

      while a<>40 do
        l_run(a,b);

      if (a=z)and(b=x) then goto m2;

      repeat
        r_run(z,x);
        l_run(a,b);
      until z<>80;

    end;
  end;

until ch=#27;
end.


Сообщение отредактировано: kr3v3tkus - 25.03.2006 0:22


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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