Я знаю, есть люди, которые считают, что проплаченный клиент тенхочки может подкидывать ему нужные тайлики, обеспечивать замес стены и всякое такое. Да, бывает такие заходы противникам, что может прихватить багет — фига ж он лакер. Но это чисто везение. Если б не упустил своё место в прошлой раздаче, или б смог добиться смены мест — та рука пришла б и тебе. Но ему повезло больше.
Видимо, после появления тенхочки (когда она только начиналась и стену подсматривать в реплеях было нельзя), им не раз выдавали претензии такого же плана, потому они решили изменить алгоритм генерации стены и опубликовать его у себя в бложике (кому интересно — сам найдёт).
Суть такова: сервер каким-то образом генерирует целую кучу случайных чисел, а именно 634 штуки. Каким образом — не знаю. Наверное, каким-то генератором случайных чисел. Этим массивом инициализируется следующий генератор случайных числе, который работает по алгоритму Mersenne Twist. Для каждого набора чисел будет получаться свой генератор, в котором порядок выпадения чисел не угадаешь. А наборов таких дохрена: 624 числа, каждое из которых меняется от 0 до четырёх с лишним миллионов.
Так вот, с помощью этого второго генератора они получают последовательно 288 чисел. Их шифруют с помощью криптографического алгоритма SHA512. Получают в результате 144 числа (и уже фиг подменишь хотя бы одно из них), которые назовём rnd.
читать дальшеТайлы в тенхочке кодируются числами от 0 до 135.
0-3 — 1 ман;
4-7 — 2 ман;
Потом так же соу, так же пины, ветра (восток, юг, запад, север), драконы (зелёный, красный, белый). Пятёрки, номер которых кратен 4 являются красными (если правилами они разрешены).
Первым проходом они делают просто последовательность от 0 до 135, один за одним — неперемешанная стена. А дальше начинают мешать. Берём первый тайл (который под номером 0) и меняем его с тайлом, номер коего определяется по формуле i + (rnd[i] % (136 - i)). И так по всей стене 136 раз (по одному на тайл). Перемешаются все тайлы.
Результат броска кубиков тоже определяется из набора rnd:
кубик 1: 1 + (rnd[136] % 6);
кубик 2: 1 + (rnd[137] % 6);
Хотя на самом деле кубик ни на что не влияет, кроме как на картинку в клиентике. Стена уже сформирована, её начало и конец определены.
Я, правда, забыл, как выбирается первый дилер и вообще порядок игроков.
Первые 14 номеров набора (с индексами 0-13) представляют собой мёртвую стену. Тайлы под номерами 5,7,9,11 — указатели дор (и кан-дор, естественно). Под ними, 4, 6, 8, 10 — указатели ура-дор. Естественно, в клиентике мы видим при начале игры тайл под номером 5. Пятый от начала стены.
Разбор стены идёт с конца: тайлы 132-135 идут востоку, 128-131 югу, и так далее, как мы разбираем тайлы в реальных играх. Дальше берём по ходу игры по одному тайлику в установленном порядке в сторону уменьшения номера.
Доиграли игру, тенхочка, используя всё тот же заряженный генератор случайных чисел, получает следующие 288 чисел (144 после SHA512) и делает новую стену. И так сколько угодно раз — генератор бесконечный. Исходя из этого можно сказать, что все стены в игре предопределены перед первой раздачей. И какие кому тайлы достанутся определится только ветром места и объявлениями.
То есть если вы потеряли дилера, набросив кому-то по глупости в рон, а потом следующий дилер выиграл по дабури иппацу манган или больше — это вы лох, он мог бы быть и вашим, если бы восток остался у вас.
Даже если тенхочка имеет любимчиков, которым предлагает сладкие игры (ну, например, подбирает такие наборы чисел, чтоб любимчику достался смак, хотя я сомневаюсь и в таком), то каким-то образом поменяв порядок ходов всё можно сломать. Или наоборот =D Уж как повезёт. В общем, не надо париться по замесам — по ходу игры ничего поменять тенхочка не может. И где-то вкусные руки всё же ждут и вас.
Пример кода на C# можно посмотреть в исходниках tenhouviewer: WallGenerator.cs.