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

Что делать, чтобы стать программистом Что делать, чтобы стать программистом

Многие сегодня хотят стать программистами. Хотят. Но ничего не делают для этого. Не делают даже простых вещей. Не хотят даже прочитать книжку из 10 страниц. В итоге так и остаются никем. Потому что мечты не сбываются никогда. Сбываются только планы… Подробнее...

Продолжаем тему вывода информации на экран в консольных приложениях. Вы уже многое знаете о вводе-выводе данных. Вы знаете, как использовать процедуры 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

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