📄 box.asm
字号:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
L equ -1
R equ 1
.data?
a dd ?
b dd ?
hInstance dd ?
hWinMain dd ?
random1 dd ?
random2 dd ?
timergame dd ?
quickdiadown dd ?
timerleft dd ?
timerright dd ?
timercir dd ?
cirjh dd ?
achievement dd ?
achbuff db 5 dup(?)
dialeft dd ?;左移标记
diaright dd ?;右称标记
diacia dd ?;旋转标记
rdtop dd ?;记录每种组合的状态
rdcoord db 4 dup(?);记录每个小方格的偏移位置
rdbuff db 210 dup(?);整个活动区域
systime SYSTEMTIME <>
poly struct
tlX dd ?
tlY dd ?
blX dd ?
blY dd ?
brX dd ?
brY dd ?
trX dd ?
trY dd ?
poly ends
.const
szClassName db 'MyGame',0
szCaptionMain db 'Rd',0
explain db '↑ ↓ ← →',0
.code
_dia proc _x,_y,_p,@hdc
;----------------------------------------------------
;绘制小方格
;----------------------------------------------------
LOCAL @poly:poly
pushad
mov eax,_p
push _x
pop @poly.tlX
push _y
pop @poly.tlY
push _x
pop @poly.blX
push _y
pop @poly.blY
add @poly.blY,eax
push _x
pop @poly.brX
add @poly.brX,eax
push _y
pop @poly.brY
add @poly.brY,eax
push _x
pop @poly.trX
add @poly.trX,eax
push _y
pop @poly.trY
invoke MoveToEx,@hdc,@poly.trX,@poly.trY,0
invoke PolylineTo,@hdc,addr @poly,4
popad
ret
_dia endp
_scanplot proc @hdc
LOCAL @x
LOCAL @y
pushad
lea esi,rdbuff
xor ecx,ecx
@@:
cmp ecx,200
jz @f
push ecx
mov eax,ecx
xor edx,edx
mov ebx,10
div ebx
mov ecx,edx
mov ebx,7
mul ebx
xchg eax,ecx
mul ebx
mov @x,eax
mov @y,ecx
mov al,byte ptr[esi]
.if al
invoke GetStockObject,BLACK_PEN
invoke SelectObject,@hdc,eax
invoke _dia,@x,@y,6,@hdc
add @x,2
add @y,2
invoke _dia,@x,@y,2,@hdc
.else
invoke GetStockObject,WHITE_PEN
invoke SelectObject,@hdc,eax
invoke _dia,@x,@y,6,@hdc
add @x,2
add @y,2
invoke _dia,@x,@y,2,@hdc
.endif
inc esi
pop ecx
inc ecx
jmp @b
@@:
popad
ret
_scanplot endp
_next proc n,@hdc
LOCAL @poly:poly
;----------------------------------------------------------
;清除上次图形
;----------------------------------------------------------
invoke GetStockObject,WHITE_BRUSH
invoke SelectObject,@hdc,eax
invoke GetStockObject,NULL_PEN
invoke SelectObject,@hdc,eax
invoke Rectangle,@hdc,77,7,99,36
;----------------------------------------------------------
;在右栏绘制下一个图形
;----------------------------------------------------------
invoke CreatePen,PS_SOLID,1,0
push eax
invoke SelectObject,@hdc,eax
.if n == 1
invoke _dia,91, 7,6,@hdc
invoke _dia,93, 9,2,@hdc
invoke _dia,91,14,6,@hdc
invoke _dia,93,16,2,@hdc
invoke _dia,91,21,6,@hdc
invoke _dia,93,23,2,@hdc
invoke _dia,91,28,6,@hdc
invoke _dia,93,30,2,@hdc
.elseif n == 2
invoke _dia,84,21,6,@hdc
invoke _dia,86,23,2,@hdc
invoke _dia,84,28,6,@hdc
invoke _dia,86,30,2,@hdc
invoke _dia,91,28,6,@hdc
invoke _dia,93,30,2,@hdc
invoke _dia,91,21,6,@hdc
invoke _dia,93,23,2,@hdc
.elseif n == 3
invoke _dia,84,14,6,@hdc
invoke _dia,86,16,2,@hdc
invoke _dia,84,21,6,@hdc
invoke _dia,86,23,2,@hdc
invoke _dia,84,28,6,@hdc
invoke _dia,86,30,2,@hdc
invoke _dia,91,28,6,@hdc
invoke _dia,93,30,2,@hdc
.elseif n == 4
invoke _dia,91,14,6,@hdc
invoke _dia,93,16,2,@hdc
invoke _dia,91,21,6,@hdc
invoke _dia,93,23,2,@hdc
invoke _dia,91,28,6,@hdc
invoke _dia,93,30,2,@hdc
invoke _dia,84,28,6,@hdc
invoke _dia,86,30,2,@hdc
.elseif n == 5
invoke _dia,84,21,6,@hdc
invoke _dia,86,23,2,@hdc
invoke _dia,77,28,6,@hdc
invoke _dia,79,30,2,@hdc
invoke _dia,84,28,6,@hdc
invoke _dia,86,30,2,@hdc
invoke _dia,91,28,6,@hdc
invoke _dia,93,30,2,@hdc
.elseif n == 6
invoke _dia,77,21,6,@hdc
invoke _dia,79,23,2,@hdc
invoke _dia,84,21,6,@hdc
invoke _dia,86,23,2,@hdc
invoke _dia,84,28,6,@hdc
invoke _dia,86,30,2,@hdc
invoke _dia,91,28,6,@hdc
invoke _dia,93,30,2,@hdc
.else
invoke _dia,84,21,6,@hdc
invoke _dia,86,23,2,@hdc
invoke _dia,91,21,6,@hdc
invoke _dia,93,23,2,@hdc
invoke _dia,77,28,6,@hdc
invoke _dia,79,30,2,@hdc
invoke _dia,84,28,6,@hdc
invoke _dia,86,30,2,@hdc
.endif
pop eax
invoke DeleteObject,eax
ret
_next endp
_shift proc LorR
pushad
mov ebx,LorR
lea esi,rdcoord
add byte ptr[esi],bl
add byte ptr[esi+1],bl
add byte ptr[esi+2],bl
add byte ptr[esi+3],bl
popad
ret
_shift endp
_init proc ;初始化方块偏侈坐标
lea esi,rdcoord
.if random2 == 1
mov byte ptr[esi],4
mov byte ptr[esi+1],14
mov byte ptr[esi+2],24
mov byte ptr[esi+3],34
.elseif random2 == 2
mov byte ptr[esi],4
mov byte ptr[esi+1],5
mov byte ptr[esi+2],14
mov byte ptr[esi+3],15
.elseif random2 == 3
mov byte ptr[esi],4
mov byte ptr[esi+1],14
mov byte ptr[esi+2],24
mov byte ptr[esi+3],25
.elseif random2 == 4
mov byte ptr[esi],5
mov byte ptr[esi+1],15
mov byte ptr[esi+2],25
mov byte ptr[esi+3],24
.elseif random2 == 5
mov byte ptr[esi],4
mov byte ptr[esi+1],13
mov byte ptr[esi+2],14
mov byte ptr[esi+3],15
.elseif random2 == 6
mov byte ptr[esi],3
mov byte ptr[esi+1],4
mov byte ptr[esi+2],14
mov byte ptr[esi+3],15
.else
mov byte ptr[esi],4
mov byte ptr[esi+1],5
mov byte ptr[esi+2],13
mov byte ptr[esi+3],14
.endif
mov rdtop,1
ret
_init endp
_setbuff proc zhi,clear ;给图形缓冲区设定有无方块
pushad
mov ecx,clear
lea edi,rdbuff
lea esi,rdcoord
mov eax,zhi
xor ebx,ebx
mov bl,byte ptr[esi]
sub ebx,ecx
mov byte ptr[edi+ebx],al
xor ebx,ebx
mov bl,byte ptr[esi+1]
sub ebx,ecx
mov byte ptr[edi+ebx],al
xor ebx,ebx
mov bl,byte ptr[esi+2]
sub ebx,ecx
mov byte ptr[edi+ebx],al
xor ebx,ebx
mov bl,byte ptr[esi+3]
sub ebx,ecx
mov byte ptr[edi+ebx],al
popad
ret
_setbuff endp
_ran proc uses ebx edx
invoke GetLocalTime,addr systime
mov ax,systime.wMilliseconds
xor dx,dx
mov bx,7
div bx
inc dx
movzx edx,dx
mov eax,edx
ret
_ran endp
_down proc uses ebx ecx edx edi esi
lea edi,rdbuff
lea esi,rdcoord
xor ebx,ebx
.if random2 == 1
.if rdtop == 1
mov bl,byte ptr[esi+3]
cmp byte ptr[edi+ebx],0
jnz @f
invoke _setbuff,0,10
invoke _setbuff,1,0
jmp l
@@:
mov eax,0
ret
l:
.elseif rdtop == 2
mov bl,byte ptr[esi]
cmp byte ptr[edi+ebx],0
jnz @f
mov bl,byte ptr[esi+1]
cmp byte ptr[edi+ebx],0
jnz @f
mov bl,byte ptr[esi+2]
cmp byte ptr[edi+ebx],0
jnz @f
mov bl,byte ptr[esi+3]
cmp byte ptr[edi+ebx],0
jnz @f
invoke _setbuff,0,10
invoke _setbuff,1,0
jmp l1
@@:
mov eax,0
ret
l1:
.endif
.elseif random2 == 2
mov bl,byte ptr[esi+2]
cmp byte ptr[edi+ebx],0
jnz @f
mov bl,byte ptr[esi+3]
cmp byte ptr[edi+ebx],0
jnz @f
invoke _setbuff,0,10
invoke _setbuff,1,0
jmp lp1
@@:
mov eax,0
ret
lp1:
.elseif random2 == 3
.if rdtop == 1
mov bl,byte ptr[esi+2]
cmp byte ptr[edi+ebx],0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -