Базар вокруг игры / Комп в помощь / Самое быстрое определение покерной комбинации — Часть 2
Подписка на тему  Перейти вниз
Самое быстрое определение покерной комбинации — Часть 2   ID:25243 Чт, 25 октября 2007 23:36 [#] [»)
Sharky Форумы CasinoGames
Эх, мог бы получить баблз за это Smile Но, сейчас практически не востребован. Пропадет, а жалко...
1. Ненужно бездумно копировать код!
2. Все константы должны совпадать с моими!
3. Все структуры (records) должны совпадать с моими!
4. Дополнительные массивы должны быть явно определены...

Не претендую, что это будет самый-самый оптимальный алгоритм... Но лучшего никогда и нигде в доступном виде не было! Это претендент, по сути... Кто поймет — милости прошу пообщаться.. Будут доп. идеи — вдвойне. Кстати, версия чуть более оптимальная конечно есть, но понятно, из-за личных соображений не буду афишировать...

Алгоритм практически равен извлечению данных из таблицы 13^5 с доп. проверкой на флешь, немного уступает 52^5.. Однако экономия RAM — вверх оптимизации, имхо..

Из всей арифметики(?) — банальные OR-AND-XOR. Стиль программирования конечно стремный... Smile Но чего не сделаешь, лишь бы...

Собственно код:

<div style="margin:20px; margin-top:5px">
<div class="smallfont" style="margin-bottom:2px">Код:</div>
<pre class="alt2" dir="ltr" style="
margin: 0px;
padding: 4px;
border: 1px inset;
width: 640px;
height: 498px;
text-align: left;
overflow: auto">procedure FastEstimateHand(var Hand: THand); register; assembler;
asm
PUSH EBX
PUSH ESI

MOV ESI, EAX
XOR EAX, EAX

MOV EDX, [ESI + THand.Cards] // Pointer on First Card
MOV EBX, [ESI + THand.Cards + 4] // Pointer on Second Card

MOV AX, word ptr [EDX + TCard.Mask]
MOV EDX, EAX // OR Mask
MOV ECX, EAX // XOR Mask
MOV AX, word ptr [EBX + TCard.Mask]
MOV EBX, [ESI + THand.Cards + 8] // Pointer on Third Card
OR DX, AX
XOR CX, AX

MOV AX, word ptr [EBX + TCard.Mask]
MOV EBX, [ESI + THand.Cards + 12] // Pointer on Fourth Card
OR DX, AX
XOR CX, AX

MOV AX, word ptr [EBX + TCard.Mask]
MOV EBX, [ESI + THand.Cards + 16] // Pointer on Fifth Card
OR DX, AX
XOR CX, AX

MOV AX, word ptr [EBX + TCard.Mask]
XOR EBX, EBX
OR DX, AX
MOV BX, word ptr [BIT_COUNT16 + EDX * 2]
XOR CX, AX
JMP @Vector.Pointer[EBX * 4]

@Vector:
DD @Kinds0 // Error
DD @Kinds1 // Error
DD @Kinds2 // Full House, or Four Kinds
DD @Kinds3 // Two Pairs, or Three Kinds
DD @Kinds4 // One Pair
DD @Kinds5 // Blank, AK, Straight, Flush, or Straight Flush

@Kinds0:
@Kinds1:
MOV byte ptr [ESI + THand.Combination], COMBINATION_BLANK
POP ESI
POP EBX
RET

@Kinds2:
MOV ECX, 1
MOV EBX, [ESI + THand.Cards + 12]
TEST word ptr [EBX + TCard.Mask], AX
JZ @M3
INC CX
@M3:
MOV EBX, [ESI + THand.Cards + 8]
TEST word ptr [EBX + TCard.Mask], AX
JZ @M2
INC CX
@M2:
MOV EBX, [ESI + THand.Cards + 4]
TEST word ptr [EBX + TCard.Mask], AX
JZ @M1
INC CX
@M1:
MOV EBX, [ESI + THand.Cards]
TEST word ptr [EBX + TCard.Mask], AX
JZ @M0
INC CX
@M0:
JMP @Kinds2Vector.Pointer[ECX * 4]
@Kinds2Vector:
DD @Kinds0
DD @K1
DD @K2
DD @K3
DD @K4
@K1: //
XOR DX, AX
MOV word ptr [ESI + THand.Detail], AX
MOV word ptr [ESI + THand.Detail + 2], DX
MOV byte ptr [ESI + THand.Combination], COMBINATION_FOUR_KIND
POP ESI
POP EBX
RET
@K2: //
XOR DX, AX
MOV word ptr [ESI + THand.Detail], AX
MOV word ptr [ESI + THand.Detail + 2], DX
MOV byte ptr [ESI + THand.Combination], COMBINATION_FULL_HOUSE
POP ESI
POP EBX
RET
@K3: //
XOR DX, AX
MOV word ptr [ESI + THand.Detail + 2], AX
MOV word ptr [ESI + THand.Detail], DX
MOV byte ptr [ESI + THand.Combination], COMBINATION_FULL_HOUSE
POP ESI
POP EBX
RET
@K4: //
XOR DX, AX
MOV word ptr [ESI + THand.Detail + 2], AX
MOV word ptr [ESI + THand.Detail], DX
MOV byte ptr [ESI + THand.Combination], COMBINATION_FOUR_KIND
POP ESI
POP EBX
RET
@Kinds3:
MOV BX, CX
XOR CX, DX
TEST CX, CX
JZ @ThreeKind

XOR DX, BX
MOV word ptr [ESI + THand.Detail], BX
MOV word ptr [ESI + THand.Detail + 2], DX
MOV byte ptr [ESI + THand.Combination], COMBINATION_TWO_PAIRS
POP ESI
POP EBX
RET

@ThreeKind:
// MaskOR in EDX
// AX = Last Index
MOV EBX, [ESI + THand.Cards]
MOV CX, word ptr [EBX + TCard.Mask]
XOR AX, CX
TEST AX, CX
JZ @FindKind
MOV EBX, [ESI + THand.Cards + 4]
MOV CX, word ptr [EBX + TCard.Mask]
XOR AX, CX
TEST AX, CX
JZ @FindKind
MOV EBX, [ESI + THand.Cards + 8]
MOV CX, word ptr [EBX + TCard.Mask]
@FindKind:
XOR DX, CX
MOV word ptr [ESI + THand.Detail + 2], CX
MOV word ptr [ESI + THand.Detail], DX
MOV byte ptr [ESI + THand.Combination], COMBINATION_THREE_KIND
POP ESI
POP EBX
RET
//—————-
@Kinds4:
XOR DX, CX
MOV word ptr [ESI + THand.Detail], CX
MOV word ptr [ESI + THand.Detail + 2], DX
MOV byte ptr [ESI + THand.Combination], COMBINATION_ONE_PAIR
POP ESI
POP EBX
RET

@Kinds5:
XOR EAX, EAX
MOV AL, byte ptr [CMB_DETECT + EDX]
CMP DX, MASK_STRAIGHT_5A
JNZ @M20
XOR DX, MASK_A
@M20:
MOV [ESI + THand.Detail], EDX
// Recode if Flush detected
MOV EDX, [ESI + THand.Cards]
MOV ECX, [ESI + THand.Cards + 4]
MOV BX, word ptr [EDX + TCard.SuitIndex]
OR BX, [ECX + TCard.SuitIndex]
MOV EDX, [ESI + THand.Cards + 8]
MOV ECX, [ESI + THand.Cards + 12]
OR BX, [EDX + TCard.SuitIndex]
OR BX, [ECX + TCard.SuitIndex]
MOV EDX, [ESI + THand.Cards + 16]
CMP [EDX + TCard.SuitIndex], BX
JNZ @Kinds5E
// Flush is Detect
MOV AL, byte ptr [@CONV_TABLE + EAX]
MOV EDX, [ESI + THand.Detail]
CMP DX, MASK_STRAIGHT_AT
JNZ @Kinds5E
MOV AL, COMBINATION_ROYAL_FLUSH

@Kinds5E:
MOV byte ptr [ESI + THand.Combination], AL
POP ESI
POP EBX
RET

@CONV_TABLE:
DB COMBINATION_FLUSH
DB COMBINATION_FLUSH
DB COMBINATION_ONE_PAIR
DB COMBINATION_TWO_PAIRS
DB COMBINATION_THREE_KIND
DB COMBINATION_FLUSH
DB COMBINATION_FLUSH
DB COMBINATION_STRAIGHT_FLUSH
end;</pre>
</div>
        
 
Список сообщений

Самое быстрое определение покерной комбинации — Часть 2 
От: Sharky вкл Чт, 25 октября 2007 23:36
Re: Самое быстрое определение покерной комбинации — Часть 2
От: Sharky вкл Пт, 26 октября 2007 00:22
Re: Самое быстрое определение покерной комбинации — Часть 2
От: Sharky вкл Пт, 26 октября 2007 00:33
Re: Самое быстрое определение покерной комбинации — Часть 2
От: Sharky вкл Пт, 26 октября 2007 01:02
Re: Самое быстрое определение покерной комбинации — Часть 2
От: korovin вкл Пт, 26 октября 2007 02:05
Re: Самое быстрое определение покерной комбинации — Часть 2
От: Sharky вкл Пт, 26 октября 2007 12:32
Re: Самое быстрое определение покерной комбинации — Часть 2
От: korovin вкл Пт, 26 октября 2007 13:15
Re: Самое быстрое определение покерной комбинации — Часть 2
От: Шамсутдинов вкл Пн, 29 октября 2007 15:14
Re: Самое быстрое определение покерной комбинации — Часть 2
От: Sharky вкл Пн, 29 октября 2007 16:01
Re: Самое быстрое определение покерной комбинации — Часть 2
От: Шамсутдинов вкл Вт, 30 октября 2007 14:20
Re: Самое быстрое определение покерной комбинации — Часть 2
От: Kielbasa вкл Вт, 20 ноября 2007 09:25
Re: Самое быстрое определение покерной комбинации — Часть 2
От: PokerAmateur вкл Чт, 3 января 2008 17:54
От: joker2k1 вкл Вс, 8 февраля 2009 11:33
От: Fabrica вкл Вс, 8 февраля 2009 18:01
От: joker2k1 вкл Вс, 8 февраля 2009 20:12
От: Fabrica вкл Пн, 9 февраля 2009 08:57
От: joker2k1 вкл Пн, 9 февраля 2009 10:47
От: Fabrica вкл Пн, 9 февраля 2009 14:06
Re: Самое быстрое определение покерной комбинации — Часть 2
От: joker2k1 вкл Сб, 4 апреля 2009 13:52
Re: Самое быстрое определение покерной комбинации — Часть 2
От: joker2k1 вкл Сб, 4 апреля 2009 15:30
Предыдущая тема:Программа Mialan_Spin
Следующая тема:Robot dlya BJ
Быстрый переход к форуму
  
  Текстовая версия  RSS лента
Вернуться вверх

Текущее время: Пн, 25 ноября 02:45:51 2024
Время, затраченное на генерацию страницы: 0.00634 секунд