标题:[原创]我写的一个小游戏,大伙帮测一下.
只看楼主
lixner
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-10-7
 问题点数:0 回复次数:4 
[原创]我写的一个小游戏,大伙帮测一下.

VJUugeko.rar (393.9 KB) [原创]我写的一个小游戏,大伙帮测一下.


;----------------
;编译模式="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,10,13,10,' By lixner',13,10,13,10
db'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
ret

WndMainProc endp
_Init proc
local @hDC
invoke SendMessage,hWinMain,WM_SETTEXT,0,offset szClassName
invoke LoadBitmap,hInstance,IDB_0 ;装入背景图片
mov hBmpBack,eax
invoke GetDC,hWinMain
mov @hDC,eax
invoke CreateCompatibleDC,@hDC ;建立背景及数字 DC
mov hDcBack,eax
invoke ReleaseDC,hWinMain,@hDC
invoke SelectObject,hDcBack,hBmpBack
invoke _CenterWindow,hWinMain
invoke SetWindowPos,hWinMain,HWND_TOPMOST,0,0,0,0,\
SWP_NOMOVE or SWP_NOSIZE

ret
_Init endp

;********************************************************************
_Quit proc
local @stWindow:RECT

invoke DestroyMenu,hMenu
invoke DeleteDC,hDcBack
invoke DeleteObject,hBmpBack
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL

ret

_Quit endp


未完


[此贴子已经被作者于2006-10-15 18:59:26编辑过]

搜索更多相关主题的帖子: 小游戏 电子书 电脑爱好者 原作者 华容道 
2006-10-15 17:57
lixner
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-10-7
得分:0 

完整的在压缩包中.

2006-10-15 18:00
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
得分:0 

很好啊!没想到汇编语言还能编出这么好的程序,真是让我很佩服也很羡慕,什么时间也能象你一样编出这么"躁"的程序来!


♂ 死后定当长眠,生前何须久睡。♀
2006-11-26 01:22
cjyenglish
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-11-26
得分:0 

挺不错的
但是怎么也通关不了……
郁闷

2006-11-26 13:41
zhuiedu
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-11-27
得分:0 

不知道你这个游戏那里出错了,把小的模块从大的模块左上角迅速拖到大模块上小的模块就消失了。
你自己可以试下。呵呵。。。愿交编程爱好者QQ:16844352

2006-11-29 04:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-96525-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019329 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved