Символьный вывод на экран

Lazarus IDE: Основы программирования в Windows Lazarus IDE: Основы программирования в Windows

Несмотря на то, что всё потихоньку уходит в сеть, программирование для настольных компьютеров остаётся востребованным. И будет таковым ещё долго. Ну а самая распространённая операционная система для настольных компьютеров – это по-прежнему Windows. Поэтому любой программист, даже если он собирается стать веб-разработчиком, должен знать хотя бы основы создания программ для Windows. Подробнее...

Продолжаем тему вывода информации на экран в консольных приложениях. Вы уже многое знаете о вводе-выводе данных. Вы знаете, как использовать процедуры Write и WriteLn. Вы знаете, что такое форматированный вывод. Однако это ещё не все возможности вывода символов на экран.

Что же можно придумать ещё? Не так уж и мало.

До сих пор мы выводили на чёрный экран текст скучного серого цвета. Однако пользователь любит что-нибудь повеселее. Его и оконными то приложениями сейчас не удивишь. А уж тем более консоль, да ещё монохромная. Кому интересно вглядываться в одноцветные буквы и различать, где там какие данные?

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

В консольных приложениях в текстовом режиме у каждого знакоместа на экране есть два атрибута: цвет фона и цвет текста.

Цвет фона устанавливается процедурой TextBackGround, которая объявлена в модуле CRT:

procedure TextBackGround(Цвет: Byte);

Цвет текста устанавливается процедурой TextColor, также объявленной в модуле CRT:

procedure TextColor(Цвет: Byte);

Здесь Цвет - это переменная, которая устанавливает цвет соответствующего атрибута. Эта переменная может принимать одно из значений, перечисленных в таблицах 24.1 и 24.2.

Таблица 24.1. Цветовые константы (цвет фона и цвет текста).

Константа Значение Цвет
Black 0 Чёрный
Blue 1 Синий
Green 2 Зелёный
Cyan 3 Сине-зелёный (“Морская волна”)
Red 4 Красный
Magenta 5 Пурпурный
Brown 6 Коричневый (хотя больше похож на оливковый)
LightGray 7 Серый

Таблица 24.2. Цветовые константы (только цвет текста - цвет переднего плана).

Константа Значение Цвет
DarkGray 8 Тёмно-серый
LightBlue 9 Голубой
LightGreen 10 Светло-зелёный
LightCyan 11 Бирюзовый
LightRed 12 Ярко-красный
LightMagenta 13 Розовый
Yellow 14 Жёлтый
White 15 Белый

С процедурами установки цвета можно использовать как константы, так и числовые значения.

Например

TextBackGround(GREEN); //Установить зелёный цвет фона
TextColor(WHITE);      //Установить белый цвет текста
TextColor(15);         //А можно и так установить белый цвет

Существует ещё одна константа

Blink = 128

Во времена ДОС использование этого значения приводило к тому, что текст на экране мигал. Под управлением Windows мигания не происходит. Просто текст подсвечивается тёмно-серым цветом фона (по умолчанию). Например

TextColor(Blink);
WriteLn('Hello!!!');

приведёт к тому, что строка “Hello!!!” будет выведена чёрными буквами на тёмно-сером фоне (если перед этим вы не задавали какие-либо цвета). Если вы хотите, чтобы текст был другого цвета, то сделать это можно, например, так:

TextColor(White + Blink);

Как вы успели догадаться, цветовые константы делятся на две группы: для заднего плана (цвет фона) и для переднего плана (цвет текста). Константы, используемые для цвета фона, можно использовать и для изменения цвета текста. А вот наоборот нельзя!

То есть, если вы напишите, например

TextBackGround(YELLOW);

то цвет фона не станет жёлтым. Хотя цвет фона будет изменён, но он будет не жёлтым (Yellow), а коричневым (Brown).

Но почему нельзя сделать цвет фона ярким? Оказывается, если очень хочется, то можно. Например, так:

TextColor(BLACK + BLINK);
TextBackGround(YELLOW + BLINK);
WriteLn('Hello!!!');

