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

📄 lixner.asm

📁 本程序是我(lixner)参考《电脑爱好者》2003年第7期的《用Delphi写小游戏之华容道》
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;----------------
;编译模式="EXE"
;----------------
;本程序是我(lixner)参考《电脑爱好者》2003年第7期的《用Delphi写小游戏之华容道》,在此对原作者表示感谢!
;本程序所包含的资源文件(图片),系我从网上下载并设计制作的,只是为了代替文字,让界面更好看些,没其它的意
;思,如果有关的人不同意,我将予以删除并向您道谦!
;由于我也是初学者,所以程序中难免有不当之处,请大家谅解,并请大家指正,谢谢!
;如果你有更好的算法或者有更好的思路或好的参考资料、电子书等等,请发给我一份:lixner@126.com  谢谢!
	.386
	.model flat, stdcall
	option casemap :none

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	include		windows.inc
	include		user32.inc
	include		kernel32.inc
	include		gdi32.inc
	includelib	user32.lib
	includelib	kernel32.lib
	includelib	gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	Equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;**************	Equ 数据 **********************************
IDM_MAIN	equ		2000
IDM_EXIT	equ		2002
;**************	Equ 数据 **********************************
IDB_0		equ 		3000	

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.data?
x				db    ?	;坐标x
y				db    ?	;坐标y
oldx			db    ?	;源位置
oldy			db    ?	
newx			db		?	;新位置
newy			db    ?
myi			db		?
myj			db    ?
;>>>>>>>>>>>>>>>>>>>>>>>
hInstance	dd		?
hWinMain		dd		?
hCursor		dd		?
hMenu			dd		?
hmyDc			dd    ?
hBmpBack		dd		?
hDcBack		dd		?
;**************	数据段 ************************************
		.data
mymap       dd  03ff0102h	;02 01 ff 03
				dd 0ffffffffh	;ff ff ff ff
				dd  05ff0604h	;04 06 ff 05
				dd 0ff0809ffh	;ff 09 08 ff
				dd  00888807h	;07 88 88 00
mygood		dd  00000000h
szClassName	db	'lixner',0
good			db 'G O O D !!!',0
good1			db '      G O O D !!!',13,13,'      By lixner',13,13,'mailto: lixner@126.com',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

		.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	程序开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
		call	_WinMain
		invoke	ExitProcess,NULL
;********************************************************************
;	将窗口移动到屏幕中间
;	参数:窗口句柄
;********************************************************************
_CenterWindow	proc	hWnd:DWORD
		local	@stRectDeskTop:RECT,@stRectWin:RECT
		local	@dwWidth:DWORD,@dwHeight:DWORD

		invoke	GetWindowRect,hWnd,addr @stRectWin
		invoke	GetDesktopWindow
		mov	ebx,eax
		invoke	GetWindowRect,ebx,addr @stRectDeskTop

		mov	eax,@stRectWin.bottom
		sub	eax,@stRectWin.top
		mov	@dwHeight,eax
		mov	eax,@stRectWin.right
		sub	eax,@stRectWin.left
		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,hWnd,ecx,ebx,@dwWidth,@dwHeight,FALSE
		ret

_CenterWindow	endp


;********************************************************************

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	主窗口程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain	proc
		local	@stWcMain:WNDCLASSEX
		local	@stMsg:MSG

		invoke	GetModuleHandle,NULL		;模块句柄
		mov	hInstance,eax
		invoke	LoadMenu,hInstance,IDM_MAIN	;加载菜单
		invoke	GetSubMenu,eax,0	;PopUp 菜单要用到子菜单
		mov	hMenu,eax
		invoke MessageBox,0,offset good1,offset good,0 
;*************** 注册窗口类 *****************************************
		invoke	LoadCursor,0,IDC_ARROW
		mov	@stWcMain.hCursor,eax
		mov	@stWcMain.cbSize,sizeof WNDCLASSEX
		mov	@stWcMain.hIconSm,0
		mov	@stWcMain.style,CS_HREDRAW or CS_VREDRAW
		mov	@stWcMain.lpfnWndProc,offset WndMainProc
		mov	@stWcMain.cbClsExtra,0
		mov	@stWcMain.cbWndExtra,0
		mov	eax,hInstance
		mov	@stWcMain.hInstance,eax
		mov	@stWcMain.hIcon,0
		mov	@stWcMain.hbrBackground,COLOR_WINDOW + 1
		mov	@stWcMain.lpszClassName,offset szClassName
		mov	@stWcMain.lpszMenuName,0
		invoke	RegisterClassEx,addr @stWcMain
;***************** 建立输出窗口	*****************************************
;	属性:没有标题栏,不显示在任务栏
;********************************************************************
		invoke	CreateWindowEx,WS_EX_TOOLWINDOW,\
			offset szClassName,NULL,\
			WS_POPUP or WS_SYSMENU,\
			0,0,230,280,\
			NULL,NULL,hInstance,NULL

		invoke	ShowWindow,hWinMain,SW_SHOWNORMAL
		invoke	UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
		.while	TRUE
			invoke	GetMessage,addr @stMsg,NULL,0,0
			.break	.if eax	== 0
			invoke	TranslateMessage,addr @stMsg
			invoke	DispatchMessage,addr @stMsg
		.endw
		ret

_WinMain	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndMainProc	proc	uses ebx edi esi, \
		hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
		local	@stPos:POINT
		local	@stPs:PAINTSTRUCT,@hDC:DWORD
		LOCAL ps :PAINTSTRUCT

		mov	eax,uMsg
		.if	eax ==	WM_CREATE
			mov	eax,hWnd
			mov	hWinMain,eax
			call	_Init
;********************************************************************
		.elseif	eax == WM_PAINT 
			invoke	BeginPaint,hWnd,addr @stPs
			mov	@hDC,eax

			mov	eax,@stPs.rcPaint.right
			sub	eax,@stPs.rcPaint.left
			mov	ecx,@stPs.rcPaint.bottom
			sub	ecx,@stPs.rcPaint.top

			invoke	BitBlt,@hDC,@stPs.rcPaint.left,@stPs.rcPaint.top,eax,ecx,\
				hDcBack,200,@stPs.rcPaint.top,SRCCOPY

			invoke	EndPaint,hWnd,addr @stPs

						invoke      GetDC,hWnd 
			mov	hmyDc,eax

			call  _paint

		invoke	ReleaseDC,hWinMain,hWnd 

;********************************************************************
;	由于没有菜单,下面代码用于按下右键时弹出POPUP菜单
;********************************************************************
		.elseif eax == WM_RBUTTONDOWN
		   .if wParam == MK_RBUTTON
			invoke	GetCursorPos,addr @stPos
			invoke	TrackPopupMenu,hMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
		   .endif
;********************************************************************
;	由于没有标题栏,下面代码用于按下左键时移动窗口
;********************************************************************
		.elseif eax == WM_LBUTTONDOWN
			mov	eax,lParam
			movzx	ecx,ax		; x
			shr	eax,16		; y
			.if  eax<15d
				invoke	UpdateWindow,hWnd		;即时刷新
				invoke	ReleaseCapture
				invoke	SendMessage,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,0
			.elseif  eax>15d  &&  ecx>15d
				sub   eax,15d
				sub   ecx,15d
				mov   bl,50d
				div   bl
				mov   x,al
				mov   eax,ecx
				div   bl
				mov   y,al
				add   al,x
				cmp   al,7h
				ja    down
				call  _formmousedown
			.endif
		down:	
;********************************************************************
		.elseif eax == WM_LBUTTONUP
			mov	eax,lParam
			movzx	ecx,ax		; x
			shr	eax,16		; y
			.if   eax>15d  &&  ecx>15d
				sub   eax,15d
				sub   ecx,15d
				mov   bl,50d
				div   bl
				mov   newx,al
				mov   eax,ecx
				div   bl
				mov   newy,al
				add   al,newx
				cmp   al,7h
				ja    UP
				call  _formmouseup
			.endif	
			UP:
		invoke	SendMessage,hWinMain,WM_PAINT,0,offset szClassName
		mov ebx,03h
		mov ecx,01h
	.if BYTE ptr [mymap+ebx*4+ecx]==01h

		invoke MessageBox,0,offset good1,offset good,0 
	.endif

;********************************************************************
		.elseif	eax ==	WM_COMMAND
		   .if	lParam == 0
				mov	eax,wParam
				.if	ax == IDM_EXIT
					call	_Quit
				.endif
		   .endif
;********************************************************************
		.elseif	eax ==	WM_CLOSE
			call	_Quit
;********************************************************************
		.else
			invoke	DefWindowProc,hWnd,uMsg,wParam,lParam
			ret
		.endif
;********************************************************************
;	注意:WndProc 处理 Windows 消息后,必须在 Eax 中返回 0
;	但是由 DefWindowProc 处理后的返回值不能改变,否则窗口
;	将无法显示!
;********************************************************************
		xor	eax,eax

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -