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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2009, 13:28   #1
Stepis
 
Регистрация: 07.01.2009
Сообщений: 5
Вопрос Lines. Помогите исправить ошибку\оптимизировать.

Всем доброго времени суток. Вообщём взбрело мне в голову написать игру вроде старой доброй линс на дельфи. Понимаю, что задача непростая, но почему бы не попробовать, благо свободного времени теперь стало больше.
Пока что трудности у меня возникли с перемещением элемента.
Графикой я пока не занимался, алгоритм обкатываю в консольном режиме.
Поле заменено двухмерным массивом.
мой алгоритм
  1. Размещёние начальной и конечной точек в массиве. Элементы x,y соответственно.
  2. Заполнение массива.
  3. Определения направления движения элемента х.
  4. Проверка свободны ли начальное и конечное положения
  5. Перемещёние элемента из начального положения в конечное.

А теперь код:
1)Переменные
Код:
type
directionpointer=record
 mainvert,mainhorr{,addvert,addhorr}: byte;{в этой записи хранится информация о направлении движения.}
 end;

 square=record
 letter: char;
 free:boolean; //colour:byte;
 end ;
 type
 mass= array [1..4,1..4] of square;
 var
 field: mass;
i,j,k,l,m,n,o,p,q,r,s: byte;
 dp:directionpointer;
2) Процедуры и функции.
2.1 Проверяем свободен ли начальный\конечный элемент
Код:
function blocked ( var i,j: byte; c:mass): boolean;
 var u,d,l,r: boolean;
 begin
 u:=true;
 r:=u;
 d:=r;
 l:=d;
  case j of
    1: l:=false;
    4: r:=false;
    2..3: begin
            l:=field[i,j-1].free;
            r:=field[i,j+1].free;
          end;
  end;
  case i of
    1: u:=false;
    4: d:=false;
    2..3: begin
            u:=field[i-1,j].free;
            d:=field[i+1,j].free;
          end;
  end;
  if ((u=false) and (r=false) and (d=false) and (l=false)) then
    blocked:=true
  else
    blocked:=faLSE;
 end;
2.2 Двигаем элемент, если он свободен. Вот тут больше всего проблем. Скорее всего ошибка здесь.
Код:
procedure move (var m,n,o,p: byte; dp: directionpointer; field:mass; st2: string);
  var
  icur,jcur,ifin,jfin{,k,l,q,r}: byte;
  novertmove,nohorrmove: boolean;
  begin
  icur:=m;
  jcur:=n;
  ifin:=o;
  jfin:=p;
    novertmove:=false;
    nohorrmove:=false;
    while not (((icur=ifin) and (jcur=jfin)) or asker(st2) or (nohorrmove and novertmove)) do
    begin
    if (dp.mainhorr=2)   then
      if field[icur+1,jcur].free=true   then
        while not ((icur=ifin) {or asker(st2)} or (icur=4) or field[icur+1,jcur].free=false)  do
        begin
        field[icur,jcur].free:=true;
        field[icur,jcur].letter:='0';
        if not (icur=4) then
          icur:=icur+1
        else
        writeln('Dostignuta granitsa');
        field[icur,jcur].free:=false;
        field[icur,jcur].letter:='x';
        end
      else
      writeln('No move in this direction')
    else
      if field[icur-1,jcur].free=true   then
       while not ((icur=ifin) {or asker(st2)} or (icur=1) or field[icur-1,jcur].free=false)do //repeat
        begin
        field[icur,jcur].free:=true;
        field[icur,jcur].letter:='0';
          if not (icur=1) then
          icur:=icur-1
          else
        writeln('Dostignuta granitsa');
        field[icur,jcur].free:=false;
        field[icur,jcur].letter:='x';
        end;
        writeln('No move in this direction');
        writemass(field);
     novertmove :=true;
   if dp.mainvert=1   then
    if field[icur,jcur+1].free=true then
      while not((jcur=jfin) or asker(st2) or (jcur=4) or field[jcur+1,icur].free=false) do
   begin
      field[icur,jcur].free:=true;
      field[icur,jcur].letter:='0';
      if not (jcur=4) then
        jcur:=jcur+1
        else
        writeln('Dostignuta granitsa');
      field[icur,jcur].free:=false;
      field[icur,jcur].letter:='x';
   end
    else
     if field[icur,jcur-1].free=true then
     while not((jcur=jfin) or asker(st2) or (jcur=1) or field[jcur-1,icur].free=false)  do
      begin
        field[icur,jcur].free:=true;
        field[icur,jcur].letter:='0';
          if not (jcur=1) then
          jcur:=jcur-1
          else
        writeln('Dostignuta granitsa');
        field[icur,jcur].free:=false;
        field[icur,jcur].letter:='x';
      end;
     writemass(field);
      nohorrmove:=true;
  end;
end;
В теле программы вроде всё в порядке.
Stepis вне форума Ответить с цитированием
Старый 09.09.2009, 21:22   #2
navis
Заблокирован
 
Регистрация: 09.09.2009
Сообщений: 2
По умолчанию

Вот текст на delphi, переделывай
http://www.sdteam.com/texts/14/369.zip

// Соблюдайте правила форума! (Модератор)

Последний раз редактировалось Beermonza; 09.09.2009 в 22:20.
navis вне форума Ответить с цитированием
Старый 09.09.2009, 21:44   #3
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

А ТС, по моему, вполне нормально поступил. Не настокльо уж и много кода.
Дилетант широкого профиля.

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

Последний раз редактировалось Beermonza; 09.09.2009 в 22:20.
ROD вне форума Ответить с цитированием
Старый 10.09.2009, 22:55   #4
Stepis
 
Регистрация: 07.01.2009
Сообщений: 5
По умолчанию

Цитата:
Вот текст на delphi, переделывай
http://www.sdteam.com/texts/14/369.zip
Спасибо, изучу, но хотелось бы самостоятельно.
Цитата:
А ТС, по моему, вполне нормально поступил.
Кэп! Кто это?
Ладно. В ближайшее время выложу другой вариант.
Stepis вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите исправить ошибку Ortega Общие вопросы C/C++ 6 04.06.2009 22:39
Помогите исправить ошибку! samuex Microsoft Office Word 1 24.02.2009 22:05
Помогите исправить ошибку sergoss Общие вопросы Delphi 2 14.02.2009 09:59
Помогите исправить ошибку Булат Общие вопросы Delphi 3 25.04.2008 10:01
помогите исправить ошибку. alen666 Паскаль, Turbo Pascal, PascalABC.NET 11 08.03.2008 16:43