C#. Использование System.Console для создания игр в текстовом режиме. Часть 1
От переводчика
Когда я наткнулся на статью об использовании класса System.Console, мне сразу понравилась форма, в которой автор излагал свои мысли. Статья предлагает окунуться в разработку текстовых игр, так, как это делали в 80-е годы, но уже современными средствами (C#, .NET), и на примере игры WordFinder, разобраться, какие инструменты доступны разработчику для создания консольных приложений. Я решил сделать перевод статьи и поделиться ею с вами. Для лучшего понимания статья разбита на 3 части. Все комментарии к исходному коду были переведены на русский язык.
Введение
Я отношу себя к молокососам старой школы игр, которые работают в текстовом режиме. Эти игры работают в консоли и отображают свою «графику» в виде символов, которые расположены в разных местах экрана, используя при этом всего 16 цветов. Кроме того, такие игры легко создавать в C# и .NET используя класс System.Console, который позволяет позиционировать курсор, делать анимацию, перемещая блоки буфера, использовать цвета и специальные символы, а также реагировать на действия пользователя. В этой обучающей статье, я ознакомлю вас со всеми инструментами для создания игр в ретро MS-DOS стиле, включая завершенную игру, которую вы сможете создать сами.
После того, как я написал книгу Head First C# я точно понял одно, что создание игры является отличным способом, чтобы улучшить ваши навыки на C#. Я приложил много усилий, чтобы помочь людям выучить C# и я часто получаю вопросы типа: «Что я должен делать, чтобы получать опыт?». Я думаю имеет смысл создавать игры в виде больших проектов для обучения и экспериментов, потому что вы начинаете с хорошим представлением о том, что вы будете делать. Так одной из целей данной статьи – дать вам что-то новое и интересное. Я надеюсь, что это лучший способ получения большого опыта и оттачивания навыка разработки на C#.
Содержание: Что нужно для создания игры на C# в текстовом режиме
Эта статья построена как учебник с множеством примеров, что должно дать вам все необходимое для создания игры в текстовом режиме. Вот, что я вам расскажу:
- Позиционирование текста
- Компиляция и запуск программы на С# из командной строки
- Анимация и звук
- Специальные символы
- Прокрутка содержимого окна
- Основной цикл
Немного истории
Большинство разработчиков на .NET, которые пишут консольные приложения, используют в основном Console.ReadLine() и Console.WriteLine(). Класс System.Console может больше чем просто читать и писать текст в консоли. Он позволяет получить вам полный контроль над окном консоли для создания игры в текстовом режиме.
Если вы выросли в мире, в котором используется мышь, если вы никогда не пользовались компьютером, в котором отображается только текст без графики, то стоит взять минутку и посмотреть на игру Snipes. Это классика игр в текстовом режиме из 80-х. Вы можете скачать ее с сайта textmodegames.com, и запускать ее из под DOSBox. На самом деле стоит уделить минуту своего внимания этой игре, если раньше в нее не играли. Вот ее скриншот:

Я думаю, что люблю текстовые игры, потому что вырос на них. Когда я был ребенком, я играл в Star Trek и Adventure на VAX 11/780, которую я набрал на родительском VT-180 Robin. (В конечном итоге он был заменен на Rainbow 100, а в какой-то момент был даже Tektronix 4052 вместе с парой TRS-80s — Model 100 и CoCo2). Наконец, в середине 80-х, мы сделали это на клонах IBM PC. В серии персональных компьютеров был AT&T PC-6300 с огромным 20 мегабайтным жестким диском, который я полностью заполнил играми. В то время игры все чаще использовали разрешение 320 на 200 и 16-ти цветную графику. Среди них было много таких, которые рисовали графику текстовыми символами.
Есть еще одна вещь, на которой я должен остановиться, прежде чем мы углубимся в программирование. Каждая версия Windows, начиная с Windows 3.1, имеет командную строку. Некоторые люди (вроде меня) постоянно пользуются ей, но я работал с действительно хорошим программистами, которые редко пользуются ей. Чтобы убедиться, что вы еще читаете эту статью, откройте сейчас командную строку. Она находится в меню «Пуск >> Программы >> Стандартные» (Start >> All Programs >> Accessories). Когда вы запускаете игру в текстовом режиме, то отображаться она будет в этом окне. Если вы всегда создавали приложения из обычных форм в Visual Studio, то для вас это будет в новинку – вы будете создавать консольные приложения, и они будут выполняться в командной строке.
Позиционирование текста
Первым шагов в создании игры в текстовом режиме – отображение текста в любом месте экрана. Для этого, вы будете перемещать курсор в позицию, которая будет измеряться в колонках от левой границы экрана, и строках, от верхней границы экрана, используя несколько методов и свойств класса Console:
- Console.SetCursorPosition() устанавливает курсор в выбранную позицию консольного окна;
- свойство Console.CursorLeft возвращает или устанавливает курсор в заданную колонку:
- свойство Console.CursorTop возвращает или устанавливает курсор в заданную строку.
Эти два свойства используются, когда необходимо сохранить текущую позицию при записи текста в другую позицию экрана, чтобы снова вернуться в начальную позицию. Просто сохраните значения свойств CursorLeft и CursorTop, выполните некоторые действия, а затем установите их обратно (или используйте SetCursorPosition(), которая делает то же самое, что установка этих свойств), чтобы сбросить позицию.
Вот простая программа, которая делает именно это. Я прошу вас создать новое консольное приложение в Visual Studio и вставить код в свой Main() метод. Но поскольку мы говорим о консольных приложениях, я думаю, что полезно, чтобы вы фактически создали файл с нуля без Visual Studio, потому что это дает больше понимания о консольных приложениях. Вот что нужно сделать:
Сперва, откройте блокнот и вставьте в него следующий код:
Файл PositionText.cs:
using System;
class PositionText
{
static void Main(string[] args)
{
Console.WriteLine("Время ввести какой-то текст");
Console.Write("Введите текст здесь: ");
string text = Console.ReadLine();
int left = Console.CursorLeft;
int top = Console.CursorTop;
Console.SetCursorPosition(15, 20);
Console.Write("Вы ввели -> {0} <-", text);
Console.SetCursorPosition(left, top);
Console.WriteLine("Теперь продолжите читать статью.");
}
}
Компиляция и запуск C# программ из командной строки
Сохраните файл как PositionText.cs (я положил его в папку C:\temp\). Далее, откройте командную строку, перейдите в папку, куда вы сохранили файл и выполните в консоли следующую команду:
%SYSTEMROOT%\Microsoft.NET\Framework\v3.5\csc.exe PositionText.cs
Вы могли заметить, что я использую .NET Framework v3.5 для компиляции программ. Это потому, что основной класс System.Console остается постоянным, и не изменился за последние несколько версий .NET Framework. Но весь этот код будет прекрасно работать и в. NET 4.0 и Visual Studio 2010.
После запуска CSC должен создаться PositionText.exe. Теперь вы можете запустить его. Вот что можно наблюдать после запуска:

Обратите внимание, как программа рисует текст в нижней части окна, а затем продолжает писать линии, как обычно. Вот и все, что нужно знать о позиционировании курсора для создания игры в текстовом режиме.
Цвета
Жизнь скучна в монохромном режиме, даже для таких дальтоников как я. Я могу неверно определять цвета, но я до сих пор их вижу! И если у вас, как и у меня, есть проблемы с восприятием цвета, вы полюбите текстовый режим. В нем используется только 16 цветов, которые необходимо отслеживать. Это можно сделать членами класса System.Console:
- Свойство ForegroundColor задает цвет буквы;
- свойство BackgroundColor задает задний фон под буквой;
- оба этих свойства использует перечисление ConsoleColor, через которое задается цвет;
- метод ResetColor() сбрасывает значения цвета текста и фона.
Перейдите к вашему PositionText.cs и замените строчку:
Console.Write("Вы ввели -> {0} <-", text);
на следующий код:
Console.ForegroundColor = ConsoleColor.DarkBlue;
Console.BackgroundColor = ConsoleColor.Yellow;
Console.Write("Вы ввели -> ");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.BackgroundColor = ConsoleColor.DarkGray;
Console.Write(text);
Console.ForegroundColor = ConsoleColor.Magenta;
Console.BackgroundColor = ConsoleColor.Cyan;
Console.Write(" <- ");
Console.ResetColor();
Теперь, когда вы запустите программу, текст возле нижней границы экрана будет раскрашен.
Если вы хотите, вы можете также добавить код для заднего плана консоли используя свойство Console.BackgroundColor.
![]()
Есть еще одна вещь, которую можно попробовать. Заполните ваше окно командной строки текстом, выполнив команду
dir %SYSTEMROOT%
Затем снова запустите PositionText.exe. Эй, подождите, а где же текст? Он должен выводиться в цвете, но ведь это не так.
Перейдите к верхней части буфера, прокрутив скроллинг окна вверх. Потерянный текст будет отображаться в самом верху окна. Если вы запустите PositionText.exe несколько раз подряд, то увидите, что он перезаписывает одну и ту же строку снова и снова. Причина в том, что когда вы устанавливаете позицию курсора, то она (позиция) устанавливается относительно буфера. Позже я расскажу, как изменить размер буфера и размер окна.
Продолжение следует…
Оригинал статьи
Автор оригинала статьи: Andrew Stellman
Перевод с английского: Евгений Потребенко
Популярность: 18%
Если у вас возникли вопросы, вы можете оставить их в комментариях

