воскресенье, 21 июля 2013
Итак, я таки переписал основную часть кода анализатора игр с тенхочки в более человеческий вид. Исходники лежат на гуглокоде:
TenhouViewer.
Так как программа живёт ещё совсем немного, оконного интерфейса у неё нема, только консоль. Впрочем, пока что её достаточно.
Что же это за штука и как её пользоваться? Программа умеет по логу игр (который выдаёт и виндовый, и браузерный клиент) скачивать реплеи в папочку. Чтобы потом искать в них разные ситуации, ну и делать статистику, например, график рейтинга.
читать дальше1. Создадим папочку для программы, где она всё барахло будет хранить. Например, "TenhouViewer".
2. Закинем туда программку из архива. Там ещё есть четыре примера, как ей управлять.
3. Создадим файл log.txt рядом и запишем туда прям методом копипасты лог с клиентика (я его веду отдельно, так как клиент хранит только несколько последних):
4. Создадим файлик, который будет давать команду на скачивание: 1. download.bat (есть в архиве)
И файлик, который заставит программу всё это барахло проанализировать: 2. prepare.bat
5. Дальше смотрим команды поиска, ведь любые дальнейшие действия идут через него.
Любой поиск начинается с команды
Эта команда найдёт все игры, какие только есть. Добавляя ограничивающие параметры, можем область поиска сузить:
Так мы найдём все раздачи, где дилер собрал руку не менее, чем на манган:
Ограничивающих параметров может быть сколько угодно, но чем их больше, тем меньше раздач найдётся. Пока что параметры есть такие:
shanten=N — с раздачи рука N шантен (0-6);
shantenmin=N — с раздачи рука не менее, чем N шантен (0-6);
shantenmax=N — с раздачи рука не более, чем N шантен (0-6);
ratingmin=N — только раздачи игроков, чей рейтинг не менее N (1000-3000);
ratingmax=N — только раздачи игроков, чей рейтинг не более N (1000-3000);
paymentmin=N — выплата (с учётом палок) не менее N, минус — игрок платит, плюс — игроку (-1000000-1000000);
paymentmax=N — выплата (с учётом палок) не более N, минус — игрок платит, плюс — игроку (-1000000-1000000);
waitmin=N — найти все руки, где выигрышно ожидание имело не менее N типов тайлов (1-13);
waitmax=N — найти все руки, где выигрышно ожидание имело не более N типов тайлов (1-13);
place=N — найти раздачи занявших N-нное место (1-4);
rank=N — найти раздачи игроков с рангом N (0 = новичок, 1 = 9 кю, ..., 9 = 1 кю, 10 = 1 дан, 12 = 3 дан и т.д.) (0-20);
nickname=N — найти раздачи игрока с указанным ником (строка);
steps=N — найти все руки, где игра продолжалась не более N ходов (считается по сбросам в дискард) (0-60);
yaku=N,M,X — найти все руки, где имеются все перечисленные через запятую яку: N,M,X,... (0-54), список яку;
wait=N,M,X — найти все руки, где ожидание имело хотя бы один тайл из списка: N,M,X,... (0-36), номера тайлов;
dealer — только раздачи дилера;
winner — только раздачи, где руку собрали;
loser — только раздачи, где накинули;
В принципе, можно добавить и другие параметры, было бы желание и знание о требованиях.
В данном случае результат будет выдан в консоль же. Если мы хотим получить отдельный файл с результатами, укажем его название, добавив флаг -s<имя файла>:
6. Но найденные игры можно вывести и в ином виде, более приспособленном для стат. анализа, используя флаги -g<ник> и -G<ник>.
Они позволяют вывести параметры всех игр (предварительно найденных с помощью флага -f) игрока "ник" по очереди в виде таблицы.
Результат:
Или вот:
Результат:
Флаг -G смотрит сами игры целиком: рейтинг игрока, ранг, место, баланс, результат игры и типа того.
index — номер игры (просто сквозной);
rating — рейтинг игрока перед игрой;
rank — ранг игрока перед игрой (1=1 кю, 10=1 дан и т.д.);
place — занятое место;
result — результат игры с учётом умы;
balance — баланс игрока на конец игры;
Флаг -g смотрит отдельные раздачи и то, что происходило в них: дилер ли, накинул ли, выиграл ли, цена руки, выплаты и т.д:
index — номер раздачи (сквозной);
initshanten — шантен на начало раздачи;
pay — выплата в результате раздачи;
tempai — был в руке темпай (1 или 0);
dealer — был ли дилером в раздаче (1 или 0);
loser — набросил ли кому-нибудь (1 или 0);
winner — собрал ли руку (1 или 0);
riichi — объявлял ли риичи (1 или 0);
concealed — держал руку закрытой (1 или 0);
openedsets — количество открытых сетов;
cost — стоимость руки;
fu — количество минипоинтов в руке;
han — количество хан в руке;
step — сколько сбросов в дискард успел сделать;
balance — баланс на начало раздачи;
waiting — количество типов тайлов в выигрышном ожидании;
round — номер раунда (0=1в,1=2в,2=3в,3=4в,4=1ю,5=2ю,6=3ю,7=4ю,8=1з и т.д.);
Можно ещё добавить параметры (ренчаны там и т.д.).
Дальше на этот файл можно натравить эксель и построить график чего-либо (рейтинга того же). Или посчитать долю разных событий (наброса или завершения руки под риичи), можно также и с графиком, с помощью оконной выборки.
Поддержки игр, где три игрока, а не четыре, пока нет. Глюки и не совсем верные числа в некоторых полях тоже могут быть, так как программа ещё очень новая и почти не проверена. Но как узнаю, что не так — исправлю.
UPD от 22.07.2013. Билд r60.
Добавлена возможность форматирования результатов поиска в виде списка с помощью флага -o:
link — ссылка на раздачу (и найденную руку);
nickname — ник игрока;
rating — рейтинг игрока;
place — занятое в результате всех раздач место;
rank — ранг игрока;
pay — выплата в результате раздачи;
dealer — дилер;
winner — собрал руку;
loser — набросил;
concealed — закрытая рука;
cost — стоимость руки;
han — количество хан в руке;
waiting — количество сторон в ожидании;
step — количество сбросов в дискард в данной руке;
yaku — список яку;
round — номер раздачи (0 - 1в, 1 - 2в, ...);
roundindex — номер раздачи с начала игры;
Например, запустив программу с такими параметрами:
Получим:
яку.txt — соответствие яку (и не яку) их номерам;
тайлы.txt — соответствие тайлов их номерам;
Программ r59. Требует .NET Framework 4.
Программа r60.
@темы:
программизмы,
маджонг,
tenhou,
tenhouviewer
Получается, что реплеи, которые не сохранились на тенхо, уже никак нельзя восстановить?
Вот как, например, в Вашем примере:
«Menzen Tsumo 86
Riichi 211
Ippatsu 47
Rinshan Kaihou 1
Haitei Raoyue 2
Houtei Raoyui 2
Pinfu 84
...»
Насколько я поняла, тут подсчитаны все собранные комбинации всех игроков. А мне бы хотелось найти только свои.
TenhouViewer -ftournier.txt nickname=Stray -t -y -soutput/Strayyaku.txt
Если не очень понятно, поясню оный конвеер:
1. -ftournier.txt nickname=Stray — вытаскиваем все раздачи игрока Stray из файла, все остальные не трогаем;
2. -t — собираем статистику по отфильтрованным играм;
3. -y — вытаскиваем из собранной статистики список яку;
4. -soutput/Strayyaku.txt — сохраняем.
Результат.
В итоге получится список яку, собранных только выбранным игроком.
Правда, свой лог надо будет перепарсить программой заново — я формат поменял немного, ибо обнаружил, что там не вся необходимая информация создавалась.
Версия r181 с примером.
Его бы в гуи каком-нибудь...