Предлагаю программу "Balda prof".
Программа предназначена для подбора слов в игре "Балда".
Написана на C# с использованием .Net Framework.
Поставляется в виде дистрибутива с двоичными данными.
Строит дерево найденный слов (в левой чати программы), по кнопке "Найти".
В правом списке использованные слова.
В центре рабочее поле .
В нижней части алфавит.
Если на найденное слово можно подобрать слово длиннее, то окрашивает в красный.
Если на найденное слово можно подобрать слово короче, то окрашивает в зеленый.
Если на найденное слово можно подобрать слово той же длинны, то окрашивает в синий.
Двойным кликом по слову из левого списка добавляем его в найденные и обновляем рабочее поле.
Одинарный клик по левому списку показывает букву в рабочем поле (для визуального контроля)
Буквы в поле можно вносить 3 способами:
- с клавиатуры
- мышью (нажав на букву, затем на клетку поля)
- перетаскиванием
Словарь содержится в файле RusNoun.txt. Это обычный текстовый файл, слова в нем отсортированы по алфавиту.
Можете редактировать его вручную.
Немного истории.
Где-то в 2009-2010 году жена увлеклась игрой в балду. Можно найти на mail.ru. И вот мы собирались 3-4 человека с друзьями и устраивали мозговой штурм. С переменным успехом двигались по турнирой лестнице. Но обнаруживались игроки, подбирающие длинные незнакомые слова. Тогда же родилась мысль найти словарь и искать в нем слова. Нашли словарь, я написал мини программу на Visual Basic, работающую с регулярными выражениями. Но это был полуавтомат, он не мог проверить все комбинации, и к тому же поиск запускался вручную. Тогда же задался целью написать программу, которя анализирует поле и ищет куда добавить букву и затем осуществляет поиск в словаре.
На первом этапе была сделана консольная программа на C#, которая в тестовом виде выдавала все найденные слова, отсортированные по убыванию. Методом проб и ошибок и каждодневного тестирования/игры я устранял ошибки в алгоритме. В итоге получилось что-то минимально рабочее. Но существовали недостатки:
Во - первых, рассчет шел ужасно долго, по несколько минут... Проблему удалось решить индексированием словаря. Сделал 2-мерный массив индексов по первым 2-м буквам. В дальнейшем разбил алгоритм поиска по 3-м ситуациям. а) обе буквы известны, б)изветсна первая, в) известна вторая. Это тоже ускорило работу.
Во - вторых, не анализировались уже использованные слова и шаблоны.
В общем, назрела необходимость озаботиться интерфейсом. И я выпустил первую версию - Balda Game.
Она была на .Net Framework 2.0. По сути элементы интерфейса перекочевали и в последний релиз, который и выкладываю.
В ней был массив использованных слов и другие нововведения. Так день за днем добавлял новые опции. На каком-то этапе добавил ограничение по длинне слов, так как 3-х буквенные считались слишком долго. Переработал алгоритм, если слово < макс. длинны, то не рассматриваю.
Продолжая играть и выигрывать большинство партий дошел до определенного предела. Выяснилось, что соперник вероятно использует 2-х уровневый массив слов. Подсмотрел на каком-то сайте скрины балды с раскраской и сделал также. Теперь на первом этапе находит слова, а затем по каждому слову строит второй уровень.
Этот путь был тернист, нужно было восстанавливать первоначальное поле. Кроме того хранить и восстанавливать использованные и отброшенные слова и шаблоны. Но я его преодолел. Параллельно искал наиболее полный словарь существительных в именительном падеже, так как существующие словари были или не полными, или содержали мусорные слова.
Далее озаботился интерфейсом. Сначала работал только с клавиатурой, сделал обработчик нажатий кнопки и перемещение по ячейкам. Затем со временем добавил мышь и в финале перетаскивание (drag & drop). В заключении сделал подсветку подставляемой буквы, что потребовало переделки кода. Ведь раньше я игнорировал расположение букв при построении второго уровня, а это было ошибкой. В итоге работы программа строит дерево достоверно с учетом ситуации и положения добовляемой буквы на первом уровне.
Дойдя до стадии рабочей программы, я охладел к проекту. Так как основную задачу решил. Я оказался в первой сотне игроков. Далее выигрывать было сложно, так как у соперника был более полный и адаптированный к игре словарь. Бывало, что игра на сервере не принимала слова в моем словаре, и наоборот, их словарь содержал слова, отсутствующие в моем. Кроме того, вероятно на рынке есть программы использующие более прогрессивный метод расчета, строящие дерево прогнозирования, или "думающие" на три - четыре хода вперед. Мне это не позволяли вычислительные мощности и пробелы в знаниях. Так или иначе в игре со средними противниками помощник вам обеспечит преимущество.