Главная · Карта сайта · Поиск · Статьи · Компьютерные курсы · Обучающие программы · Открытые проекты · Веб-программирование · Создание интернет-сайта · Полезные ссылки · Глоссарий · Контакты · Декабрь 09 2016 20:23:30
Последнее опубликованное

Что такое Model-View-Controller
Pattern Model-View-Controller

Как создать свой веб-сайт
Как создать свой сайт в интернете

Разное
Статистика

Генератор кроссвордов crossWORDcraft™. Описание проекта


Исходный код открытых проектов

О программе
Описание алгоритма

Генератор кроссвордов crossWORDcraft. Структура проекта

Компоненты проекта crossWORDcraft™

Генератор кроссвордов написан на языке программирования C# (Си Шарп). Все программные компоненты этого открытого проекта можно условно разделить на три группы:

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

Модель генератора кроссвордов

Классы и структуры, представляющие модель генератора, объединены в пространство имен Model. Остальные элементы находятся либо в корневом пространстве имен проекта, либо в служебном Properties.

Класс Grid. Шаблон (Сетка) кроссворда

Этот класс представляет не что иное, как шаблон кроссворда: прямоугольный массив логических значений {ячейка символа (true), пустое “черное” место (false)}. В задачи класса входит совсем немного: изменение размера шаблона, редактирование ячеек (вставка ячейки для символа или пустого места) и формирование списка шаблонов слов, как по горизонтали, так и по вертикали.

Класс Word . Шаблон слова

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

Класс Words . Коллекция шаблонов слов

Коллекция шаблонов слов формируется экземпляром класса Grid для конкретного кроссворда. Класс Words разбивает всю коллекцию слов на два списка: слова по горизонтали и слова по вертикали. Также, в ходе построения коллекции (класс Grid, функция CreateWords), происходит формирование списка всех пересечений шаблонов слов (класс Words, метод Prepare), состоящего из экземпляров класса WordIntersection. Класс WordIntersection является вспомогательным структурным элементом и используется классом Words для обработки пересечений в операциях присвоения значения и отмены значения шаблону слова. Итак, помимо доступа к элементам коллекции, класс Words предоставляет следующую функциональность:

  • Проверка, можно ли текущему шаблону слова с учетом всех его пересечений присвоить конкретное значение - функция CanAssign.
  • Присвоение значения шаблону слова с обработкой всех связанных с ним пересечений - метод AssignValue.
  • Отмена значения шаблона слова с восстановлением символов на пересечениях – метод ClearValue.
  • Создание копии экземпляра Words, как одного из вариантов заполненного шаблона - функция Copy.

Класс Content. Генератор заполненных вариантов кроссворда

Это основной класс всей модели, в задачи которого входит формирование словаря для генерации заполненных вариантов кроссворда и, собственно, сама генерация этих вариантов.

Метод Append добавляет новые слова в словарь, выделяя их из текстовой строки посредством регулярного выражения. Каждый элемент словаря представлен экземпляром вспомогательного класса ContentItem. Экземпляры ContentItem, помимо значения слова, хранят признак, использовано ли данное слово при заполнении кроссворда или нет, чтобы избежать повторений в ходе полного перебора вариантов. Весь словарь разбит на разделы, каждый из которых содержит слова одной длины. Сделано это для того чтобы при переборе вариантов значений для конкретного шаблона слова проверять только значения нужной длины.

Метод Generate принимает в качестве аргумента экземпляр класса Grid и начинает для него полный перебор вариантов заполнения шаблона кроссворда. Также, имеется переопределенная версия метода Generate, которая принимает в качестве аргумента еще и максимальное количество требуемых вариантов заполнения, сформировав которое, полный перебор завершается. Метод StopGeneration останавливает полный перебор, если метод Generate был запущен в параллельном потоке. Алгоритм генерации заполненных вариантов предварительно сортирует шаблоны слов по горизонтали - по возрастанию их длины, а слова по вертикали – по убыванию. Сортировка происходит с использованием вспомогательного сервиса сравнения двух шаблонов слов – класса WordComparer. Для чего она производится, будет предпринята попытка объяснить чуть позже.

Пользовательские элементы управления

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

Компонент TemplateControl

