Есть у меня несколько сотен логов игр с Тенхочки. Каждую из раздач в них можно описать десятками параметров: рейтинг, ранг, ник, сколько очков у играющих, выходили ли в темпай, за сколько кругов вышли, объявляли ли риичи или открытые сеты, выиграли ли, какие яку были, кто сколько платил, кто дилер, какая выигрышная рука, какое ожидание и на сколько сторон было, как менялся шантен по ходу игры и т.д.
Хотелось бы выделять отдельные раздачи по каким-либо параметрам.
Первые этапы опишу совсем кратко:
1. Парсим исходный лог, который представляет собой последовательность производимых игроками действий, выполняем их и по ходу дела рассчитываем все нужные параметры;
2. Записываем всё это в xml-файл, по одному файлу на раздачу;
Теперь, чтоб получить доступ к результатам отдельной раздачи не надо переигрывать игру, достаточно открыть сгенеренный xml. Пример файлика:
2013010408gm-0001-0000-63296dbb_4.xml. Самих действий там нет, но есть основная информация о том, что там было, что нам для поиска и нужно.
читать дальшеДля поиска создадим отдельный класс: GameFinder. Он должен будет пройтись по переданному в него списку раздач, выделить среди них те, которые удовлетворяют нашим требованиям.
1. Загрузка списка игр.
Во-первых, он должен уметь брать игры из папочки с xml-ками.
И, во-вторых, он должен уметь брать результаты своего поиска, чтобы продолжать искать уже среди них.
2. При загрузке из файлов генерируем объекты класса, согласно записанным в файл значениям:
При инициализации по готовому списку, копируем объекты.
3. Класс поисковика имеет ряд публичных свойств, которые задают параметры поиска, например:
Если их значения не изменены, то проверка на данный параметр не производится.
Для каждой раздачи и каждого игрока в ней задаётся флаг того, устраивает он нас или нет.
Эта пометка есть прямо в классе с результатами, она единственная редактируется поисковиком (чтоб можно было потом узнать, кто из четырёх игроков нужен).
Логика поиска такая. По умолчанию флаг Mark устанавливаем в значение true, как подходящий нам, а потом начинаем проверять по параметрам. Если параметр не прошёл, то флаг сбрасываем.
Если после всех проверок хотя бы один флаг остался установленным, то всё круто и раздачу добавляем в список результатов:
Использование в итоге выглядит достаточно просто. Например, нам интересны все собранные на дилере читои, стоимость которых манган или больше:
Вывод должен включать в себя ссылку на саму раздачу, причём с видом от того, кто собрал:
Получим список:
Или многоэтапный поиск:
Вывод:
Вот, подход уже неплохой. Можно составлять хитрые запросы и искать интересные раздачи. И добавлять новые параметры поиска=)