⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blockgame.asm

📁 用汇编做的俄罗斯方块游戏
💻 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 + -