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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2010, 20:46   #1
wolwer
Новичок
Джуниор
 
Аватар для wolwer
 
Регистрация: 23.05.2010
Сообщений: 3
По умолчанию Pascal - проблема с перемещением по клавишам

Добрый вечер.
Столкнулся с некоторой проблемой при написании программы.
Необходимо перемещение по "координатам" с помощью клавиш и помещение в нужную клетку символа (произвольного).

Код очень простой. Можно реализовать через стрелки. Но для наглядности и простоты описания проблемы воспользуемся клавишами WASD, чтобы не заморачиваться пока что с двойным кодом клавиш стрелок.

И так, перемещение WASD. Пробел - рисуем символ, скажем *.

Код:
Uses Crt;
Var c : char;
     X,Y : byte;
BEGIN
  ClrScr;
  X := 1;
  Y := 1;
  Repeat
    c := readkey;
    Case c of
      'w':          {Шаг вверх}
           if Y > 1 then
             Dec(Y);
      's':           {Шаг вниз}
           if Y < 24 then
             Inc(Y);
      'a':           {Шаг влево}
           if X > 1 then
             Dec(X);
      'd':           {Шаг вправо}
           if X < 79 then
             Inc(X);
    end;
    gotoXY(X,Y);   {Перемещаем курсор}

    if c = #32 then   {Считываем пробел}
      begin
        Write('*');      {Рисуем символ}
        gotoXY(X,Y);  {Возвращаем курсор в клетку с символом}
      end;

  until c = #27; {Esc - выход}
END.

Собственно проблема:
Все работает как надо: влево, вправо, вниз - но если мы, например, рисуем символ (пробел) - перемещаемся на 1 позицию вверх (W)- рисуем символ (пробел) (он не отображается) - перемещаемся вверх (W)- рисуем символ (пробел) (отображается сразу 2 символа: текущий и на шаг ранее).

То есть возникает некая проблема при рисовании символов вверх.
Буду благодарен, если кто-нибудь укажет на ошибку или объяснит в чем здесь проблема.

EXE файл прилагается.
Вложения
Тип файла: rar PEREMNEW.rar (3.0 Кб, 9 просмотров)

Последний раз редактировалось wolwer; 23.05.2010 в 21:33.
wolwer вне форума Ответить с цитированием
Старый 23.05.2010, 21:37   #2
wolwer
Новичок
Джуниор
 
Аватар для wolwer
 
Регистрация: 23.05.2010
Сообщений: 3
По умолчанию

UP'ну тему. Не серчайте сильно
Хочется поскорее разобраться с этой ситуацией и дальше выполнять курсовик.
wolwer вне форума Ответить с цитированием
Старый 23.05.2010, 23:00   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я потрясён!
Вы натолкнулись на абсолютно непонятный глюк Windows, который заключается в том, что Винда "забывает" обновлять окно приложения. При этом я подтверждаю, что это происходит только в том случае, если курсор перемещался вверх, а после этого происходил вывод одного (именно одного) символа...

способы решения.
1) Перейти в полноэкранный режим (ALT-ENTER) - там этого глюка повторит не удалось!
2) воспользоваться оболочкой Turbo Pascal School Pak
(ну, или, что почти тоже самое - оболучкой-эмулятором DosBox) - я там этот глюк не проверял, но на 99.9% уверен, что там его не будет!
3) или воспользовать прямой записью в видеопамять... (есть библиотечки типа TPCRT/ OPCRT... да и выдрать код оттуда можно)

4) либо, НА КРАЙНИЙ СЛУЧАЙ, попробовать такой варварский метод:
Код:
    if c = #32 then   {Считываем пробел}
      begin
          Write('*');   {Рисуем символ}
          inline(
                $B4/$00/               {mov AH,$0B  }
                $B0/$83/               {mov AL,$83  }
                $CD/$10);              {int $10     }
          gotoXY(X,Y);  {Возвращаем курсор в клетку с символом}
      end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.05.2010, 23:26   #4
wolwer
Новичок
Джуниор
 
Аватар для wolwer
 
Регистрация: 23.05.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
я потрясён!
Вы натолкнулись на абсолютно непонятный глюк Windows, который заключается в том, что Винда "забывает" обновлять окно приложения. При этом я подтверждаю, что это происходит только в том случае, если курсор перемещался вверх, а после этого происходил вывод одного (именно одного) символа...

способы решения.
1) Перейти в полноэкранный режим (ALT-ENTER) - там этого глюка повторит не удалось!
Спасибо. Действительно, полноэкранный режим вполне справляется с этой проблемой и в общем-то подходит в качестве решения )
Обидно, что столько времени потрачено на такую глупую ситуацию )
Ведь знал же, что ну не может быть проблемы в коде.. эх )
wolwer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросы с перемещением объектов по форме AbekIn3D Общие вопросы Delphi 7 16.11.2010 15:39
Проблема с перемещением файла katttes Общие вопросы Delphi 7 29.04.2010 11:36
Проблема с перемещением Deamonig Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 26.09.2009 13:51
Проблема с перемещением картинки Vanya Общие вопросы Delphi 2 16.07.2008 14:30
ВОПРОС на счет блоков памяти и отслеживание за перемещением потока. Big Zee Свободное общение 7 21.04.2008 14:38