Заметки, идеи и мысли автора, обзор кода, алгоритмов, инструментов.

пятница, 1 января 2010 г.

Эффект "Матрицы" в Турбо-Паскаль

Ближайшие несколько постов большинству читателей покажутся совсем уж простыми, ибо накатила на меня настольгия по студенческим годам и решил я вспомнить Турбо Паскаль :)

Для начала, так скажем для разминки и открытия сезона Турбо Паскаля приведу описание простенькой программки которая будет визуально иметировать эффект "Матрицы". Ну кто из Вас, дорогие читатели не смотрел фильм "Матрица"? Я думаю таких сейчас днем с огнем не отыщешь, посему от слов постепенно переходим к делу.

Представим ситуацию, что есть у нас пара по программированию, все лабораторки давным давно сданы и заняться практически нечем. Включаем фантазию и пишем код.

Uses crt, Dos;
  var s,i,x,y,D,n: integer;
        r: real;
      regs: Registers;
   begin
     clrscr;
      regs.ah := 1;
      regs.ch := $20;
      regs.cl := 0;
      regs.bh := 0;
      Intr($10,regs);
      x:=1; y:=1;
      TextColor(RED);
      Writeln('                                ВНИМАНИЕ!!!');
      Writeln('Для полного эффекта просмотра разверните окно на весь экран (Alt+Enter)');
      writeln('Затем нажмите любую клавишу...');
      readkey;
      clrscr;
      REPEAT
        textattr:=10;
        r:=1;
         while r<=128 do
          r:=r+0.001;
             Randomize;
       N:=random(9);
       for I:=1 to N do begin
        d:=random(70);
        If d<10 then d:=10;
           gotoxy(x,y);
         write(CHR(d));
        y:=y+1;
       if y=25 then y:=1;
         end;
        X:=random(80);
       if x>=80 then x:=1;
        writeln;
       writeln;
      UNTIL KEYPRESSED;
         textattr:=138;
          gotoxy(32,12);
         writeln('г==============¬');
          gotoxy(32,13);
         writeln('¦ Matrix error ¦');
          gotoxy(32,14);
         writeln('L==============-');
           readln;
             gotoxy(57,24);
             TextColor(yellow);
           writeln('Автор: Мукомело Евгений');
       readln;
     end.

Теперь давайте попробуем разобрать что же мы настрочили :)
Первые строки думаю ни у кого вопросов не вызовут, а вот этот кусок:
      regs.ah := 1;
      regs.ch := $20;
      regs.cl := 0;
      regs.bh := 0;
      Intr($10,regs);
нам необходим для того что бы спрятать курсор. Если этого не сделать то по экрану будет бегать курсор и будет портить всю красоту того что мы изображаем. Для реализации используется пример из книги "Профессиональное программирование на Турбо-Паскале" А. Файсмана. Для тех кто хочет изучить всю глубину - может найти эту книгу либо погуглить, а если в крации то устанавливаются определенные параметры переменной типа Регистрс, затем инициируется вызов прерывания $10 используя при этом функционал DOS.TPU библиотеки.

И так, курсор мы спрятали. Далее по коду проводим подготовку, присваиваем первичные значения переменным, и далее.. Далее открываем цикл с постусловием, который заканчивается тогда, когда срабатывает событие нажатия клавиши на клавиатуре. А в этом самом цикле и начинается все самое интересное. Алгоритм у нас примерно следующий:
Цикл
- Выполняем импровизированную задержку, путем выполнения цикла сложения чисел.
- Далее с помощью генерации случайных (псевдослучайных) числе определяем то, какой длинны у нас будет выводимый столбец (ряд символов).
ПодЦикл
- С помощью функции генерации псевдослучайных чисел Random выберем произвольный символ из таблицы ACSII. Лично я использовал символы из диапазона от 10 до 70.
- Перемещаем курсор в нужную часть экрана с помощью gotoxy() и выводим случайный символ.
- Инкрементируем позицию курсора Y (по вертикали)
Конец ПодЦикла
- Выбираем  случайным образом, в какой позиции X (по горизонтали) будем выводить следующий ряд символов.
- Выводим новую строку, для смещения экрана вверх
Конец Цикла

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


 


В общем таким не замысловатым образом можно скоротать некоторое время и собрать у своего экрана всю группу+учителя, ну или просто скоротать некоторое время и самому полюбоваться на результат :) Это лишь скелет, в теории если обрастить графическими функциями можно сделать то что практически не будет уступать в красоте флеш аналогам.

Кстати стоит заметить, что запускать такую программу лучше всего в полноэкранном режиме (Alt+Enter), потому как в окне консоли анимации и прочие подвижные действия в DOS программах выглядят не полноценно и убого, страшно тормозя.

В следующей статье поговорим о том как плохо использовать операторы GOTO.

6 комментариев:

  1. а можно как нибудь в екзешник скомпилировать? заранее спасибо! моя почта detrop2011@yandex.ru

    ОтветитьУдалить
  2. Супер! Огромное спасибо! Жаль, что комментов мало, вещь реально стоящая и, что главное, уникальная!!!

    ОтветитьУдалить
  3. а зачем нужен цикл вайл там??

    ОтветитьУдалить
  4. аа я понял для задержки))) ну так delay для этого есть какбэ))

    ОтветитьУдалить

Постоянные читатели