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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2012, 20:54   #1
postman
Пользователь
 
Регистрация: 13.08.2012
Сообщений: 18
По умолчанию движение в pacman, pascalABC

Делаю курсовую по игре пакман , и возникла сложность с реализацией движения . В оригинальной игре герой движется сам пока не упрётся в препятствие или пользователь изменит направление движения.Никак не получается это сделать ,, движение или зацикливается или вообще не работает
Код:
procedure moveRight;
var
  x, y, i, j: integer;
begin
  
  while (map[a.x + 1, a.y] = true) and (keypressed=false) do // здесь просто попытался остановить движущийся шарик 
  begin
    for x := round((a.x) * 100 / 2)  to round((a.x + 1) * 100 / 2)  do
    begin
      window.Clear;
      fillcircle(x, round(a.y * 100 / 2), round(50 / 2)); 
      paintmap; 
      redraw;
    end;
    a.x := (a.x + 1);
    i := i + 1;
  end;
всё пространство разбито на клетки , описываемые массивом map , если значение map в некоторой клетке true то она проходима , если false то не проходима .

Последний раз редактировалось postman; 08.11.2012 в 20:57.
postman вне форума Ответить с цитированием
Старый 08.11.2012, 21:19   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Вопрос 1. А при упирании в препятствие шарик останавливается?
Вопрос 2. В каком месте у Вас реакция на нажатие клавиши прописана (то бишь проверка, какая клавиша + смена направления движения)?
Вопрос 3. Что значит "зацикливается"?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 08.11.2012, 22:28   #3
postman
Пользователь
 
Регистрация: 13.08.2012
Сообщений: 18
По умолчанию

1 да препятствия работают нормально ,
2 в приведённом коде попытка просто остановить шарик , т. е. я нажимаю кнопку направо , и шарик движется направо пока не упрётся в препятствие , так вот я для начала пытался просто остановить его движение , но не вышло и не выходит
3 в некоторых вариантах алгоритмов движения программа зависала
postman вне форума Ответить с цитированием
Старый 09.11.2012, 08:05   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Лучше весь проект сюда кинуть - быстрее сориентируемся.
phomm вне форума Ответить с цитированием
Старый 09.11.2012, 09:41   #5
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

обычно это делается так:
1. цикл задержки (устанавливается относительно системного таймера)
2. обработка очередного шага (движения игрока, движения монстров, различные события и нажатия кнопок)
3. если игра не закончена, то к п.1
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 09.11.2012, 15:56   #6
postman
Пользователь
 
Регистрация: 13.08.2012
Сообщений: 18
По умолчанию

вот собственно весь код
Код:
uses
  graphABC, abcobjects;

type
  point = record
    x: integer;
    y: integer;
  end;

var
  map: array [1..10] of array [1..10] of boolean;
  a: point;

procedure fillMap;//стенки  карты
var
  i, j: integer;
begin
  for i := 1 to 10 do
    for j := 1 to 10 do
      map[i, j] := true;
  
  
  for i := 1 to 10 do
    map[i, 1] := false;
  
  for i := 1 to 10 do
    map[1, i] := false;
  
  for i := 1 to 10 do
    map[i, 10] := false;
  
  for i := 1 to 10 do
    map[10, i] := false;
  
  for i := 1 to 10 do 
    map[random(9) + 1, random(9) + 1] := false;// некоторое количество рандомных препятствий
end;




procedure paintMap;//отрисовка карты
var
  x, y: integer;
begin
  for x := 1 to 10 do
    for y := 1 to 10 do
    begin
      if map[x, y] = false then 
        fillrect(round((x * 100 - 50) / 2), round((y * 100 - 50) / 2), round((x * 100 + 50) / 2), round((y * 100 + 50) / 2));
    end;
end;



procedure moveLeft;
var
  x, y, target, start: integer;
begin
  target := round((a.x - 1) * 100 / 2);
  start := round((a.x) * 100 / 2);
//  for x := start downto target  do
x:=start;
while x >= target do
  begin
    x:=x-3;
    window.Clear;
    fillcircle(x, round(a.y * 100 / 2), round(50 / 2)); 
    paintmap;
    sleep(1);
    redraw;
    
  end;
  a.x := (a.x - 1);
end;


procedure moveRight;
var
  x, y, i, j, target, start: integer;
begin
  for i := a.x to 10 do
    if map[a.x + 1, a.y] = true then
    begin
      for x := round((a.x) * 100 / 2)  to round((a.x + 1) * 100 / 2)  do
      begin
        window.Clear;
        fillcircle(x, round(a.y * 100 / 2), round(50 / 2)); 
        paintmap;
        redraw;
      end;
      a.x := (a.x + 1);
    end
    else
      break;
end;

procedure Move(Key: integer);
begin
  
  window.Clear;
  case Key of
    VK_Left:  if map[a.x - 1, a.y] <> false then moveleft;
    VK_Right: if map[a.x + 1, a.y] <> false then moveright; 
    VK_Up:    if map[a.x, a.y - 1] <> false then a.y := (a.y - 1);
    VK_Down:  if map[a.x, a.y + 1] <> false then a.y := (a.y + 1);
  end;
  fillcircle(round(a.x * 100 / 2), round(a.y * 100 / 2), round(50 / 2)); 
  paintmap;
  redraw;
  window.Caption := 'x=' + inttostr(a.x) + ' y=' + inttostr(a.y);
end;





begin
  lockdrawing;
                      
  brush.Color := clblack;
  window.Width := 525;
  window.Height := 520;
  fillmap;
  paintMap;
               
  a.x := 3;
  a.y := 2;
 
  fillcircle(round((a.x * 100) / 2), round((a.y * 100) / 2), round(50 / 2));
  redraw;
  onkeydown := Move;
end.
postman вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pacman. Препятствия. Dmitry96 Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 20.06.2011 21:58
Pacman Merkator Gamedev - cоздание игр: Unity, OpenGL, DirectX 13 12.02.2011 13:58
ИИ приведений. PacMan Spooner Общие вопросы Delphi 21 26.07.2010 21:12
Pacman Roll1n C++ Builder 1 28.05.2010 20:57
PascalABC-Движение шарика m@xon Паскаль, Turbo Pascal, PascalABC.NET 8 24.09.2009 15:05