1. Описание игры.
Существует огромное количество головоломок. Одной из самых популярных является, так называемый, пазл (Puzzle).

Доступны два режима игры: “Классический” и “n-Puzzle”. По-умолчанию, отмечен режим “n-Puzzle”, но может быть изменен в группе переключателей “Тип игры”.
Игра при режиме “Классический” напоминает собирание настольного пазла, когда картинка собирается из отдельных частей. При этом расположение отдельных кусков изображения можно простым перетаскиванием. Этот режим представляет собой некое подобие самого обычного пазла, когда присутствуют только отдельные части изображения. В то время как цель игры – собрать итоговую картинку из имеющихся частей, верно расположив их в правильном порядке.
Также широкое распространение другой вид пазла, получивший название 15-Puzzle. Состоит из 15 скользящих плиток, каждая (условно) с номером от 1 до15 на каждой. Все 15 плиток собраны в оправу 4х4 с одним пропущенной плиткой. Назовем пропущенную плитку Х. Плитка Х выбирается произвольным образом.

Цель головоломки – привести в порядок плитки так, чтобы они образовывали верную последовательность. Единственной разрешенной операцией является обмен X с одной из близлежащих плиток. Другими словами, плитка смежная с пропущенной (пустой) плиткой, может быть поставлена на место пустой ячейки. Первоначальная настройка стола находится в перемешанном состоянии. Головоломка считается решенной, если достигнуто следующее состояние: пустая плитка находится в нижнем правом углу решетки. Стоит упомянуть, что некоторые состояния головоломки не могут быть разрешены.

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

 

2. Клиент.
Главное меню.
Всего 3 субменю, созданные на главной панели: “Файл”, “Таймер” и “Помощь”. Для работы приложения в меню “Файл” доступны пункты “Открыть” и “Сохранить” для работы с локальными файлами изображений, пункт “Показать лог” для отображения окна лога внизу окна, пункт “Настройка сервера” для отображения группы элементов управления для настройки подключения к серверу и пункт “Выход” для завершения работы приложения. Субменю “Таймер” включает пункты по принципу переключателя для описания состояние таймера “Вкл.” или “Выкл.”, и еще один пункт – “Сбросить” (устанавливает таймер в 0).

И, наконец, субменю Помощь включает пункт “О программе”. При выборе пункта “О программе” появляется диалог с информацией об игре.

Область головоломки.
Область головоломки представляет собой виджет, разделенный на 9, 16, 25 (в зависимости от настроек игры) участка. Все части объединены в решетку (соответственно, сетка из 3х3, 4х4, 5х5 участков), каждый из которых представляет собой кусочек картинки. В определенное время все за исключением одного участка показывают кусочки изображения. Когда пользователь щелкает по участку, соседнему с пустым, оба участка меняются местами. Предполагается, что картинка будет разбита на равные части. Отдельные изображения получаются путем деления на равные части исходной картинки.

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

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

Кнопки.
Всего присутствует 4 кнопки на главном окне. Кнопка “>” загружает список изображений на сервере. Кнопка “Загрузить случайную картинку” отображает произвольную из имеющихся картинок или если список доступных изображений пуст, пытается получить его с сервера. Кнопка “Перемешать” перемешивает части изображения в соответствии с выбранной сложностью. Кнопка “Заново” сбрасывает таймер и отображает первоначальное состояние игры (или пустой виджет посередине с кусочками слева для классического пазла, или полностью собранное изображение для n-Puzzle).

Таймер.
Присутствует также таймер. Таймер сбрасывается при нажатии кнопки “Заново” и начитает тикать сразу после нажатия кнопки ”Перемешать”. Таймер может быть включен или выключен, используя главное меню, и сброшен с использованием пункта “Таймер”->”Сбросить”.

