Алгоритм для вычисления распределения рука против руки - Программа построения равновесных стратегий для игры

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

    1. Фиксируем карты у первого кластера. 2. Перебираем все возможные сочетания карт с учетом изъятия карт первого кластера для второго кластера. Максимум возможно 24 варианта. При переборе будет идти фильтрация на не повторяемость каждой карты и на стратегическую уникальность каждого варианта. 3. Перебираем все возможные сочетания общих карт с учетом изъятия карт первого и второго кластера. При этом, в зависимости от сочетаний двух рассчитываемых кластеров возможно провести различные сокращения вычислений. 4. Умножаем полученные результаты на количество стратегически различных вариантов карт первого кластера.

Для сокращения количества вариантов для перебора сочетаний общих карт разобьем все кластера на три большие группы:

    - Руки которые не могут составить комбинацию флаш. Это будут руки типа: abcd. Их количество 1820. Далее будем называть эту группу разномастные. - Руки которые могут составить комбинацию флаш только с помощью одной масти. Это будут руки типа: aaaa, aaab, aabc. Их количество, 715+3718+7098=11531. Далее будем называть эту группу одномастные. - Руки которые могут составить комбинацию флаш с помощью двух мастей. Это будут руки типа: aabb. Их количество 3081. Далее будем называть эту группу двухмастные.

На основе этого разбиения на группы можно помимо главного множества уникальных карт ввести еще три множества:

- множество карт для которых масть не имеет значения. В колоде каждый элемент из этого множества должен повторяться 4 раза.

- первые 13 элементов этого множества будут составлять подмножество карт для которых масть не имеет значения. В колоде каждый элемент из этого подмножества должен повторяться 3 раза. Вторые 13 элементов этого множества будут составлять подмножество карт масти 1. В колоде каждый элемент из этого подмножества должен повторяться один раз.

- первые 13 элементов этого множества будут составлять подмножество карт для которых масть не имеет значения. В колоде каждый элемент из этого подмножества должен повторяться 2 раза. Вторые 13 элементов этого множества будут составлять подмножество карт масти 1. В колоде каждый элемент из этого подмножества должен повторяться один раз. Третьи 13 элементов этого множества будут составлять подмножество карт масти 2. В колоде каждый элемент из этого подмножества должен повторяться один раз.

Также введем функцию где а некий набор правил для отображения в множества.

Благодаря сокращению числа значимых мастей мы можем сильно уменьшить количество вариантов перебора общих карт. Для этого опишем 4 процедуры перебора общих карт, в случае если личные карты каждого из игрока при сравнении отображены в одно и вышеперечисленных множеств.

Процедуру перебора для множества на языке C++ можно посмотреть в приложении A3.

Процедуру перебора для множества на языке C++ можно посмотреть в приложении A4.

Процедуры для перебора множества и будут идти по аналогии.

Для каждого сочетания из этих групп будет свое правило перебора. Всего получится 6 таких сочетаний: разномастные - разномастные, разномастные - одномастные, разномастные - двухмастные, одномастные - одномастные, одномастные - двухмастные, двухмастные - двухмастные.

Рассмотрим правила перебора для групп разномастные - разномастные. Это одна из самых простых ситуаций. Согласно основному алгоритму зафиксируем карты первого кластера, после чего будем перебирать все возможные варианты карт второго кластера. В процессе этого перебора не будем осуществлять никаких дополнительных вычислений, а просто посчитаем количество возможных вариантов. В данной ситуации возможен лишь один стратегически значимый вариант сочетаний карт двух кластеров. Зафиксируем карты второго кластера и переберем все возможные варианты общих карты. Так как зафиксированные руки не могу собрать комбинацию флаш, зафиксированные карты мы можем отобразить в множество и перебрать все общие карты соответствующей функцией. После чего умножим полученный результат на количество вариантов полученных при переборе второго кластера.

Процедуру перебора двух кластеров данного сочетания групп на языке C++ можно посмотреть в приложении A5.

Рассмотрим правила перебора для групп разномастные - одномастные. Перед перебором зафиксируем карты карты игрока с одномастной группой. Таким образом при переборе вариантов карт разномастной группы будет стратегически различных варианта карт второго игрока. В зависимости от расположения масти которой первый игрок может собрать флаш. Для каждого из этих возможных вариантов перебираем все возможные варианты расположения мастей которыми нельзя собрать флаш и запоминаем их количество. Количество этих вариантов без фильтрации будет. После этого для каждого стратегически различного варианта второго игрока зафиксируем карты и переберем все возможные варианты общих карт. Так как первый игрок может собрать флаш лишь одной мастью а второй игрок не может собрать флаш мы можем отобразить все зафиксированные карты во множество и осуществить перебор общих карт соответствующей для этого множества процедурой. Затем умножим полученные результаты на количество вариантов перебора для текущей стратегической значимой комбинации второго игрока.

Процедуру перебора двух кластеров данного сочетания групп на языке C++ можно посмотреть в приложении A6.

Рассмотрим правила перебора для групп разномастные - двухмастные. Перед перебором зафиксируем карты карты игрока с двухмастной группой. Таким образом при переборе вариантов карт разномастной группы будет стратегически различных варианта карт второго игрока. В зависимости от расположения мастей которыми первый игрок может собрать флаш. Для каждого из этих возможных вариантов перебираем все возможные варианты расположения мастей которыми нельзя собрать флаш и запоминаем их количество. Количество этих вариантов без фильтрации будет. После этого для каждого стратегически различного варианта второго игрока зафиксируем карты и переберем все возможные варианты общих карт. Так как первый игрок может собрать флаш двумя мастями а второй игрок не может собрать флаш мы можем отобразить все зафиксированные карты во множество и осуществить перебор общих карт соответствующей для этого множества процедурой. Затем умножим полученные результаты на количество вариантов перебора для текущей стратегической значимой комбинации второго игрока.

Процедуру перебора двух кластеров данного сочетания групп на языке C++ можно посмотреть в приложении A7.

Рассмотрим правила перебора для групп одномастные - одномастные. Это наиболее сложная ситуация. Потому что группа одномастные состоит изтрех подгрупп: aaaa, aaab и aabc. Правила перебора для каждого сочетания из этих подгрупп будет различаться. Поэтому будем рассматривать перебор каждого из этих сочетаний отдельно.

Рассмотрим вариант перебора для подгрупп aabc - aabc. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 10 стратегически различных вариантов:

    1. Когда масть которой второй игрок может собрать флаш совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет только одна значимая масть, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 2. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масть первой карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 3. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масть второй карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 4. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масти карт которые не могу собрать флаш у второго игрока не пересекаются с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 5. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 6. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масть второй карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 7. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масти карт которые не могу собрать флаш у второго игрока не пересекаются с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 8. Когда масть которой второй игрок может собрать флаш совпадает с мастью второй карты которой первый игрок не может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 9. Когда масть которой второй игрок может собрать флаш не присутствует у второй игрока и масть второй карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 10. Когда масть которой второй игрок может собрать флаш не присутствует у второй игрока и масти карт которые не могу собрать флаш у второго игрока не пересекаются с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

После перебора каждого из случаев запоминаем количество возможных вариантов карт второго игрока. Затем перебираем все возможные варианты общих карт и умножаем получившийся результат на количество вариантов перебора карт второго игрока.

Процедуру перебора двух кластеров данного сочетания групп данного сочетания подгрупп на языке C++ можно посмотреть в приложении A8.

Рассмотрим вариант перебора для подгрупп aaab - aabc. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 7 стратегически различных вариантов:

    1. Когда масть которой второй игрок может собрать флаш совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет только одна значимая масть, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 2. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масть первой карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 3. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масть второй карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 4. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масти карт которые не могу собрать флаш у второго игрока не пересекаются с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 5. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 6. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масть второй карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 7. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масти карт которые не могу собрать флаш у второго игрока не пересекаются с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

Char TD[24][4]=

[1]; //Таблица для перебора мастей

Int Variants[7]={6,10,14,18,20,22,24}; //Массив вариантов перебора

Int Types[7]={1,2,2,2,2,2,2}; //Массив типов перебора общих карт для каждого варианта перебора

Int numVariants=7; //Количество типов вариантов

Рассмотрим вариант перебора для подгрупп aabc - aaaa. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 4 стратегически различных варианта:

    1. Когда масть которой второй игрок может собрать флаш совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет только одна значимая масть, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 2. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 3. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 4. Когда масть которой второй игрок может собрать флаш совпадает с мастью второй карты которой первый игрок не может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

Char TD[4][4]=

[2];

Int Variants[7]={1,3,4,6,8,10,12}; //Массив вариантов перебора

Int Types[7]={2,2,2,2,3,3,3,3}; //Массив типов перебора общих карт для каждого варианта перебора

Int numVariants=7; //Количество типов вариантов

Рассмотрим вариант перебора для подгрупп aabb - aaaa. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 3 стратегически различных варианта:

    1. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 2. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 3. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы все масти.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

Char TD[4][4]=

{{0,0,0,0}, //Вариант 1

{1,1,1,1}, //Вариант 2

{2,2,2,2}, //Вариант 3

{3,3,3,3},

}; //Таблица для перебора мастей

Int Variants[3]={1,2,4}; //Массив вариантов перебора

Int Types[3]={2,2,3}; //Массив типов перебора общих карт для каждого варианта перебора

Int numVariants=3; //Количество типов вариантов

Рассмотрим правила перебора для групп двухмастные - двухмастные. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 7 стратегически различных вариантов:

    1. Когда первая масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и вторая масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 2. Когда первая масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и вторая масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 3. Когда первая масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и вторая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти. 4. Когда первая масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и вторая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти. 5. Когда вторая масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и первая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти. 6. Когда вторая масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и первая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти. 7. Когда первая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок и вторая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

Char TD[12][4]=

{{0,0,1,1}, //Вариант 1

{1,1,0,0}, //Вариант 2

{0,0,2,2}, //Вариант 3

{0,0,3,3},

{1,1,2,2}, //Вариант 4

{1,1,3,3},

{2,2,0,0}, //Вариант 5

{3,3,0,0},

{2,2,1,1}, //Вариант 6

{3,3,1,1},

{2,2,3,3}, //Вариант 7

{3,3,2,2},; //Таблица для перебора мастей

Int Variants[7]={1,2,4,6,8,10,12}; //Массив вариантов перебора

Int Types[7]={2,2,3,3,3,3,3}; //Массив типов перебора общих карт для каждого варианта перебора

Int numVariants=7; //Количество типов вариантов

    [1] 1,2,0,0}, //Вариант 1

    {1,3,0,0},

    {2,1,0,0},

    {2,3,0,0},

    {3,1,0,0},

    {3,2,0,0},

    {0,1,3,3}, //Вариант 2

    {0,2,3,3},

    {0,1,2,2},

    {0,3,2,2},

    {1,0,3,3}, //Вариант 3

    {2,0,3,3},

    {1,0,2,2},

    {3,0,2,2},

    {1,2,3,3}, //Вариант 4

    {2,1,3,3},

    {1,3,2,2},

    {3,1,2,2},

    {0,2,1,1}, //Вариант 5

    {0,3,1,1},

    {2,0,1,1}, //Вариант 6

    {3,0,1,1},

    {2,3,1,1}, //Вариант 7

    {3,2,1,1 [2] 0,0,0,0}, //Вариант 1

    {1,1,1,1}, //Вариант 2

    {2,2,2,2}, //Вариант 3

    {3,3,3,3} //Вариант 4

    }; //Таблица для перебора мастей

    Int Variants[4]={1,2,3,4}; //Массив вариантов перебора

    Int Types[4]={1,2,2,2}; //Массив типов перебора общих карт для каждого варианта перебора

    Int numVariants=4; //Количество типов вариантов

    Рассмотрим вариант перебора для подгрупп aaab - aaab. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 5 стратегически различных вариантов:

      1. Когда масть которой второй игрок может собрать флаш совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет только одна значимая масть, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 2. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масть первой карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 3. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 4. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока не присутствует у первого игрока. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 5. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

    После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

    Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

    Char TD[12][4]=

    {{1,0,0,0}, //Вариант 1

    {2,0,0,0},

    {3,0,0,0},

    {0,2,2,2}, //Вариант 2

    {0,3,3,3},

    {1,2,2,2}, //Вариант 3

    {3,2,2,2},

    {1,3,3,3},

    {2,3,3,3},

    {2,1,1,1}, //Вариант 4

    {3,1,1,1},

    {0,1,1,1} //Вариант 5

    }; //Таблица для перебора мастей

    Int Variants[5]={3,5,9,11,12}; //Массив вариантов перебора

    Int Types[5]={1,2,2,2,2}; //Массив типов перебора общих карт для каждого варианта перебора

    Int numVariants=5; //Количество типов вариантов

    Рассмотрим вариант перебора для подгруппы aaab - aaaa. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 3 стратегически различных варианта:

      1. Когда масть которой второй игрок может собрать флаш совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет только одна значимая масть, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 2. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 3. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

    После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

    Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

    Char TD[4][4]=

    {{0,0,0,0}, //Вариант 1

    {3,3,3,3}, //Вариант 2

    {2,2,2,2},

    {3,3,3,3} //Вариант 3

    }; //Таблица для перебора мастей

    Int Variants[3]={1,3,4}; //Массив вариантов перебора

    Int Types[3]={1,2,2}; //Массив типов перебора общих карт для каждого варианта перебора

    Int numVariants=3; //Количество типов вариантов

    Рассмотрим вариант перебора для подгрупп aaaa - aaaa. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 2 стратегически различных варианта:

      1. Когда масть которой второй игрок может собрать флаш совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет. У этого сочетания будет только одна значимая масть, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 2. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

    После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

    Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

    Char TD[4][4]=

    {{0,0,0,0}, //Вариант 1

    {1,1,1,1}, //Вариант 2

    {2,2,2,2},

    {3,3,3,3}

    }; //Таблица для перебора мастей

    Int Variants[2]={1,4}; //Массив вариантов перебора

    Int Types[2]={1,2}; //Массив типов перебора общих карт для каждого варианта перебора

    Int numVariants=2; //Количество типов вариантов

    Рассмотрим правила перебора для групп одномастные - двухмастные. Для перебора вариантов этой ситуации нам необходимо учесть, что группа одномастных состоит из трех подгрупп: aaaa, aaab и aabc. Каждую из этих подгрупп будем перебирать с двухмастными отдельно.

    Рассмотрим вариант перебора для подгрупп aabb - aabc. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 12 стратегически различных вариантов:

      1. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 2. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и масть второй карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 3. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и масти карт которые не могу собрать флаш у второго игрока не пересекаются со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 4. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 5. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и масть второй карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 6. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и масти карт которые не могу собрать флаш у второго игрока не пересекаются с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 7. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти. 8. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти. 9. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти. 10. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти. 11. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти. 12. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти.

    После перебора каждого из случаев запоминаем количество возможных вариантов карт второго игрока. Затем перебираем все возможные варианты общих карт и умножаем получившийся результат на количество вариантов перебора карт второго игрока.

    Процедуру перебора двух кластеров данного сочетания групп данного сочетания подгрупп на языке C++ можно посмотреть в приложении A9.

    Рассмотрим вариант перебора для подгрупп aabb - aaab. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 7 стратегически различных вариантов:

      1. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 2. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 3. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 4. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой. 5. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок и масть первой карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти. 6. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок и масть первой карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти. 7. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет. У этого сочетания значимы будут все масти.

    После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

    Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

    Char TD[12][4]=

    {{1,0,0,0}, //Вариант 1

    {2,0,0,0}, //Вариант 2

    {3,0,0,0},

    {0,1,1,1}, //Вариант 3

    {2,1,1,1}, //Вариант 4

    {3,1,1,1},

    {0,2,2,2}, //Вариант 5

    {0,3,3,3},

    {1,2,2,2}, //Вариант 6

    {1,2,2,2},

    {2,3,3,3}, //Вариант 7

    {3,2,2,2

Похожие статьи




Алгоритм для вычисления распределения рука против руки - Программа построения равновесных стратегий для игры

Предыдущая | Следующая