Самое быстрое определение покерной комбинации — Часть 2 ID:25243 |
Чт, 25 октября 2007 23:36 [#] [») |
|
Sharky |
|
(иконки IM)
Форумы CasinoGames
|
|
Эх, мог бы получить баблз за это Но, сейчас практически не востребован. Пропадет, а жалко...
1. Ненужно бездумно копировать код!
2. Все константы должны совпадать с моими!
3. Все структуры (records) должны совпадать с моими!
4. Дополнительные массивы должны быть явно определены...
Не претендую, что это будет самый-самый оптимальный алгоритм... Но лучшего никогда и нигде в доступном виде не было! Это претендент, по сути... Кто поймет — милости прошу пообщаться.. Будут доп. идеи — вдвойне. Кстати, версия чуть более оптимальная конечно есть, но понятно, из-за личных соображений не буду афишировать...
Алгоритм практически равен извлечению данных из таблицы 13^5 с доп. проверкой на флешь, немного уступает 52^5.. Однако экономия RAM — вверх оптимизации, имхо..
Из всей арифметики(?) — банальные OR-AND-XOR. Стиль программирования конечно стремный... Но чего не сделаешь, лишь бы...
Собственно код:
<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>
|
|
|