Просмотреть всю тему "Soft Speed Test (покер)" »»
Re: Soft Speed Test   ID:25049   ответ на 24894 Пн, 26 марта 2007 14:46 [#]
Шамсутдинов Закрыть блок (иконки IM) Форумы CasinoGames
Программистских идей несколько. Основная идея в моем алгоритме - то, что по профилю и по количеству свободных карт в ранге КД можно расчитать количество комбинаций с парой (2, 2+2, 3 3+2, 4). Профиль определяется количеством 0,1,2,3 карт в рангах, кроме ранга КД. Каждое из этих чисел от 0 до 12, но их комбинаций 1820. Можно сделать массив [13][13][13][13], переводящий совокупность этих количеств, в номер от 0 до 1819 для экономии места (эта же идея используется, например, для определения комбинации box'а, особенно в случае 6 карт, но там индексы - ранги карт, а не количества). Но лучше сделать один номер - индекс, объединяющий 4 индекса - r0+13*r1+169*r2+2197*r3. Такой индекс инкриментально подсчитать модифицировать, при изменениях в ri. Для подсчета количества, например, трех карт без совпадения ранга, тоже нужно использовать профиль. Для определения старшинства комбинаций, кроме S,F,FS и FR приходится иметь профиль (его индекс) не для всех рангов, а для рангов от 0 до каждого ранга. Поэтому, для этих комбинаций нужно получать массив этих индексов [13]. Он не подлежит для инкрементальных изменений. Рассчет старшинства AK и всех комбинаций с парой обходится вообще без циклов, каждая величина считается сразу по формуле. Хотя, сравнение старшинства пары по первой карте, только чуть-чуть лучше таким образом, чем явное суммирование по меньшей половине ранга по немного более простым формулам.
Вообще, в моей основной процедуре нет ни одного цикла. Рассчет strait быстрее, как switch по всем 13 рангам КД с явными формулами, оптимизированными в каждом конкретном случае.
Для рассчета флешей заводится индекс - свободность карт в масти, как биты. Этот индекс удобно инкриментально изменять, модифицировать, а также получать его для рангов от 0 до нужного. Сейчас из этого индекса у меня исключен ранг КД. Но, помоему, этого лучше не делать, придется переделывать.
Более мелкие рекомендации - следить, чтобы элементы массивов, в т.ч. их подмассивы меньшей размерности, имели размер 1,2 или 4n байт. Для этого нужно добавить ложные записи в структуры или лишние элементы во вложенные массивы (считается, что поля в структурах не выравниваются по 2 или 4 байтам). Не использовать глобальных переменных. Правильно выбирать размер целых типов. Размещать часто используемые данные по небольшим адресам в стеке или в структурах. Понимать, как происходит адресация в стек, в структуру, по индексу массива. В силу этого, некоторые изменения, кажущиеся лучшими, могут дать тот же результат.

Я не использовал ассемблерных вставок.

Вообще, совет - чтобы программировать, нужно сначала хорошо владеть математикой - настолько, что бы суметь придумать новый метод, расчитать новые формулы. Все формулы по игре с заданным МО и дисперсией я вывел самостоятельно. Было достаточно знать, что какая-то формула существует, а иногда и этого не нужно.