仙人指路的编程乐园
留言簿 主人介绍 返回主页
Windows驱动 毕设 电子电路 电脑 PE外壳 心情 Windows应用程序 随笔 Web技术 加密算法 古老的DOS编程 杂项
Win32汇编写的俄罗斯方块小程序(源码)
类别: Windows应用程序  上传时间: 2009-12-31 16:32:29  浏览(457)  留言(3) 
附件: 俄罗斯方块.rar
摘要: 关键字:win32,asm,汇编,游戏,俄罗斯方块,源码,源代码,source code,masm32,罗云彬,《Windows环境下32位汇编语言程序设计》,课程设计,o(∩_∩)o...

这是当年看了罗云彬《Windows环境下32位汇编语言程序设计》之后写的,程序使用命令行编译,需要先安装masm32,这个网上到处都有下载,罗云彬的网站上也有,我那时候用的是masm32v8,现在的版本应该更新了。

 

在环境变量中配置好masm32的路径之后,进入程序目录,在命令行中执行以下命令就编译出来了:

 

ML /c /coff /Cp main.asm

Link /subsystem:windows main.obj els.res

 

写这个程序的时候我就把这两行写了个批处理文件,改好了就运行一下,貌似比RADASM也不逊色。els.res这个资源文件是用vc6搞出来的,data.incmain.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, 手机: 15011465342QQ 28287492,有兴趣请联系。有发财的机会也请联系(窃笑中… ^_^)

 

上一篇: DOS下的SVGA编程  下一篇: 加壳时把资源节(段)移位


留言
2010-5-30 13:57:37
请问一下,为什么在Masm中直接运行时,有一点点问题呢?下落的方块不显示,还是我哪里弄错了?
-- 汇编白痴
莫非没有把资源链接进去?方块图像在资源中。另外有可能没有按回车键开始
-- 主人回复
2010-1-29 20:16:16
( ^_^ )不错嘛
-- 行者无疆
愚兄,你终于来了,贤弟等候你多时了
-- 主人回复
2010-1-4 9:46:25
看到了,呵呵,真好
-- 侠之仁者
 
查看全部留言



Copyright © 2009 BY MISSSIR,网站版权所有。 京ICP备09095257号

花褪残红青青杏小。燕子飞时,绿水人家绕。枝上柳绵吹又少。天涯何处无芳草。
墙里秋千墙外道。墙外行人,墙里佳人笑。笑渐不闻声渐悄。多情总被无情恼。

今年访问量 24287  今月访问量 847  今日访问量 25 

关于 您的地址
您的大名 您的邮箱
QQ/MSN/Tel 是否保密
留言内容