Счетчик ходов.
Счетчик ходов используется для подсчета сделанный пользователем действий по перемещению отдельных элементов, в тоже время есть свои особенности. Так, например, засчитываются перемещение элемента в режиме “n-Puzzle” и перемещение отдельной картинки из левой игровой области в правую в режиме “Классический”, однако, перетаскивание изображения из правой области в левую оставит счетчик ходов без изменений.

Открытие/Сохранение изображений.
Открытие/Сохранение изображений реализованы через сконфигурированные диалоги по открытию/загрузке. Это означает, что диалоги настроены таким образом, чтобы сохранять/загружать только файлы картинок.

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

Сложность.
Группа переключателей, определяющих на какое количество кусочков будет разделено исходное изображение: 9, 16, 25.

Настройки сервера.
При загрузке списка картинок и непосредственно самих картинок используется механизм сокетов. Все требуемые файлы размещаются на сервере и клиентское приложение использует сокеты для соединения с сервером, выполняя соответствующие запросы и принимая ответы. Для настройки подключения к серверу используется группа элементов управления. С их помощью задается имя сервера и порт. При старте приложения происходит попытка получения списка изображений. В случае отрицательного результата эта группа элементов управления становится видимой. Отображение настроек сервера также зависит от того, выбран ли пункт меню “Файл”->”Настройки сервера”.

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

Локальный кэш.
Во время работы приложение кэширует полученные с сервера изображения в папке “cache”. При следующем обращении к ранее загруженному изображению используется кэшированная картинка. При загрузке изображения, проверяется имеет ли оно размер 400х400 и формат jpg. В случае отрицательного результата на первую проверку изображение подгоняется под необходимые размеры, а файл с картинкой обновляется; на вторую – данное изображение не отображается и вместо него показывается стандартная картинка. При невозможности соединиться с сервером в списке изображений окна приложения отображается содержимое кеша. Поэтому папку локального кеша можно использовать и как хранилище файлов, используемых при игре. Картинка при этом должна быть формата jpg и может иметь произвольный размер.

 

3. Сервер
Программа сервер выполняет две основные задачи:
• администрирование базы данных с изображениями;
• ответы на запросы пользователей на получение списка доступных изображений и отправление самих картинок клиентским программам.

При запуске приложение-сервер прослушивает 5500 порт. При запуске приложения без параметров отображается графический интерфейс представленный ниже.

Информация (справка) о различных опциях работы с сервером становится доступной, если вызвать приложение с параметров “--help”. Тогда отображается информационное окно, которое можно видеть ниже (представлен случай запуска приложения из командной строки в Windows).

Изображения, предоставляемые сервером, хранятся в базе данных SQLite. При необходимости СУБД может быть изменена на MySQL, PostgreSQL, MS SQL Server, Oracle, IBM DB2, Sybase, Borland InterBase. Выбор SQLite связан с тем, что возможностей данной СУБД более чем достаточно для удовлетворения потребностей по хранению и предоставлению данных конечному пользователю. В тоже время использование СУБД дает серьезный задел на будущее. Так, например, в случае значительного увеличения числа файлов, предоставляемых сервером клиентам.
Таким образом, данное приложение-сервер является промежуточным звеном между клиентами, распределенными по сети и СУБД, хранящей различные изображения, т.е. выступает в роли сервера приложений в трехзвенной архитектуре.
Функции по администрированию изображений в базе данных включают следующие возможности:
• пересборка (опция --rebuild)
• извлечение (опция --export)
• добавление одной картинки (опция --add-image)

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

  • по одной картинке, вызывая приложение-сервер с параметром --add-image с указанием имени файла.
  • создать в папке, содержащей исполняемый модуль приложения-сервера, вложенную папку “images”. Далее поместить в последнюю картинки, которые хотим сделать доступными для клиентов. После этого вызвать приложение-сервер с опцией --rebuild. Произойдет удаление имеющихся данных из базы данных сервера и добавление в базу новых картинок.

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

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

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

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

Last edited Nov 5, 2013 at 8:42 AM by mast3rz, version 6