Здесь строка “Hello!!!” будет выведена чёрными буквами на жёлтом фоне.

Правда я не уверен, что это будет работать на всех системах. Но у меня сработало.

Отсюда вытекает одно правило - не используйте недокументированные возможности средств разработки, если планируете распространять свою программу. Потому что то, что работает у вас, может оказаться неработоспособным у конечного пользователя.

Ну и какую же практическую пользу мы можем из этого извлечь?

Это ограничено только вашей фантазией. Например, используя возможность вывода символов разных цветов вы можете написать какую-нибудь компьютерную игру типа Тетриса.

Или, например, игру в кости. Игральная кость - это кубик с шестью гранями. На каждой грани изображены точки от 1 до 6. Мы можете смоделировать бросок такого кубика и вывести результат на экран.

Генератор случайных чисел запускается один раз в начале программы процедурой

Randomize;

Затем можно получить случайное число с помощью функции

function Random(МаксЗначение : Longint) : Longint;

Где МаксЗначение - это максимальное значение диапазона, в котором будет выбрано случайное число. Например,

Random(6);

вернёт случайное число в диапазоне 0...6.

Итак, у вас теперь достаточно информации, чтобы написать программу, которая рисует на экране квадрат и моделирует бросок игральной кости. То есть в итоге в этом квадрате должно отображаться некоторое количество точек (от 1 до 6).

Предлагаю вам пораскинуть мозгами и написать такую программу. А может вы пойдёте дальше и напишите настоящую компьютерную игру, которая будет уже не просто “бросать кости”, а подсчитывать очки, вести статистику и т.п.

Ну а если начать вам сложновато, то вот вам мой пример для затравки:

Листинг 24.3. Игральная кость.
{***********************************************************************
 Имитация броска игральной кости
 ***********************************************************************}
program die;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes,
  CRT
  { you can add units after this };

const StartX = 10;
      StartY = 5;
      T = '*';
      o = #32;

const Num01 : array[1..3, 1..3] of Char = ((o, o, o),
                                           (o, T, o),
                                           (o, o, o));
      Num02 : array[1..3, 1..3] of Char = ((o, o, T),
                                           (o, o, o),
                                           (T, o, o));
      Num03 : array[1..3, 1..3] of Char = ((o, o, T),
                                           (o, T, o),
                                           (T, o, o));
      Num04 : array[1..3, 1..3] of Char = ((T, o, T),
                                           (o, o, o),
                                           (T, o, T));
      Num05 : array[1..3, 1..3] of Char = ((T, o, T),
                                           (o, T, o),
                                           (T, o, T));
      Num06 : array[1..3, 1..3] of Char = ((T, T, T),
                                           (o, o, o),
                                           (T, T, T));

var x, y  : integer;
    Q     : Char;

function CastDie : integer;
var i, n : integer;
begin
  i := 0;
  TextColor(LIGHTRED);
  while i < 10 do
    begin
      n := Random(12) + 1;
      if n > 2 then n := n div 2;
      if i = 9 then TextColor(WHITE);
      for x := StartX to (StartX + 2) do
        for y := StartY to (StartY + 2) do
          begin
            GoToXY(x, y);
            case n of
            1 : Write(Num01[x-StartX+1, y-StartY+1]);
            2 : Write(Num02[x-StartX+1, y-StartY+1]);
            3 : Write(Num03[x-StartX+1, y-StartY+1]);
            4 : Write(Num04[x-StartX+1, y-StartY+1]);
            5 : Write(Num05[x-StartX+1, y-StartY+1]);
            6 : Write(Num06[x-StartX+1, y-StartY+1]);
            end;
          end;
      Inc(i);
      Delay(100);
    end;
  Result := n;
end;

begin
  Q := #0;
  GoToXY(2, 2);
  TextColor(BLACK + BLINK);
  TextBackGround(YELLOW + BLINK);
  Write('ESC - Exit, Any Key - Continue');
  TextBackGround(GREEN);
  Randomize;
  repeat
    CastDie;
    GoToXY(2, 2);
    Q := ReadKey;
  until Q = #27;
end.

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика