📄 blockgame.asm
字号:
;********************************************************************
; 俄罗斯方块游戏 by 宋东升
; V1.0 - 2007年5月18日
;********************************************************************
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap: none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include gdi32.inc
include user32.inc
include kernel32.inc
includelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 100 ;图标
IDM_MAIN equ 101 ;菜单
IDA_MAIN equ 102 ;加速键
IDM_START equ 1001
IDM_STOP equ 1002
IDM_PAUSE equ 1003
IDM_EXIT equ 1004
IDM_LEFT equ 2001
IDM_RIGHT equ 2002
IDM_DOWN equ 2003
IDM_TURN equ 2004
IDM_HELP equ 3001
IDM_ABOUT equ 3002
ID_TIMER equ 1
IS_STOP equ 0
IS_START equ 1
IS_PAUSE equ 2
IC_WINDOWSTYLE equ WS_OVERLAPPED or WS_SYSMENU or WS_MINIMIZEBOX
IC_CLIENTWIDTH equ 20*12+20*6+6
IC_CLIENTHEIGHT equ 20*20+4
IC_BOARDBORDER equ 49155
IC_BOARDBOTTOM equ 65535
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 宏定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
RGB macro red,green,blue
xor eax,eax
mov ah,blue
shl eax,8
mov ah,green
mov al,red
endm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szClassName db "BlockGameWinClass", 0
szCaptionMain db "俄罗斯方块游戏", 0
lpFmtTip db "分数:%d ",13,13,13,13,"级别:%d", 0
lpGameOver db "游戏结束!", 0
Shapes db 0, 2, 7, 0, 2, 6, 2, 0, 0, 14,4, 0, 0, 4, 6, 4
db 0, 6, 6, 0, 0, 6, 6, 0, 0, 6, 6, 0, 0, 6, 6, 0
db 0, 4, 7, 0, 2, 2, 6, 0, 0, 14,2, 0, 0, 6, 4, 4
db 0, 7, 4, 0, 4, 4, 6, 0, 0, 2, 14,0, 0, 6, 2, 2
db 2, 6, 4, 0, 0, 12,6, 0, 0, 2, 6, 4, 0, 6, 3, 0
db 4, 6, 2, 0, 0, 6, 12,0, 0, 4, 6, 2, 0, 3, 6, 0
db 4, 4, 4, 4, 0, 0, 15,0, 2, 2, 2, 2, 0, 15,0, 0
db 0, 2, 7, 0, 2, 6, 2, 0, 0, 14,4, 0, 0, 4, 6, 4
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance HINSTANCE ?
hWinMain HWND ?
hMenu dd ?
hAccelerator dd ?
hMemDC HDC ?
hBufferBitmap dd ?
hFillBrush dd ?
hBackBrush dd ?
hMoveShapeBrush dd ?
hStopShapeBrush dd ?
hShapePen dd ?
CommandLine LPSTR ?
GameStatus db ? ;IS_STOP:停止 IS_START:开始 IS_PAUSE:暂停
ShapeX db ?
ShapeY db ?
SelectShape db ?
NextShape db ?
SelectKind db ?
NextKind db ?
gGrade dd ?
gLevel dd ?
dwStart dd ?
lpBuffer dd 255 dup(?)
BlockBoard dw 26 dup(?)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include menu.asm
include graphic.asm
include winproc.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SetBlockWindowSize proc
local stRectDeskTop: RECT, stRectWin: RECT, stRectClient: RECT
local dwWidth: DWORD,dwHeight: DWORD
invoke GetWindowRect, hWinMain, addr stRectWin
invoke GetClientRect, hWinMain, addr stRectClient
invoke GetDesktopWindow
mov ebx, eax
invoke GetWindowRect,ebx, addr stRectDeskTop
mov eax, stRectWin.bottom
add eax, stRectClient.top
add eax, IC_CLIENTHEIGHT
sub eax, stRectWin.top
sub eax, stRectClient.bottom
mov dwHeight, eax
mov eax, stRectWin.right
add eax, stRectClient.top
add eax, IC_CLIENTWIDTH
sub eax, stRectWin.left
sub eax, stRectClient.right
mov dwWidth, eax
mov ebx, stRectDeskTop.bottom
sub ebx, dwHeight
shr ebx, 1
mov ecx, stRectDeskTop.right
sub ecx, dwWidth
shr ecx, 1
invoke MoveWindow, hWinMain, ecx, ebx, dwWidth, dwHeight, FALSE
ret
SetBlockWindowSize endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
local @hAccelerator
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke LoadMenu,hInstance,IDM_MAIN
mov hMenu,eax
invoke LoadAccelerators,hInstance,IDA_MAIN
mov @hAccelerator,eax
;********************************************************************
; 注册窗口类
;********************************************************************
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
invoke LoadIcon,hInstance,ICO_MAIN
mov @stWndClass.hIcon,eax
mov @stWndClass.hIconSm,eax
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset WndProc
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,\
offset szClassName,offset szCaptionMain,\
IC_WINDOWSTYLE,\
100,100,400,300,\
NULL,hMenu,hInstance,NULL
mov hWinMain,eax
call SetBlockWindowSize
call InitDrawObject
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateAccelerator,hWinMain,@hAccelerator,addr @stMsg
.if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endif
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -