Разработка игры на С++, Qt

Написал ремейк небольшой логической игрушки - "Полный квадрат". Код показался мне достаточно интересным чтобы описать на блоге.

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

В любой игре, чуть более интересной чем "Сапер", используются анимации, проигрывается звук, поэтому следующие компоненты Qt затронуты в статье:

  • класс QMovie для отображения gif-анимации тучек и ежа;
  • класс QPropertyAnimation - ежик перемещается плавно, при этом меняются его координаты (свойства);
  • QMediaPlayer из модуля Qt Multimedia. При перемещении наш ёжик топает;
  • Qt Style Sheets (QSS) используется для украшения элементов управления.
game_screens

снимки игровых экранов

Читать далее

Рубрика: C++, Qt | Комментарии (2)

Блок-схемы алгоритмов. ГОСТ. Примеры

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

На территории Российской Федерации действует единая система программной документации (ЕСПД), частью которой является Государственный стандарт - ГОСТ 19.701-90 "Схемы алгоритмов программ, данных и систем" [1]. Не смотря на то, что описанные в стандарте обозначения могут использоваться для изображения схем ресурсов системы, схем взаимодействия программ и т.п., в настоящей статье описана лишь разработка схем алгоритмов программ.

Рассматриваемый ГОСТ практически полностью соответствует международному стандарту ISO 5807:1985.

Читать далее

Рубрика: алгоритмы | 1 комментарий

Способы обработки XML в Qt - Stream, SAX, DOM

Многие сталкивались с XML-документами и знают что это такое, ведь стандарт рассматриваемого языка разметки опубликован в далеком 1998 году. Язык XML используется во многих областях, но чаще всего для передачи информации через Internet - не случайно стандарт разработан Консорциумом Всемирной паутины (W3C) [1].

Очень много информации в этом мире записано и передается в формате XML, например ленты новостей RSS и Atom. В связи с этим не будут лишними навыки использования библиотек для обработки XML-файлов.

В статье рассмотрены три варианта разбора файлов в формате XML средствами библиотеки Qt. В качестве примера используется файл, возвращаемый Центральным банком Российской Федерации на запрос курса доллара в заданный период [2].

Для получения файла с курсом валюты на сайт Центрального банка высылается запрос. Используется QNetworkAccessManager, подробно описанный в статье "Получение данных с сайта. Шаблон Producer/Consumer" [3]. Данные, извлеченные из файла, выводятся на график средствами библиотеки Qwt [4].

Screenshot_of_the_schedule_currency

рис. 1 Снимок окна с графиком курсов валют

Читать далее

Рубрика: C++, Qt | Добавить комментарий

Обработка матриц на языке Prolog

Традиционно в ВУЗах студентам дают задачи по обработке матриц на языке Prolog, представленных в виде списков. В статье разобраны решения нескольких таких задач.

Примеры проверены на диалекте SWI Prolog, однако большая их часть без особого труда может быть переписана на другие диалекты. В примерах используется предикат nth0, но он может быть заменен предикатом at, аналогично, и некоторые другие.

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

Читать далее

Рубрика: Prolog | Добавить комментарий

Фотографии заповедника Столбы в апреле

Эта галерея содержит 10 фотографий.

В апреле на столбы сходил 3 раза, но фотографии выложу пачкой. Фотографий получилось мало. Один раз вообще не фотографировал, т.к. меня постоянно материл попутчик. Первые 2 фотографии сделаны 13 апреля. Мы ходили на столб "Каин и Авель", но фотографировал я … Читать далее

Другие галереи | Добавить комментарий

Многопоточный сервер Qt. Пул потоков. Паттерн Decorator

В предыдущей статье [1] была рассмотрена работа с сокетами в библиотеке Qt. Наш сервер сетевого чата работал в одном потоке. Задача текущей статьи - описание многопоточного сервера.

Однако, если сервер просто принимает сообщение и передает его всем подключенным клиентам - распараллеливать нечего и потоки не особо нужны. В связи с этим, мы немного усложним задачу - наш сервер будет вычислять передаваемые арифметические выражения (для вычисления выражений используем Qt Script [2]).

Серверу (а точнее, сокету) надо добавить новый функционал, и в этом нам поможет шаблон проектирования "Декоратор". Когда сервер начнет выполнять все необходимые нам функции, приступим к распараллеливанию. В статье рассмотрены 2 варианта:

  • создание отдельного потока на каждое подключение;
  • использование стандартного пула потоков библиотеки Qt.

В предыдущих статьях уже был описан шаблон параллельного программирования "поставщик-потребитель" [3]. Пул потоков является родственным паттерном, но мы не будем писать свою реализацию, а используем готовую.

Читать далее

Рубрика: C++, Qt, паттерны | Комментарии (4)

Работа с сетью в Qt. Сокеты. Паттерн Adapter

В статье показана работа с сетью на примере очень простого сетевого чата, а также описан никак не связанный с сетью шаблон проектирования адаптер (adapter, wrapper, обертка).

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

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

Содержание:

  1. шаблон проектирования Adapter;
  2. работа с сетью в Qt. Классы QTcpServer и QTcpSocket;
  3. пример использования паттерна Adapter;
  4. исходный код сетевого чата.

Читать далее

Рубрика: C++, Qt, паттерны | 1 комментарий

Функциональное программирование и обработка изображений

Под интригующим названием статьи скрывается обзор и небольшой мануал по языку программирования, встроенному в nip2.

Есть весьма популярная в узких кругах утилита обработки изображений, называемая VIPS [1]. Утилита кроссплатформенная и используется для обработки очень больших изображений. Состоит она из двух частей - библиотеки libvips и утилиты с графическим интерфейсом nip2.

Библиотеку libvips можно использовать в связке с языками программирования Python, C и C++. Библиотека имеет несколько особенностей, которые с одной стороны позволяют обрабатывать очень и очень больших изображения (обработка автоматически распараллеливается и изображения размером в десятки гигабайт не выжирают разом память), а с другой стороны делают программирование очень необычным мероприятием.

Созданное один раз изображение в libvips нельзя изменить, а если нам очень надо - то мы должны создать новое, измененное (но и старое не исчезнет). Операции над изображением фактически не выполняются до тех пор, пока оно не сохраняется на диск (операции накапливаются до поры, до времени).

Эти и другие особенности libvips подталкивают к использованию функционального языка для работы с библиотекой, и такой язык встроен в nip2. Язык не имеет названия, поэтому дальше я буду называть его nip2.

Nip2 - ленивый функциональный объектно-ориентированный язык с лиспоподобным синтаксисом, позволяющий без особого труда разрабатывать расширения для VIPS.

Читать далее

Рубрика: алгоритмы | 1 комментарий

Зимние Столбы

Эта галерея содержит 11 фотографий.

Фотоотчет выхода в заповедник (очень надеюсь, что заповедником и останется) "Столбы" 19.01.2014. Далеко я в этот раз не ходил - посетил Четвертый столб и погулял по Каштаковской тропе. Очень понравился красивый зимний лес - сильного ветра не было, поэтому на … Читать далее

Другие галереи | Добавить комментарий

Cистема плагинов Qt, построение графиков и Qt Script

Очень обзорная статья, описывает вершки некоторых интересных элементов библиотеки Qt. Речь идет про:

  • библиотеку Qwt, позволяющую строить графики, гистограммы, круговые (и другие) диаграммы;
  • систему плагинов библиотеки Qt, предназначенную для предоставления возможности модульного расширения программы;
  • Qt Script - язык, позволяющий, как и система плагинов, дополнять программу, но не требующий компиляции (плагина).

Статья не претендует на полноту и описывает ровно столько, сколько требуется для решения придуманной задачи. В конце статьи есть ссылки, по которым можно почитать более подробно. Так, например, важнейшая возможность скриптов Qt Script соединяться со слотами и сигналами в статье совсем не затронута, как и различные виды диаграмм Qwt.

Решаемую задачу можно сформулировать следующим образом:

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

рис. 1 снимок окна программы

рис. 1 снимок окна программы

За счет системы плагинов реализуется подключение дополнительных методов интегрирования. Библиотека Qwt используется для визуализации, а Qt Script - для предоставления возможности ввода интегрируемой функции.

Читать далее

Рубрика: C++, Qt, алгоритмы | Комментарии (4)

Решение логических задач на Prolog

Язык пролог начал зарождаться в далеком 1879 году, точнее в этом году известный ученый Людвиг Фреге предложил исчисление предикатов, которое лежит в основе логического программирования. Фреге был не только математиком, но и философом (как и большинство других известных ученых своего времени). В то время еще не начала рушиться классическая картина мира, популярным философским учением являлся позитивизм Конта, и Фреге разделял эти взгляды, относясь к школе аналитической философии. Одной из своих задач философы видели формализацию знаний, т.е. пытались выразить знания на более точном, научном языке, например так, как делают математики. Работы по исчислению предикатов лаконично вписались в это направление.

Позже по этой теме работали другие известные философы, такие как Бертран Рассел и Людвиг Витгенштейн, представители более новой школы логического позитивизма. Исследования ведутся до сих пор, но позитивисты несколько отошли от исчисления предикатов в сторону темпоральной логики.

В 1980х годах уже появились эффективные реализации Пролога и он рассматривался как универсальный язык, при этом использовался для реализации реляционных СУБД, автоматического доказательства теорем, разработки компиляторов, САПР и других областях [1]. В начале 1990х годов пролог продвигался, в большей мере, как удобное средство разработки графического интерфейса (лучших инструментов тогда не было) [4]. В 1992 году провалился японский национальный проект компьютера пятого поколения, одной из целей которого было исследование искусственного интеллекта. В качестве языка программирования этого компьютера был выбран пролог, популярность которого резко упала [5]. В настоящее время, пролог используется , в основном, при разработке трансляторов и в задачах искусственного интеллекта [6].

Более подробно про историю языка Пролог можно почитать в толстых книгах [1, 2, 3], но а я привел эти факты чтобы чуть-чуть отразить особенности развития этого языка и решаемых на нем задач. Традиционно в российских ВУЗах на предметах "логическое и функциональное программирование", "искусственный интеллект" выдаются задания  связанные с решением логических задач. Ноги у этих задач растут из автоматического доказательства теорем.

В статье рассматривается 2 типа логических задач - задачи на установление соответствия и задачи поиска в пространстве состояний.

Читать далее

Рубрика: Prolog, алгоритмы | Комментарии (41)

Обходы графа. Поиск в ширину и глубину [Prolog]

В статье описываются:

  • алгоритмы обхода графа в глубину и в ширину;
  • представление графов на языке Prolog;
  • реализация алгоритмов обхода графа на языке Prolog;

При обходе графа в статье выполняется поиск определенной вершины (выполняется поиск в ширину и поиск в глубину).

Читать далее

Рубрика: Prolog, алгоритмы | Комментарии (24)