• Программинг

Нужны источники бесперебойного питания?

Источники бесперебойного питания от дизельстор

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:

1 using System;
2  
3 class PositionText
4 {
5      static void Main(string[] args)
6      {
7           Console.WriteLine("Время ввести какой-то текст");
8           Console.Write("Введите текст здесь: ");
9           string text = Console.ReadLine();
10           int left = Console.CursorLeft;
11           int top = Console.CursorTop;
12           Console.SetCursorPosition(15, 20);
13           Console.Write("Вы ввели -> {0} <-", text);
14           Console.SetCursorPosition(left, top);
15           Console.WriteLine("Теперь продолжите читать статью.");
16       }
17 }

Компиляция и запуск 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 и замените строчку:

1 Console.Write("Вы ввели -> {0} <-", text);

на следующий код:

1 Console.ForegroundColor = ConsoleColor.DarkBlue;
2 Console.BackgroundColor = ConsoleColor.Yellow;
3 Console.Write("Вы ввели -> ");
4 Console.ForegroundColor = ConsoleColor.Yellow;
5 Console.BackgroundColor = ConsoleColor.DarkGray;
6 Console.Write(text);
7 Console.ForegroundColor = ConsoleColor.Magenta;
8 Console.BackgroundColor = ConsoleColor.Cyan;
9 Console.Write(" <- ");
10 Console.ResetColor();

Теперь, когда вы запустите программу, текст возле нижней границы экрана будет раскрашен.

Если вы хотите, вы можете также добавить код для заднего плана консоли используя свойство Console.BackgroundColor.

Есть еще одна вещь, которую можно попробовать. Заполните ваше окно командной строки текстом, выполнив команду

dir %SYSTEMROOT%

Затем снова запустите PositionText.exe. Эй, подождите, а где же текст? Он должен выводиться в цвете, но ведь это не так.

Перейдите к верхней части буфера, прокрутив скроллинг окна вверх. Потерянный текст будет отображаться в самом верху окна. Если вы запустите PositionText.exe несколько раз подряд, то увидите, что он перезаписывает одну и ту же строку снова и снова. Причина в том, что когда вы устанавливаете позицию курсора, то она (позиция) устанавливается относительно буфера. Позже я расскажу, как изменить размер буфера и размер окна.

Продолжение следует…