Как рисовать в командной строке windows

Обновлено: 08.07.2024

Командная строка позволяет вводить и выполнять команды операционной системы и другие компьютерные команды. Вводя команды, можно выполнять на компьютере различные задачи, не пользуясь мышью или сенсорным вводом.

В разделе перечислены базовые приемы работы в командной строке Windows.

Запуск командной строки¶

Для запуска командной строки воспользуйтесь одним из следующих способов:

  • «Пуск → Выполнить» (или клавиши Win+R ) введите cmd и нажмите клавишу Enter ;
  • «Пуск → Все программы → Стандартные → Командная строка»;
  • «Пуск → Поиск → Командная строка».

Ввод команд¶

Команды вводятся посредством ввода с клавиатуры. Простейшая команда help выводит список всех доступных команд. Также вы можете просмотреть полный перечень команд в статье Список команд Windows ( Windows CMD ).

Для вывода справки по конкретной команде введите help название_команды , например:

Перечень основных команд и примеры их использования приведены в разделе Основные команды данного руководства.

Bat-файлы¶

Используя команды можно написать bat файлы,которые позволяют упрощать и автоматизировать выполнение задач. Более подробно работа с bat файлами рассматривается в статьях:

Автодополнение путей файлов¶

Чтобы не набирать вручную весь путь к файлам используется клавиша Tab на клавиатуре. Она автодополняет названия директорий и файлов, например, чтобы ввести название папки User , достаточно ввести первую букву и нажать клавишу Tab , будет подставлено соответствующее значение.

Если на букву U начинается несколько директорий или файлов, то при каждом последующем нажатии Tab будет происходить перебор названий. Чтобы произвести перебор в обратном порядке, нажимайте Tab c зайжатой клавишей Shift .

Если папка состоит из нескольких слов, разделенных пробелом или из кириллических символов, то весь путь берется в кавычки, например, cd "C:\Documents and Settings"

Копирование текста в/из командной строки¶

По умолчанию копирование текста из командной строки отключено. Чтобы его включить необходимо:

  1. Нажать правой кнопкой мыши на заголовок окна командной строки и выбрать пункт «Свойства»;
  2. Установить галочки напротив «Выделение мышью» и «Быстрая вставка»;

Для копирования текста из командной строки достаточно выделить текст и щелкнуть правой кнопкой мыши, выделенный текст скопируется в буфер обмена. Для вставки текста в командную строку также используется нажатие правой кнопкой мыши.

Командная строка представляет собой программное средство ввода команд пользователем и получения результатов их выполнения на экране. В современных операционных системах семейства Windows, командную строку обеспечивает стандартное приложение cmd.exe , так же называемое командным процессором, интерпретатором команд и консолью. Приложение ”Командная строка” предоставляет пользователю текстовый интерфейс для ввода команд и получения результатов их выполнения. Фактически, командная строка является программным эмулятором классической консоли первых компьютерных систем, представляющей собой терминал с клавиатурой, используемый оператором в качестве средства общения с компьютером. Как и во времена первых компьютеров, командная строка поддерживает стандартное устройство ввода – клавиатуру, и стандартное устройство вывода – дисплей. Пользователь вводит команды с клавиатуры и получает результаты их выполнения на экране дисплея.

Запуск командной строки.

Для запуска командной строки можно воспользоваться одним из следующих способов:

Пуск - Выполнить (или клавиши Win+R) введите cmd и нажмите клавишу Enter;

Пуск - Все программы - Стандартные - Командная строка»;

Пуск - Поиск - Командная строка. Также, для запуска командной строки можно использовать заранее подготовленный ярлык, ссылающийся на исполняемый файл %SystemRoot%\system32\cmd.exe ( обычно – C:\Windows\system32\cmd.exe). Выполнение некоторых команд требует повышенных привилегий, поэтому, приложение командной строки должно быть запущено с использованием пункта контекстного меню ”Запуск от имени администратора”, вызываемого правой кнопкой мышки.

Настройка командной строки.

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

Работа в командной строке предполагает ввод данных с клавиатуры, при чем, иногда довольно большого объема. Этот объем можно значительно сократить, используя некоторые приемы:

Использование буфера обмена.

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

Настройки командной строки в Windows 10

В режиме выделения мышью, контекстное меню не используется, а текст выделяется с использованием левой кнопки мышки. Копирование и вставка выполняется при нажатии правой кнопки мышки. При включенном режиме ”Разрешить сочетания клавиш с CONTROL”, можно использовать стандартные сочетания клавиш:

- CTRL+C (CTRL+Insert) – скопировать выделенный текст.

- CTRL+V (Shift+Insert) – вставить выделенный текст.

Использование истории команд и горячих клавиш.

Для вызова ранее введенных команд используются клавиши со стрелками Стрелка Вверх - на одну команду назад и Стрелка Вниз - на одну команду вперед. Кроме того, можно использовать функциональные клавиши:

F1 - посимвольный вызов последней введенной команды. Каждое нажатие F1 приводит к последовательной подстановке в поле ввода одного символа из предыдущей команды.

F3 - вызов предыдущей команды.

F4 - удалить до символа. Выполняется удаление текста от текущей позиции курсора до заданного символа.

F5 и F8 - вызов буфера ранее введенных команд. Вывод по нажатию клавиши F5 прекращается когда будет отображена первая введенная команда текущей сессии.

F7 - отображение ранее введенных команд в отдельном окне в виде списка. Для выполнения нужной команды нужно выбрать ее, используя клавиши со стрелками, и нажать ENTER

F9 - выполнить команду, номер которой запрашивается. Номер команды в списке истории можно получить при использовании F7 .

В Windows 10 / Windows Server 2016 появились возможности, отсутствующие в предыдущих реализациях командной строки:

- Изменение прозрачности окна консоли при нажатии комбинаций CTRL + Shift + - или CTRL + Shift + + .

- Включение / выключение полноэкранного режима при нажатии CTRL+Enter .

- Расширение возможностей выделения текста и редактирования:

Shift+Home – выделить текст от текущего положения курсора до начала строки.

Shift+End – выделить текст от текущего положения курсора до конца строки.

- Быстрое перемещение по буферу экрана и поиск по контексту:

CTRL+Home – перейти в начало буфера экрана

CTRL+End – перейти в конец буфера экрана.

CTRL+Стрелка Вверх - перемещение на 1 строку вверх.

CTRL+Стрелка Вниз - перемещение на 1 строку вниз.

CTRL+F - открыть диалог поиска текста в буфере экрана.

Окно командной строки в Windows 10 можно закрыть с помощию стандартной комбинации клавиш - ALT+F4 .

Для отключения новых возможностей CMD, необходимо в свойствах приложения установить галочку ”Использовать прежнюю версию консоли (требуется перезапуск)”

Автодополнение путей файлов

В командной строке Windows можно выполнять подстановку имен файлов и каталогов при нажатии клавиши Tab . Например, для перехода, в каталог с длинным именем Program Files наберите начальную часть имени каталога

CD Pro и нажмите Tab. В строке ввода должна появиться команда :

CD "Program Files"

Как видим, выполняется подстановка недостающей части имени каталога, а в тех случаях, когда в нем имеется символ пробела, добавляются еще и двойные кавычки.

Если имеется несколько совпадающих начальных частей имен файлов или каталогов, при каждом нажатии клавиши Tab будет подставляться следующее по алфавитному порядку имя. Для возврата на предыдущее - используется комбинация Shift+Tab

Перенаправление данных стандартного ввода /вывода консоли.

Как уже упоминалось, в качестве стандартного устройства ввода командной строки используется клавиатура, а в качестве устройства вывода – дисплей. Однако, существует возможность перенаправления ввода-вывода на другие устройства c использованием операторов перенаправления:

ping –n 5 localhost > nul - выполнить пинг петлевого интерфейса 5 раз с перенаправлением вывода в фиктивное устройство nul . Вывод результатов выполнения команды подавляется. Подобный прием используется для организации задержки в командных файлах, поскольку пинг петлевого интерфейса выполняется почти мгновенно, а интервал между пингами равен одной секунде, время выполнения данной команды определяется значением параметра -n

Нередко, вывод одной команды нужно передать в качестве вводимых данных для другой, т.е. объединить команды в последовательную цепочку:

ping -n 100 microsoft.com | find "Превышен интервал" - результат выполнения команды ping -n 100 microsoft.com передается в виде входных данных для команды поиска строк ( find ), содержащих текст "Превышен интервал".

ping -n 100 microsoft.com | find "Превышен интервал" > C:\ping-ya.txt - то же, что и в предыдущем примере, но с перенаправлением выводимых результатов выполнения команды в текстовый файл.

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

0 ( STDIN ) – дескриптор стандартного ввода (ввод с клавиатуры).

1 (STDOUT) – дескриптор стандартного вывода (вывод на экран).

Для задания перенаправления в существующие дескрипторы используется амперсанд (&), затем номер требуемого дескриптора (например, &1):

Если дескриптор не определен, то по умолчанию оператором перенаправления ввода будет ноль (0), а оператором перенаправления вывода > будет единица.

Объединение нескольких команд в цепочку

В командной строке Windows существует возможность последовательного выполнения нескольких команд в зависимости от результатов их выполнения. Для чего используются символы объединения команд - & (амперсанд) и | (вертикальная черта)

& - одиночный амперсанд используется для разделения нескольких команд в одной командной строке. Например:

&& - условное выполнение второй команды. Она будет выполнена, если код завершения (значение которого передается в стандартную переменную ERRORLEVEL) первой команды равен нулю, т.е. команда выполнена успешно.

команда1 && команда2 - выполняется команда1 , а команда2 выполняется, только если первая была выполнена успешно. Например:

Двойная вертикальная черта || - условное выполнение второй команды. Если первая команда завершилась с кодом возврата не равным нулю (неуспешно), то выполняется команда, следующая за двойной вертикальной чертой.

команда1 || команда2 - если команда1 выполнена неуспешно, то запускается на выполнение команда2

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

Логика условной обработки команд, реализуемая с помощью конструкций && и || действует только на ближайшую команду, то есть, при вводе команды

TYPE C:\plan.txt && DIR & COPY /?

команда COPY /? запустится в любом случае, независимо от результата выполнения команды TYPE C:\plan.txt . Но, несколько команд можно сгруппировать с помощью скобок. Например, есть 2 командные строки:

TYPE C:\plan.txt && DIR & COPY /?

TYPE C:\plan.txt && (DIR & COPY /?)

В первой из них символ условной обработки && действует только на команду DIR, во второй — одновременно на две команды: DIR и COPY. В качестве наглядного эксперимента, попробуйте выполнить вторую команду при условиях наличия и отсутствия файла C:\plan.txt . Для создания пустого файла можно воспользоваться копированием из фиктивного устройства nul :

copy nul C:\plan.txt

Для удаления файла используется команда erase c:\plan.txt или del C:\plan.txt

Командные файлы

Командные файлы (сценарии, скрипты) – это обычные текстовые файлы с заранее подготовленным набором команд для их выполнения командным процессором cmd.exe . Стандартно, такие файлы имеют расширение .bat или .cmd . Строки командных файлов могут содержать специфические команды самого процессора команд, например - FOR, ECHO, REM и т.п. или имена исполняемых модулей – reg.exe, sc.exe, auditpol.exe., которые можно использовать без расширения – reg, sc, auditpol. Пример простого командного файла:

REM Создается текстовый файл со списком каталога Windows
dir C:\Windows > %TEMP%\winlist.txt
REM выполняется задержка на 5 секунд
ping -n 5 localhost > nul
REM Файл открывается в редакторе WordPad
write %TEMP%\winlist.txt
REM После завершения работы Wordpad, текстовый файл удаляется.
erase C:\winlist.txt

Строки, начинающиеся с REM являются комментариями. В качестве примера, используются команды для работы с файловой системой и выполняется запуск приложения графической среды – текстового редактора Wordpad (write.exe) с передачей ему параметра командной строки (имя файла). Язык командных файлов довольно примитивен и не в полной мере соответствует требованиям сегодняшнего дня, однако, он является самым простым средством автоматизации рутинных действий и используется большинством системных администраторов и грамотных пользователей. Работа с командными файлами – это отдельная тема, более подробно изложенная на странице Командные файлы

Прочие материалы для освоения работы в командной строке Windows:

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

Игровой движок

Итак, начнем с того как игра устроена в корне, и какова ее идея работы.

Сначала я определился с тем, как будет выводится игровой мир в консоль. Понял, что для вывода игровых объектов, нам нужен список, который хранит в себе другие списки, которые хранят в себе символы, которые в последующем выводятся на игровое поле циклом for .

Вот таким кодом:


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

Вот так выглядит переменная, которая хранит списки символов:

image

Тут cразу мы получаем решение как нам выводить по X и Y объекты, мы теперь можем указывать:

X — символ в списке
Y — список в котором содержится X
Тем самым нарисовать на поле какой-нибудь символ. Это мы будем использовать при рисовании игровых объектов.

Можем попробовать нарисовать на поле «мяч», подставив на место X и Y букву «O».

Для этого напишем такой код:


image

И вот, мы нарисовали объект на нашем игровом поле. Правда координаты X и Y получились не классическими. Во первых, мы указываем сначала Y, потом X, что не совсем по классике, во вторых, координата Y должна увеличиваться чтоб поднять объект, у нас же наоборот, она должна уменьшатся.

График X и Y в игре:

image

Эту особенность тоже придется учитывать в дальнейшем, когда мы будем делать столкновение объектов в консоли.

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

Нам понадобится очищать консоль, для того чтобы стирать старую картинку игрового поля.
Это мы сделаем командой:


Также, нам понадобится переопределять переменную OUTPUT_IMAGE , для того чтобы очищать все ранее нарисованные в игровом поле объекты.

Также нам все это нужно будет поместить в while True .

Добавим в while True функцию time.sleep(1) , для того чтобы ограничить FPS.

И вот, код нарисовался на глазах:


Теперь у нас есть возможность распределять объекты по полю.

Правда эти объекты слишком примитивы, и надо бы научится рисовать сложные объекты по типу игроков, домов, еды…

Для того чтобы нарисовать сложный объект, нам нужно понять и придумать, как нарисовать объект указав лишь один раз его X и Y.

Для этого нам понадобится функция, которая принимает картинку (символы), X, Y;


Теперь нам нужно ее реализовать. Для этого нужно решить, как нарисовать изображение, которое растягивается по оси X и Y, я придумал так:
рисовать объект разделяя его на символы, и как только встретится символ "\n", прибавить ось Y.

Ось Y как мы уже говорили неправильная, перевернутая наоборот, поэтому к ней мы прибавляем чтобы опустить объект.

Пример изображения который рисуется по моему принципу:


Теперь давайте это опишем в нашей функции:


Добавим try: except() для того чтобы небыло ошибок если объект имеет X и Y слишком мальенькие или слишком большие.

x_start Это X, с которого нужно начинать рисовать при увеличении Y (при символе "\n")

Теперь мы можем использовать нашу функцию, падать в нее X и Y, и картинку которую нужно рисовать:

И вот что у нас получилось:

image

абсолютно также как и шарик который мы рисовали, его можно двигать по оси X и Y.


И вот, у нас уже двигает игрок по карте.

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

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

Итак, функцию я решил сделать по такой логике:

X — хитбокс объекта по X ширине, это самое больше количество символов между знаками "\n" в картинке
Y — хитбокс по Y это число символов "\n" в картинке

По этой логике не сложно сделать функцию, которая принимает картинку, считает у нее все символы между "\n", и выбирает из этого самое больше число символов — получилась широта.
И если посчитать символы "\n", как я уже написал — получится высота.

Функция получилась такой:

Он здесь чтобы предотвратить ошибку при запуске игры.

Итак, давайте нарисуем нашего игрока, и вычислил его ширину и длину.

Ура! у нас есть функция вычисления широты и высоты, теперь нам предстоит сделать функцию вычисления хитбокса и столкновений объектов.

Вспомним что у нас система координат не классическая, поэтому классическую функцию увы использовать не сможем, придется делать свою. Я для этого я нарисовал на графике 2 квадрата, которые сталкиваются, и по этой картинке можно придумать условие по которому будет высчитано столкновение

Для простоты понимания я нарисовал хитбоксы, Т.Е. квадраты:

image

Для вычисления мы подаем

x — X первого объекта
y — Y первого объекта
h — Высота первого объекта
w — Широта первого объекта
x2 — X второго объекта
y2 — Y второго объекта
h2 — Высота второго объекта
w2 — Широта второго объекта

если
y больше y2 - h2 + h и y - h меньше чем y2 + h2 - h
или же
y2 больше y - h + h2 и y2 - h2 меньше чем y + h - h2

Мы сделали проверку 2 раза, просто из-за того чтобы посмотреть на столкновение/не столкновение с разных объектов.

Объекты соприкасаются по оси Y

Дальше смотри соприкосновение по оси X, она такое же что и по оси Y, но вместо y — x , а вместо h — w .

x больше x2 - w2 + w и x - w меньше чем x2 + w2 - w

x2 больше x - w + w2 и x2 - w2 меньше чем x + w - w2

объекты соприкасаются по оси X

Логика такая же как и на словах, только в функции:


Функция возвращает True если объекты соприкасаются, и False если нет.

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

И попробовал как работает функция высчета столкновения.

Вот игрок соприкасается и кубом:

image

А вот нет соприкасаются:

image

Это полный код соприкосновения/не соприкосновения:

Теперь у нас все стартовые функции для игры, собственно их основе я писал свою игру.

Идея игры в такая:

Есть игрок, вокруг появляется еда, которую он вынужден собрать чтоб не умереть. В игре также присутствуют функции: поднять еду, положить в инвентарь, съесть ее из инвентаря, положить на пол предмет из инвентаря

Я начал с того что сделал игровой цикл в 3 строчки, это просто While True :


Дальше я посчитал нужным, создать класс, в котором будут хранится все функции будующий объектов. Поэтому создал файл main.py и папку lib, в которую поместил файл lib.py в котором был класс игры. Т.Е. файлы игры выглядели так:


В дальнейшем я работал в основном с классом Game(), в main.py просто вызывал его, создавал стартовые объекты, запускал игру.

В классе game сделал функцию run(), которая заупускает игровой цикл. Также сделал функцию draw_all(), она стирает все прошлые объекты, рисует новые, и печатает на игровое поле.

И так выглядел класс:


Добавил все основные функции, по типу set_image() , size_object() , is_clash() , и все те которые являются игровым движком, и которые я описал выше.

Сделал новую функцию create_object() и переменную self.OBJECTS , функцию create_object() я использую для создания объектов, она принимает параметры img , name , x , y , up , rigid , data .

img — картинка объекта
name — имя объекта (дом, трава, житель, еда и.т.п.)
x — X объекта
y — Y объекта
up — если этот параметр True, то объект рисуется над игроком, иначе игрок его перекрывает собой
rigid — твердость, игрок не может пройти через этот объект (еще не реализовано)
data — личные данные объекта, его личные характеристики

Эта функцию которая сейчас у меня в игре:

На тот момент я уже добавил игрока, дом, траву, и жителя.

И решил использовать тот самый параметр в объекте up , использовать его в объекте Home , Т.Е. чтоб дом закрывал собой игрока. Для этого я сделал функцию CheckAll(), циклом for проходился по всем объектам, и рисовал их на исходящей картинке, Т.Е. использовать функцию SetImage(x: int, y: int, img:str), подавая в нее X и Y объекта, и картинку.

Тем самым рисовал объекты которые мог закрыть собой игрок. В этом же цикле я объявил список up_of_payer_objects , и если у объекта стоял up=True, то я добавлял его в список, не рисуя его на поле. После рисовал самого игрока, и только этого я проходил циклом for по объектам в up_of_payer_objects, рисуя их, тем самым они были над игроком.


Дальше я занялся движением игрока. Для этого я создал его как отдельный объект, который не находится в списке self.OBJECTS , но который хранится в переменной self.PLAYER .

Все его параметры, по типу X , Y , img , и.т.п. получить можно с помощью ключей, проще говоря это словарь (dict). С таким игроком и объектами уже можно было работать, двигать, вычислить столкновения. Я начал с движения.
Начал создавать движение с того что сделал функцию CheckKeysObjects(), которая отвечает за отслеживание нажатия клавиш, и которую я вызываю в функции CheckAll() в самом начале


Для отслеживания нажатий на клавиши я использовал библиотеку keyboard, и 4 переменные:

self.WALK_LEFT_PLAYER
self.WALK_RIGHT_PLAYER
self.WALK_UP_PLAYER
self.WALK_DOWN_PLAYER

И все оказалось просто, отслеживаем клавиши, и если нажата допустим d , то мы переменную self.WALK_RIGHT_PLAYER делаем True .

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

После этого я в функции CheckAll() проверяю все перменные отвечающие за движение, узнаю, куда двигается игрок.

Если какая-то в True , узнаем какая, и двигаем предмет в противоположную сторону.

Да, мы двигаем предметы в противоположную сторону, для того чтобы создать иллюзию движения. Если игрок идет на право, то все предметы окружения смещаются налево.

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

Для отсчета времени спавна еды, я использовал простой time.sleep() , и библиотеку threading — для того чтобы запустить 2 функции одновременно, спавн еды и основной игровой цикл. Функция спавна еды SpawnEat() — это просто функция которая при запуске генерирует на случайных местах еду, вызывая для каждой единицы еды функцию CreateObject() .

Также, как только я сделал функцию спавна еды, я сделал переменную у игрока self.PLAYER["hungry"] , это его голод, в самом начале он равен — 100 ед., его я буду уменьшать если игрок ходит и тратит энегрию (типа энергию, ее в игре нет) или увеличивать если игрок что-то съел.

Также я сделал функцию MinimizeHungry() , она вызывается каждые 5 секунд, и просто отнимает у игрока 2 единицы голода. Это я сделал для того чтобы игроку пришлось двигаться, а не стоять на месте.

И наконец в функции Eat() , эта функция которая вызывается в отдельном потоке от игрового цикла. Она проверяет не слишком ли много еды на карте, если еды больше 10 ед. то НЕ вызывает функцию SpawnEat() , если меньше 10 ед. то вызывает SpawnEat() .

Вот какой она получилась:

Функция Start() , для запуска основного цикла:

И функция run() , которая запускает всю игру.

Сам процесс поедания, я реализовал просто в функции CheckAll() и CheckKeysObjects() . В CheckKeysObjects() я проверял не нажал ли игрок на кнопку E . Если нажал, то ставил переменную self.PRESS_E в True .