Этот элемент управления предоставляет возможности пользователю посредством графического интерфейса редактировать шаблон кроссворда, а именно: изменять его размер и “рисовать” шаблоны слов, нажимая мышью на соответствующих ячейках шаблона. Главным “продуктом” его работы является экземпляр класса Grid, доступ к которому можно получить посредством одноименного свойства. К дополнительным обязанностям компонента TemplateControl относятся сохранение шаблона кроссворда в текстовый файл и чтение его оттуда, а также, отображение одного из вариантов заполнения кроссворда – метод DrawWords, аргументом которого, как не сложно догадаться, является экземпляр класса Words.

Отдельно стоит отметить, что с целью избежать всевозможных перемигиваний и морганий элемента управления сеткой кроссворда в процессе изменения его размера и рисования слов, компонент TemplateControl использует не просто экземпляры Panel, а переопределенные их версии – экземпляры DoubleBufferedPanel. В конструкторе класса DoubleBufferedPanel защищенному (protected) свойству DoubleBuffered присвоено значение true.

Компонент ContentControl

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

Форма ProceedingForm

Здесь все просто. Форма ProceedingForm призвана отражать процесс полного перебора вариантов заполнения для заданного шаблона кроссворда и, в случае необходимости, останавливать его работу. Форма создается и открывается компонентом ContentControl в момент асинхронного запуска процесса генерации – в теле метода AsyncGenerate. Форма автоматически закрывается после завершения или остановки полного перебора – в теле обработчика события AsyncGenerateCompleted.

Форма MainForm

Форма MainForm – главная форма приложения crossWORDcraft, в задачи которой входит создание экземпляров TemplateControl и ContentControl, их инициализация, а также, управление ими в процессе обработки событий главного меню и “тулбара”.

Инфраструктура приложения

К этой группе относятся дополнительные компоненты приложения, выполняющие служебные роли. В пространстве имен Properties находятся компоненты Resources (ресурсы) и Settings (настройки проекта). В корневом пространстве имен определен компонент Program, реализующий точку входа в приложение – статическую функцию Main. Там же есть статический класс Environment, содержащий лишь один метод ErrorMessage, используемый для вывода сообщений об ошибках.

Чем может быть полезен исходный код проекта crossWORDcraft™

Помимо самого рекурсивного алгоритма генерации кроссвордов, основанного на полном переборе вариантов с элементами метода ветвей и границ, исходный код проекта содержит следующие интересные моменты:

  • Запуск, мониторинг и обработка завершения вычислительных процессов в параллельных потоках. Речь идет о запуске самой генерации кроссвордов, которая выполняется в отдельном потоке: компонент ContentTemplate, методы AsyncGenerate и AsyncGenerateCompleted. Этот код также может быть интересен с точки зрения использования лямбда-выражений и анонимных делегатов. Запуск параллельных вычислений осуществляется с использованием асинхронного вызова делегата.

  • Работа с таймером, с помощью которого определяется периодичность обновления информации на форме ProceedingForm. Код иллюстрирует, каким образом необходимо работать с элементами управления Windows Forms из параллельных потоков. Имеется в виду обработчик события таймера TimerHandler компонента ContentControl.

  • Работа с коллекциями динамически создаваемых элементов управления Windows Forms. Сетка шаблона кроссворда состоит из двумерного массива кнопок – экземпляров класса Button, динамическое создание, размещение и связь с обработчиками событий для которых выполняется в методе DrawTemplate компонента TemplateControl.

  • Обработка текста с использованием регулярных выражений. В методе Append компонента Content регулярные выражения используются для выделения слов из текста и формирования словаря.

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

Читать дельше описание алгоритма.

Компьютерные курсы и курсы программирования
Основы программирования

Курс для начинающих программистов на C# и VB.NET.

SQL 25™

Построение SQL запросов и работа с базой данных.

C# Quick Guide™

Программирование на C#. Краткое руководство.

RegEx

Применение регулярных выражений.

Plug-in архитектура

Примеры программной Plug-in архитектуры.

XML и его расширения

Язык разметки XML и его расширения с примерами.

HTML и разметка гипертекста

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна

Основы веб-дизайна: решения типовых задач верстки.

Программирование на PHP

Руководство по программированию на PHP для начинающих.

Справочные материалы

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Гость
Имя

Пароль



Забыли пароль?
Запросите новый здесь
.
Coding Craft. Все права защищены © 2011. Проект Инициативного Народного Фронта Образования - ИНФО-проект.