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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2010, 11:35   #1
TCH
Пользователь
 
Регистрация: 04.11.2010
Сообщений: 12
По умолчанию Как заставить работать одновремнно два действия

Привет. от нечего делать начал писать что-то типа лабиринта (игру, или типа того).
есть две части: первая отвечает за передвижения врага через промежуток времени, а вторая за передвижения игрока.
как сделать так, чтобы эти две части работали одновременно и не зависели друг от друга?
вот исходник
Код:
uses crt;
const t:array[0..11,0..11]of byte = ((1,1,1,1,1,1,1,1,1,1,1,1),
                                     (1,0,0,0,0,0,0,0,0,0,0,1),
                                     (1,0,0,0,0,0,0,0,0,0,0,1),
                                     (1,0,0,0,0,0,0,0,0,0,0,1),
                                     (1,0,0,0,0,0,0,0,0,0,0,1),
                                     (1,0,0,0,0,0,0,0,0,0,0,1),
                                     (1,0,0,0,0,0,0,0,0,0,0,1),     {это лабиринт, 1-стенка}
                                     (1,0,0,0,0,0,0,0,0,0,0,1),
                                     (1,0,0,0,0,0,0,0,0,0,0,1),
                                     (1,0,0,0,0,0,0,0,0,0,0,1),
                                     (1,0,0,0,0,0,0,0,0,0,0,1),
                                     (1,1,1,1,1,1,1,1,1,1,1,1));
 
 
var
x,y,i,j,k,x1,y1,xe,ye,e:integer;
a,move:char;
b,c:boolean;
 
procedure reprint(x,y:integer);  {процедура вывода текущего состояния}
var q,w:integer;                     {(лабиринта, врага и игрока) на экран}
begin
clrscr;
for w:= 0 to 11 do
 begin
  for q:= 0 to 11 do
   begin
    if t[q,w]=1 then write(chr(177))         {стена}
     else
      if (q=xe)and(w=ye)then write('9')       {враг}
       else
        if (q=x)and(w=y) then write(chr(4))  {игрок}
         else
          if (q=x1)and(w=y1) then write(chr(79)) {выход из лабиринта}
           else
            if t[q,w]=0 then write(' ')  {пустая клетка}
   end;
   writeln;
 end;
end;
 
procedure proofend;  {проверка окончания игры(выигрыш)}
begin
if (x=x1) and (y=y1) then b:=true;
end;
 
function proofe:boolean; {проверка столкновения с врагом}
begin
if (x=xe) and (y=ye) then proofe:=true
 else proofe:=false;
end;
 
procedure movee; {передвижени врага, пока примитивно, но лишь бы работало}
begin
 case e of
  1 : dec(xe);
  2 : inc(ye);
  3 : inc(xe);
  0 : dec(ye);
 end;
 inc(e);
 e:=e mod 4;
end;
 
procedure ending; {конец игры, если наткнулись на врага.}
begin
writeln('You lose!!!');
readln;
exit;
end;
 
begin
clrscr;
x:=1;   {начальные координаты игрока}
y:=1;
xe:=8;  {начальные координаты врага}
ye:=8;
e:=1; {условие, по которому двигается враг(см процедуру)}
b:=false; {проверка выигрыша}
proofe;
read(x1,y1); {Координаты выхода из лабиринта}
reprint(x,y);
 
 repeat                   {это собсна, первая часть, отвечающая}
  delay(40000);        {за перемещения врага}
  movee;
  if proofe then
   begin
    writeln('You lose!!!');
    readln;
    exit;
   end;
  reprint(x,y);
 until keypressed;
 
repeat                   {это вторая часть}
 move:=readkey;
  case move of
  #72 : dec(y);
  #80 : inc(y);
  #75 : dec(x);
  #77 : inc(x);
 end;
 if x<1 then x:=1;
 if y<1 then y:=1;
 if x>10 then x:=10;
 if y>10 then y:=10;
 reprint(x,y);
 proofend;
 if proofe then ending;
until b=true;     
 
writeln('You win!!!');
readln;
end.
максимум, чего я добивался, это перемещения игрока через промежутки времени, равные тем промежуткам, которые отвечают за передвижение врага.

как заставить работать их вместе? подскажите, пожалуйста!
TCH вне форума Ответить с цитированием
Старый 04.11.2010, 11:37   #2
TCH
Пользователь
 
Регистрация: 04.11.2010
Сообщений: 12
По умолчанию

Пояснение - хотелось бы, чтобы в результате можно было двигать игрока когда захочешь, а в том варианте, как делал я, а именно так:
Код:
repeat
repeat                   {это собсна, первая часть, отвечающая}
  delay(40000);        {за перемещения врага}
  movee;
  if proofe then
   begin
    writeln('You lose!!!');
    readln;
    exit;
   end;
  reprint(x,y);
 until keypressed;
 
repeat                   {это вторая часть}
 move:=readkey;
  case move of
  #72 : dec(y);
  #80 : inc(y);
  #75 : dec(x);
  #77 : inc(x);
 end;
 if x<1 then x:=1;
 if y<1 then y:=1;
 if x>10 then x:=10;
 if y>10 then y:=10;
 reprint(x,y);
 proofend;
 if proofe then ending;
until x=x;
until b=true
игрок может двигаться не чаще, чем delay(40000)
TCH вне форума Ответить с цитированием
Старый 04.11.2010, 11:52   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Установить Delphi и использовать многопоточность.В паскале, насколько мне известно, никак.
_-Re@l-_ вне форума Ответить с цитированием
Старый 04.11.2010, 11:56   #4
TCH
Пользователь
 
Регистрация: 04.11.2010
Сообщений: 12
По умолчанию

как же, я видел полностью функционирующий тетрис, написанный на паскале.

а в делфи как реализовать многопоточность?

Последний раз редактировалось TCH; 04.11.2010 в 12:05.
TCH вне форума Ответить с цитированием
Старый 04.11.2010, 12:13   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
а в делфи как реализовать многопоточность?
Потоками(threat).
Цитата:
как же, я видел полностью функционирующий тетрис, написанный на паскале.
Я тоже видел - и сам делал, но ...многопоточности там нет. Там всё по порядку.
_-Re@l-_ вне форума Ответить с цитированием
Старый 04.11.2010, 12:28   #6
TCH
Пользователь
 
Регистрация: 04.11.2010
Сообщений: 12
По умолчанию

спасибо! посмотрю, что можно сделать)
TCH вне форума Ответить с цитированием
Старый 04.11.2010, 13:14   #7
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

как вариант - на каждом шаге проверяете факт нажатия клавиатуры (если нажата - клавиша - то вигаетесь, елси нажата нужная клавиша, если не нажата, то ничего не делаете), после чего уже просчитывается ход врага
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заставить TTimer работать быстрее? Вадим Буренков Общие вопросы Delphi 5 21.07.2009 09:08
Как заставить работать CheckBox? ridmal Microsoft Office Word 1 21.05.2009 09:47
Как заставить работать NFS 2 SE? Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 02.11.2008 16:35
Как заставить работать php? yourself Помощь студентам 9 20.05.2008 08:08
Как заставить работать dll ? Volkogriz Общие вопросы Delphi 10 13.12.2007 10:24