В цикле CheckAll() , проверял, не еда ли нынешний объект в цикле for , если еда то проверял не сталкивается ли с ним игрок, если сталкивается то проверял переменную self.PRESS_E , и если она в True то тогда просто удалял объект, и увеличивал голод, Т.Е. переменную self.PLAYER["hungry"] .

Скажу наперед, это все мне нужно будет переписовать, когда я буду делать инветнарь

Делаю инвентарь

Итак, настало сложное, нам нужно сделать инвентарь.

Сложность в том что все предметы нужно будет отображать, хранить историю, удалять, ставить на пол объекты.

Я начал с того что добавил игроку новый ключ, это был self.PLAYER["inventory"] , там хранятся 4 яцчейки, вот в таком виде:


цифры — просто номера ячеек.

status — этот ключ хранит в себе значение, пуста яйчейка или нет. Если пуста то «space», если же там есть предмет, то там хранится имя предмета.

name — хранит в себе имя предмета, оно будет использовано когда игрок будет класть предмет.

minimize_image — эта уменьшенная картинка предмета которая изображается в инвентаре игрока.

Дальше функция бросания предмета на землю.

Там впрочем ничего сложного, при нажатии на X вызывается функция self.QuitItem() , в ней проходит цикл for по всем ячейкам инвентаря, и если ключ ["status"] не ровняется "space" , то эту ячейку удаляем с помощью ранее рассмотренной функции self.DestroyItem() , и создаем объект на основе того что был в ячейке, X и Y ставит игрока, как бы он бросил его возле себя.

На этом все?

Нет, я собираюсь в игру добавить нейросеть, используя библиотеку который я писал на Python,
Собираюсь сделать взаимодействие игрока с NPC оснащенными нейросетью,
небольшой, но какой-нибудь сюжет, и также какие-то припасы для игрока типа брони, еды. предметов, возможность строить блоками.

В этой статье описывается, как обрабатывать изображения в командной строке. Я занимаюсь этим достаточно часто, так как моя коллекция фотографий насчитывает несколько тысяч штук. Утилиты командной строки особенно полезны для веб-разработчиков или администраторов, которые часто занимаются пакетной обработкой большого количества изображений, так как разработчик может просто интегрировать их в свои скрипты. Но даже если вы занимаетесь этим от случая к случаю, утилиты командной строки помогут вам сэкономить время.
Инструменты командной строки, описываемые в этой статье, являются частью великолепного пакета ImageMagick, который доступен практически во всех дистрибутивах Linux, а также в сети (см. ресурсы). Также к функциям ImageMagick можно получить доступ с помощью C, C++, Perl, Python, Java и некоторых других языков программирования.

Как работает ImageMagick

ImageMagick служит оберткой для набора различных графических библиотек, включающего libtiff и libpng. В терминологии ImageMagick это вызываемые делегаты. Это является одной из причин, почему ImageMagick не так быстр, как мог бы быть. Он написан таким образом, что может взаимодействовать с библиотеками несколькими способами. Необходимо отместить, что все описанное в этой статье можно выполнять различными способами. Я описываю методы, которые я использовал и которые у меня работали. Это не значит, что другие утилиты в этом случае не будут работать, это всего лишь значит, что мне было удобно работать так, как это описано.
В статье специфические проблемы обсуждаются на конкретных примерах, но описанные концепции должны быть применимы и к другим подобным проблемам.

Создание миниатюр

Первое, что я делаю со своей коллекцией изображений - создаю миниатюры. Также я хотел создать уменьшенные версии изображений для размещения на сайте, так как вряд ли многие захотят открывать 2-х мегапиксельные фотографии моего сына.
Я использовал утилиту convert, которая входит в состав ImageMagick. Convert очень хороша. Помимо уменьшения размера изображений она может размывать их, конвертировать из одного формата в другой, обрезать, очищать от мусора, рисовать рамки, делать зеркальное отображение, и многое другое. Чтобы познакомиться со всеми ее возможностями и опциями командной строки, почитайте man-страницу. Многие более интересные визуальные эффекты, получаемые с помощью convert, будут описаны ниже.
Итак, допустим, что я хочу сделать миниатюру этой довольно красивой фотографии розы:

Изображение розы

Чтобы изменить размер изображения с помощью convert, просто используйте опцию командной строки -sample. Например, мне нужна миниатюра размером 80 x 40 пикселей. Тогда команда будет выглядеть следующим образом:

$ convert -sample 80x40 input.jpg output.jpg

Полученная миниатюра будет выглядеть так:

Первая попытка создания миниатюры

ImageMagick при преобразовании автоматически сохраняет соотношение сторон первоначального изображения. Это значит, что реальный размер созданной нами миниатюры составит 53 на 40 вместо 80 на 40.
Вместо пикселей размер конвертированного изображения можно указывать в процентах от исходного размера. Это может быть полезно, если вы не знаете размера исходного изображения, или если вам не столь важен точный размер картинки. Ниже приведен пример использования процентов:

$ convert -sample 25%x25% input.jpg output.jpg

Теперь мы получим такую миниатюру:

Вторая попытка создания миниатюры

С помощью этой команды можно создать миниатюры всех изображений в директории. Так как эта статья не посвящена написанию скриптов, я просто покажу вам пример скрипта для создания миниатюр всех JPEG в текущей директории:

Листинг 1. Создание миниатюр всех JPEG в текущей директории

for img in `ls *.jpg` do convert -sample 25%x25% $img thumb-$img done

Этот скрипт генерирует серию миниатюр размером 25% от размера исходного изображения с именем файла, которое создается путем добавления префикса thumb- к имени файла исходного изображения.

Получение информации о файле изображения

Еще одна часто встречающаяся задача - определение размеров и получение другой информации об изображении. Многие графические библиотеки имеют прекрасные инструменты, предназначенные для этого. Например, libtiff включает утилиту tiffinfo, которая позволяет получить следующую информацию об изображениях в формате TIFF:

Листинг 2. Простой вывод tiffinfo

TIFF Directory at offset 0x146 Image Width: 352 Image Length: 288 Bits/Sample: 8 Compression Scheme: Deflate Photometric Interpretation: RGB color Samples/Pixel: 3 Planar Configuration: single image plane

Это не самый исчерпывающий пример использования tiffinfo, но, как вы можете видеть, она возвращает достаточное количество информации. Похожая утилита pnginfo возвращает информацию о файлах PNG.

Листинг 3. Простой вывод pnginfo

$ sample.jpg. Image Width: 640 Image Length: 480 Bitdepth (Bits/Sample): 8 Channels (Samples/Pixel): 3 Pixel depth (Pixel Depth): 24 Colour Type (Photometric Interpretation): RGB Image filter: Single row per byte filter Interlacing: No interlacing Compression Scheme: Deflate method 8, 32k window Resolution: 0, 0 (unit unknown) FillOrder: msb-to-lsb Byte Order: Network (Big Endian) Number of text strings: 0 of 0

Я не знаю, есть ли аналогичные утилиты для других графических форматов, таких как BMP, GIF и JPEG. Тем не менее, и в этом случае на помощь приходит ImageMagick с утилитой под названием identify.

$ identify -verbose sample.jpg

Листинг 4. Простой вывод identify

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

identify также имеет флаг командной строки -format, который позволяет задать вывод только нужной вам информации. Например, если вас интересует только размер изображения, вы можете использовать команду вида:

$ identify -format "%wx%h" sample.jpg

Вывод этой команды:

Здесь %w значит ширину изображения, а %h - высоту. Для получения более подробной информации о форматировании вывода identify можно узнать, прочитав man-страницу утилиты.

Вращение изображений

Другая часто встречающаяся задача - поворот изображений. Например, многие сделанные цифровой камерой фотографии требуется повернуть на 90 градусов, чтобы нормально просматривать их в портретном режиме. Моя камера не делает этого автоматически, поэтому я написал скрипт, который запускаю после копирования фотографий с камеры.
Например, это фото я сделал во время своей последней в поездки в Port Arthur в Тасмании:

Port Arthur

Чтобы повернуть изображение, мы снова используем команду convert:

$ convert -rotate 90 input.jpg output.jpg

Теперь фотография выглядит так:

Port Arthur после поворота

Заметьте, что аргумент опции -rotate - это число градусов, на которое нужно повернуть изображение по часовой стрелке. Для повора против часовой стрелки вводится число градусов со знаком минус.

Конвертирование изображений

Команда convert также используется для конвертирования файлов изображений. Под конвертированием здесь подразумевается как изменение формата фотографии, например из JPEG в PNG, так и преобразование цветной фотографии в черно-белую, сглаживание и другие подобные операции.
convert определяет форматы исходного и преобразованного изображений, основываясь на расширениях файлов. Итак, чтобы конвертировать JPEG в PNG, используйте следующую команду:

$ convert input.jpg output.jpg

ImageMagick в настоящее время поддерживает 89 форматов изображений.

Добавление текстовых подписей к изображению

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

Давайте начнем с этого фото:

Фото с Floriade 2002

Вы можете подписать изображение с помощью следующей команды:

$ convert -font helvetica -fill white -pointsize 36 \ -draw 'text 10,50 "Floriade 2002, Canberra, Australia"' \ floriade.jpg comment.jpg

Подписанное фото с Floriade 2002

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

