.const
Yes db 11111111b
No db 00000000b
LenPrSt dd 20
.data
StoneProperty struc
Xod dd ?
Color dd ?
NomPos dd ?
SvyazXL db ?
SvyazXR db ?
SvyazYT db ?
SvyazYB db ?
DameXL db ?
DameXR db ?
DameYT db ?
DameYB db ?
StoneProperty ends
PropStone StoneProperty 80 dup (<-1,-1,-1,0,0,0,0,1,1,1,1>) ; 20 byte*81=1620
GroupStn struc
Color dd ? ; |
Dame dw ? ; | -- 10 byte
Zvyaz dw ? ; |
NomerGr dw ? ; |
NomPosStn dd 20 dup (?); - 80 byte
GroupStn ends
StoneGroup GroupStn 80 dup (<>) ; Arrey of 90 byte * 81 = 7290 byte
PosStn struc
Xod dd ?
NomPos dd ?
Color dd ?
Dame dw ? ; 16 byte
Svyaz dw ?
PosStn ends
PosBoard PosStn 80 dup (<-1,-1,-1,4,0>) ; Arrey of 16 byte * 81 = 1296 byte
.code
comment ~
PosNew struc ; заполнение идет по - p - счетчику ходов (номер хода)
delX dd ?
delY dd ?
col dd ?
xod dd ?
nompos dd ?
PosNew ends
NewPos PosNew 81 dup ({?})
colBrush
PosStone
OldPos ; массив, заполняется в том случае когда съедают камень или группу камней,
;для перерисовки всех камней на доске после снятия пленных
oldp ;номер хода
NomPos ; номер позиции на доске
~
Filling_Stone_Bl_Wh_Prime proc uses edi esi ;заполнение начальных свойств камней, не зависимо от влияния других камней
; идет по NomPos - номеру позиции на доске
;.if oldp >= 0 || oldp <= 81
;************************************************************
mov eax, NomPos
mul LenPrSt ; NomPos*20 byte
mov esi,eax
mov eax, oldp
shl eax,4 ; oldp*16 byte
mov edi, eax
mov eax, NomPos
mov ecx, oldp
mov PropStone.NomPos[esi], eax ; PropStone заполняется по номеру позиции
mov PropStone.Xod[esi], ecx
mov PosBoard.NomPos[edi], eax ; PosBoard заполняется по номеру хода
mov PosBoard.Xod[edi], ecx
mov eax, colBrush
mov PropStone.Color[esi], eax
mov PosBoard.Color[edi], eax
;************************************************************
;.endif
ret
Filling_Stone_Bl_Wh_Prime endp
align 16
TestPosStn proc uses edi esi
.if oldp >= 1
mov eax, oldp
shl eax, 4
mov edi,eax
;******************************nompos -1= x-1 ******************************************
mov eax, PosBoard.NomPos[edi]
sub eax, 1
mul LenPrSt
mov esi,eax
mov eax, PosBoard.Color[edi]
.if PropStone.Color[esi] == -1
.elseif PropStone.Color[esi] == eax
mov PropStone.SvyazXR[esi], 1
mov PropStone.DameXR[esi], 0
push edi
mov edi,PropStone.Xod[esi]
shl edi,4
sub PosBoard.Dame[edi], 1
add PosBoard.Svyaz[edi], 1
pop edi
push esi
mov eax, PosBoard.NomPos[edi]
mul LenPrSt
mov esi,eax
mov PropStone.SvyazXL[esi], 1
mov PropStone.DameXL[esi], 0
sub PosBoard.Dame[edi], 1
add PosBoard.Svyaz[edi], 1
; call GroupProperty
pop esi
.elseif PropStone.Color[esi] != eax && PropStone.Color[esi] != -1
mov PropStone.SvyazXR[esi], 0
mov PropStone.DameXR[esi], 0
sub PosBoard.Dame[edi], 1
;test PosBoard.Dame[edi],0
;je EraseStone
push esi
mov eax, PosBoard.NomPos[edi]
mul LenPrSt
mov esi,eax
mov PropStone.SvyazXL[esi], 0
mov PropStone.DameXL[esi], 0
sub PosBoard.Dame[edi], 1
pop esi
.endif
;******************************nompos +1 = x+1 ******************************************
mov eax, PosBoard.NomPos[edi]
add eax, 1
mul LenPrSt
mov esi,eax
mov eax, PosBoard.Color[edi]
.if PropStone.Color[esi] == -1
.elseif PropStone.Color[esi] == eax
mov PropStone.SvyazXL[esi], 1
mov PropStone.DameXL[esi], 0
push edi
mov edi,PropStone.Xod[esi]
shl edi,4
sub PosBoard.Dame[edi], 1
add PosBoard.Svyaz[edi], 1
pop edi
push esi
mov eax, PosBoard.NomPos[edi]
mul LenPrSt
mov esi,eax
mov PropStone.SvyazXR[esi], 1
mov PropStone.DameXR[esi], 0
sub PosBoard.Dame[edi], 1
add PosBoard.Svyaz[edi], 1
; call GroupProperty
pop esi
.elseif PropStone.Color[esi] != eax && PropStone.Color[esi] != -1
mov PropStone.SvyazXL[esi], 0
mov PropStone.DameXL[esi], 0
sub PosBoard.Dame[edi], 1
;test PosBoard.Dame[edi],0
;je EraseStone
push esi
mov eax, PosBoard.NomPos[edi]
mul LenPrSt
mov esi,eax
mov PropStone.SvyazXR[esi], 0
mov PropStone.DameXR[esi], 0
sub PosBoard.Dame[edi], 1
pop esi
.endif
;******************************nompos -9 = y-9 ******************************************
mov eax, PosBoard.NomPos[edi]
sub eax, 9
mul LenPrSt
mov esi,eax
mov eax, PosBoard.Color[edi]
.if PropStone.Color[esi] == -1
.elseif PropStone.Color[esi] == edx
mov PropStone.SvyazYB[esi], 1
mov PropStone.DameYB[esi], 0
push edi
mov edi,PropStone.Xod[esi]
shl edi,4
sub PosBoard.Dame[edi], 1
add PosBoard.Svyaz[edi], 1
pop edi
push esi
mov eax, PosBoard.NomPos[edi]
mul LenPrSt
mov esi,eax
mov PropStone.SvyazYT[esi], 1
mov PropStone.DameYT[esi], 0
sub PosBoard.Dame[edi], 1
add PosBoard.Svyaz[edi], 1
; call GroupProperty
pop esi
.elseif PropStone.Color[esi] != eax && PropStone.Color[esi] != -1
mov PropStone.SvyazYB[esi], 0
mov PropStone.DameYB[esi], 0
sub PosBoard.Dame[edi], 1
;test PosBoard.Dame[edi],0
;je EraseStone
push esi
mov eax, PosBoard.NomPos[edi]
mul LenPrSt
mov esi,eax
mov PropStone.SvyazYT[esi], 0
mov PropStone.DameYT[esi], 0
sub PosBoard.Dame[edi], 1
pop esi
.endif
;******************************nompos +9 = y+9 ******************************************
mov eax, PosBoard.NomPos[edi]
add eax, 9
mul LenPrSt
mov esi,eax
mov eax, PosBoard.Color[edi]
.if PropStone.Color[esi] == -1
.elseif PropStone.Color[esi] == edx
mov PropStone.SvyazYT[esi], 1
mov PropStone.DameYT[esi], 0
push edi
mov edi,PropStone.Xod[esi]
shl edi,4
sub PosBoard.Dame[edi], 1
add PosBoard.Svyaz[edi], 1
pop edi
push esi
mov eax, PosBoard.NomPos[edi]
mul LenPrSt
mov esi,eax
mov PropStone.SvyazYB[esi], 1
mov PropStone.DameYB[esi], 0
sub PosBoard.Dame[edi], 1
add PosBoard.Svyaz[edi], 1
; call GroupProperty
pop esi
.elseif PropStone.Color[esi] != eax && PropStone.Color[esi] != -1
mov PropStone.SvyazYT[esi], 0
mov PropStone.DameYT[esi], 0
sub PosBoard.Dame[edi], 1
;test PosBoard.Dame[edi],0
;je EraseStone
push esi
mov eax, PosBoard.NomPos[edi]
mul LenPrSt
mov esi,eax
mov PropStone.SvyazYB[esi], 0
mov PropStone.DameYB[esi], 0
sub PosBoard.Dame[edi], 1
pop esi
.endif
;********************************************************************************************
.if PosBoard.Dame[edi] == 0 && PosBoard.Svyaz[edi] ==0
; jmp ();- На проверку правильности хода, так как этот ход самоубийственен
.elseif PosBoard.Svyaz[edi] != 0 && (PosBoard.Dame[edi] != 0 || PosBoard.Dame[edi] == 0)
; jmp () ;- На проверку группы камней
;.elseif PosBoard.Svyaz[edi] !=0 && PosBoard.Dame[edi] == 0
; jmp () ;- На проверку группы камней
.endif
.endif
ret
TestPosStn endp
Вызов идет из этой процедуры:
.elseif uMsg == WM_LBUTTONDBLCLK
;****************************************************************
;создаем растровый рисунок игрового поля в памяти
; эту функцию можно вызывать в любом месте программы, где удобно,
; но до цикла обработки сообщений
;invoke CreateBoard,memHDC
;*****************************************************************
;invoke InvalidateRect,hWnd,NULL,FALSE
; Сохраним текущие координаты мыши
mov eax,lParam
and eax,0ffffh
mov hitpoint.x, eax
;****************************************************************************
; Здесь идет проверка на не выход курсора за пределы разлиновки игрового поля
;****************************************************************************
.if eax <= RXRight
.if eax >= RXLeft
mov eax,lParam
shr eax,16
mov hitpoint.y, eax
.if eax <= RYBottom
.if eax >= RYTop
invoke LoadCursor,0,IDC_HAND
mov NewCur, eax
invoke SetCursor,NewCur
invoke testPOS ;тест позиции установки камня на доске
mov eax, p
mov oldp, eax
;****************************************************************************
;invoke PosStone,colBrush,oldp
invoke xod, p, hWnd ; проверка очередности хода
invoke PosStone,colBrush,oldp
invoke Filling_Stone_Bl_Wh_Prime ; заполнение свойств камня
invoke TestPosStn
;****************************************************************************
invoke OffsetRgn,HEllips,deltaX,0
invoke OffsetRgn,HEllips,0,deltaY
invoke PaintRgn,memHDC, HEllips
inc p
.endif
.endif
.endif
.endif
invoke InvalidateRect,hWnd,NULL,FALSE
Ну что это за Жизнь... без примеси сумасшествия совсем не интересно......
[
www2.psy.uq.edu.au]
[
www.mercury.csse.unimelb.edu.au] - Крутой Меркурий
[
habrahabr.ru]
[
shogi.by] - Shuogi