这是当年看了罗云彬《Windows环境下32位汇编语言程序设计》之后写的,程序使用命令行编译,需要先安装masm32,这个网上到处都有下载,罗云彬的网站上也有,我那时候用的是masm32v8,现在的版本应该更新了。
在环境变量中配置好masm32的路径之后,进入程序目录,在命令行中执行以下命令就编译出来了:
ML /c /coff /Cp main.asm
Link /subsystem:windows main.obj els.res
写这个程序的时候我就把这两行写了个批处理文件,改好了就运行一下,貌似比RADASM也不逊色。els.res这个资源文件是用vc6搞出来的,data.inc和main.asm是在EditPlus中写的,如果下载可asm的语法文件,EditPlus还可以给asm文件着色。程序就像下面这样:

按Enter键开始新游戏,按左右箭头控制方块方向,上箭头变换,下箭头加速,空格键暂停。当年写的时候可谨慎了,也没听说过OllyDbg,也不知道OutputDebugString,全靠MessageBox弹出调试信息,挺傻的,现在我就要推荐OllyDbg这个一个顶一万个的工具,推荐完了,再贴一部分我的代码吧:
;--------------------------------------
; 方块左移
;--------------------------------------
_Xleft proc
local i
local x, y ;将要左移的位置
local CanMove ;是否可以左移
;循环判断4个方块都能不能左移
mov CanMove, TRUE
mov esi, offset Dots
mov i, 0
.while i < 4
mov ebx, [esi] ;行
add esi, 4
mov ecx, [esi] ;列
dec ecx ;左移动一格
add esi, 4
.if ecx > 9 ;如果移到外面了
;ecx是无符号数,当它=0时再减1得到一个很大的数,肯定>9
;invoke MessageBox, NULL, addr DgMsg, addr DgCaption, MB_OK
mov CanMove, FALSE
.break
.endif
invoke _GetMapChar, ebx, ecx
.if al == 'Q'
mov CanMove, FALSE
.break
.endif
inc i
.endw
;每个方格的列位置减1
.if CanMove
dec CookyLeft ;方块左上角的位置加1
mov esi, offset Dots
add esi, 4
mov i, 0
.while i < 4
dec dword ptr [esi]
add esi, 8
inc i
.endw
invoke _DrawView
invoke InvalidateRect, HMainWnd, NULL, FALSE
mov eax, TRUE
.else
mov eax, FALSE
.endif
ret
_Xleft endp
;--------------------------------------
; 方块右移
;--------------------------------------
_Xright proc
local i
local x, y ;将要左移的位置
local CanMove ;是否可以右移
;循环判断4个方块都能不能左移
mov CanMove, TRUE
mov esi, offset Dots
mov i, 0
.while i < 4
mov ebx, [esi] ;行
add esi, 4
mov ecx, [esi] ;列
inc ecx ;右移动一格
add esi, 4
.if ecx > 9 ;如果移到外面了
;invoke MessageBox, NULL, addr DgMsg, addr DgCaption, MB_OK
mov CanMove, FALSE
.break
.endif
invoke _GetMapChar, ebx, ecx
.if al == 'Q'
mov CanMove, FALSE
.break
.endif
inc i
.endw
;每个方格的列位置加1
.if CanMove
inc CookyLeft ;方块左上角的位置加1
mov esi, offset Dots
add esi, 4
mov i, 0
.while i < 4
inc dword ptr [esi]
add esi, 8
inc i
.endw
invoke _DrawView
invoke InvalidateRect, HMainWnd, NULL, FALSE
mov eax, TRUE
.else
mov eax, FALSE
.endif
ret
_Xright endp
这个俄罗斯方块程序是根据2004年同学李振云的vc++毕业设计改写的,如果要问编程思想,直接找他好了,他现在也和我一样,一直编程呢。
作者: 仙人指路, QQ: 13633292, 手机: 15011465342,QQ群 28287492,有兴趣请联系。有发财的机会也请联系(窃笑中… ^_^)