$ convert -font fonts/1900805.ttf -fill white -pointsize 36 \ -draw 'text 10,475 "stillhq.com"' \ floriade.jpg stillhq.jpg

Помеченное изображение

-fill white - задает белый цвет шрифта вместо стандартного черного.
-pointsize 36 задает размер шрифта в точках. В данном случа 72 точки на дюйм.
-draw 'text 10,50 ". "' - это набор команд для рисования, в данном случае - начальная позиция текста 10, 50; текст заключен в двойные кавычки. Одинарные кавычки используются в связи с тем, что если текст содержит более одного слова, он должен быть заключен в двойные кавычки. Кроме того, двойные кавычки не могут быть вложены в другие двойные кавычки.

Другие, более артистичные преобразования

convert способен также выполнять быстрые художественные преобразования. Я продемонстрирую наиболее интересные из них. О других можно прочитать на сайте ImageMagick. Для демонстрации я буду использовать следующее изображение:

Uluru на закате

Charcoal

Эффект charcoal имитирует рисование углем.

$ convert -charcoal 2 input.jpg output.jpg

Uluru на рассвете после применения эффекта charcoal

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

$ convert -charcoal 10 input.jpg output.jpg

Uluru на рассвете после применения усиленного эффекта charcoal

Если вы хотите посмотреть, как будет выглядеть максимально усиленный эффект charcoal, попробуйте:

$ convert -charcoal 200 input.jpg output.jpg

Получаем вот это:

Uluru на рассвете после применения чрезмерно усиленного эффекта charcoal

Сolorize

Сolorize - это процесс смешивания цвета каждого пикселя с заданным цветом. Аргумент обозначает цвет, с которым производится смешивание. Он может быть задан в виде одного значения (это значение используется для красного, зеленого и синего цветов), или в виде трех значений. Максимальное значение - 255.

$ convert -colorize 255 input.jpg output.jpg

Uluru теперь выглядит так:

Uluru на закате после применения эффекта colorize

Implode

Эффект implode моделирует втягивание центра вашего изображения в виртуальную черную дыру. Аргумент задает степень воздействия эффекта.

$ convert -implode 4 input.jpg output.jpg

Uluru теперь выглядит так:

Uluru на закате после применения эффекта implode

Solarize

Эффект solarizing имитирует передержанный в процессе проявки негатив. Аргумент задает интенсивность применения эффекта, который может быть задан как в абсолютном выражении, так и в процентном от максимально возможного для пикселя значения.

$ convert -solarize 42 input.jpg output.jpg

Теперь наше фото будет выглядеть так:

Uluru на закате после применения эффекта solarizing

Spread

Spread перемещает пиксели изображения в случайном порядке. Аргумент задает размер области вокруг пикселя, в пределах которой выбирается его новое местоположение, то есть насколько размазанным будет изображение.

$ convert -spread 5 input.jpg output.jpg

Ниже Uluru после размазывания:

Uluru на закате после применения эффекта spread

Несколько команд в одном вызове ImageMagick

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

$ convert -sample 25%x25% -spread 4 \ -charcoal 4 input.jpg output.jpg

Uluru после применения цепочки эффектов

Хитрости и подсказки

Есть несколько моментов, о которых нужно помнить, перед тем, как вы начнете работать со своими фото. Во-первых, вы должны определиться с форматом, в котором вы собираетесь хранить изображения, чтобы не оказаться в ситуации, когда у вас будет куча фотографий в формате, который вас не будет больше устраивать.
JPEG-сжатие хорошо подходит для больших изоборажений, таких как фотографии. Однако, это сжатие происходит с потерей данных, поэтому JPEG плохо подходит для текста, который должен оставаться читаемым. Кроме того, необходимо учитывать, что потери накапливаются при каждом изменении изображения. Для цветных изображений, если вы не хотите, чтобы при каждом редактировании накапливались потери, хорошо подходит PNG.
Вы также должны помнить, что большинство манипуляций, показанных в данной статье, невозможно отменить. Например, возьмем фотографию, сделаем миниатюру, а затем увеличим ее до размера исходной фотографии. Чтобы сэкономить место, я пропускаю промежуточные шаги и привожу сразу конечный результат.


Итак, мы объединили уменьшение с увеличением:

$ convert -sample 10% -sample 1000% input.jpg output.jpg

В результате получили следующую картинку:

Водопад после обработки

Достаточно трудно узнать водопад на этой фотографии.

Заключение

В этой статье мы обсудили несколько интересных вещей, которые позволяет делать ImageMagick при обработке изображений в командной строке. Описанные здесь инструменты не решат всех проблем, но позволят сэкономить время при выполнении рутинных, наиболее часто встречающихся операций.

Читайте также: