Символьный вывод на экран
Lazarus IDE: Основы программирования в Windows
Несмотря на то, что всё потихоньку уходит в сеть, программирование для настольных компьютеров остаётся востребованным. И будет таковым ещё долго. Ну а самая распространённая операционная система для настольных компьютеров – это по-прежнему Windows. Поэтому любой программист, даже если он собирается стать веб-разработчиком, должен знать хотя бы основы создания программ для Windows. Подробнее... |
Продолжаем тему вывода информации на экран в консольных приложениях. Вы уже многое знаете о вводе-выводе данных. Вы знаете, как использовать процедуры Write и WriteLn. Вы знаете, что такое форматированный вывод. Однако это ещё не все возможности вывода символов на экран.
Что же можно придумать ещё? Не так уж и мало.
До сих пор мы выводили на чёрный экран текст скучного серого цвета. Однако пользователь любит что-нибудь повеселее. Его и оконными то приложениями сейчас не удивишь. А уж тем более консоль, да ещё монохромная. Кому интересно вглядываться в одноцветные буквы и различать, где там какие данные?
Намного лучше, когда выводимые данные не только отформатированы, но и раскрашены в разные цвета, чтобы, например, без труда разобраться, где нужно вводить данные, а где данные, которые выводит программа.
В консольных приложениях в текстовом режиме у каждого знакоместа на экране есть два атрибута: цвет фона и цвет текста.
Цвет фона устанавливается процедурой TextBackGround, которая объявлена в модуле CRT:
procedure TextBackGround(Цвет: Byte);
Цвет текста устанавливается процедурой TextColor, также объявленной в модуле CRT:
procedure TextColor(Цвет: Byte);
Здесь Цвет - это переменная, которая устанавливает цвет соответствующего атрибута. Эта переменная может принимать одно из значений, перечисленных в таблицах 24.1 и 24.2.
Константа | Значение | Цвет |
Black | 0 | Чёрный |
Blue | 1 | Синий |
Green | 2 | Зелёный |
Cyan | 3 | Сине-зелёный (“Морская волна”) |
Red | 4 | Красный |
Magenta | 5 | Пурпурный |
Brown | 6 | Коричневый (хотя больше похож на оливковый) |
LightGray | 7 | Серый |
Константа | Значение | Цвет |
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).
Предлагаю вам пораскинуть мозгами и написать такую программу. А может вы пойдёте дальше и напишите настоящую компьютерную игру, которая будет уже не просто “бросать кости”, а подсчитывать очки, вести статистику и т.п.
Ну а если начать вам сложновато, то вот вам мой пример для затравки:
{*********************************************************************** Имитация броска игральной кости ***********************************************************************} 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.