庆中秋:用Windows XP桌面图标玩贪吃蛇(原理)
redraiment, 2009-10-04
到处都有好玩的玩意儿
计算机的世界里离散的:内存从 0 -> 2n 编号;整个屏幕的画面也是由许多颗像素点组成……如果你不介意的话,把脸尽量地贴近显示器(或者电视屏幕),你会看到整个屏幕是由一颗颗显示不同颜色的小颗粒拼成的。如果这样感受还不深,那你还记得小时候玩过的最初型掌上游戏机吗?如下图:
其中经典的飞机、坦克、俄罗斯方块等都是由一个个正方形的黑色方块拼成的。
放眼周边的世界,到处都有这样规则排列的、方方正正的“游戏元素”:摩天大楼的窗户、大教堂的座位、从楼上往下看的人群……当然还有今天要介绍的桌面图标!在优库上一搜索就会出现很多结果,有用寝室楼电灯玩贪吃蛇的、也有军训时集体玩 AK47 阵列的等等,原理都是这样~
在看完这篇文章后,你也可以尝试照样画葫芦,比如开启很多个“记事本”,将他们的窗口调整成四四方方的,然后用它们玩俄罗斯方块。^_^
程序原理
我在优库上发布了视频——用Windows XP桌面图标玩贪吃蛇(视频地址为 http://v.youku.com/v_show/id_XMTIyODk2Njky.html),一些朋友在评论中猜测程序原理:有人说是用批处理,还有人说是用汇编,甚至有人直接否定说是我用静态帧拼接起来的,呵呵。其实没大家想的这么复杂,我的程序主要是用 VB 开发的(为方便以后使用,移动桌面图标的代码用 C 语言写,并打包成 DLL 文件。程序的核心语句就是下面这句话:
SendMessage ( hwnd, LVM_SETITEMPOSITION, i, MAKELPARAM(x,y) );
SendMessage 是系统调用,可以向指定的窗口发送消息。整条语句的作用是向桌面发送消息,请求将第“i”个图标移动到坐标“x,y”位置。下面按照视频里播放的顺序依次介绍原理:
一、创建文件
在视频的最开始,我开启了一个命令提示符执行一条命令。可能正是因为这个原因让大家误以为这个程序是用批处理写的。如果你看了我上次的高清AVI版视频,就知道我命令是:“for /l %d in (1,1,16) do echo. >%d.txt”。正如网友“Sypeace”在评论了说的,这条命令的作用就是在桌面创建十六个文本文档来作为贪吃蛇的身体。只要你不怕麻烦当然可以通过右键新建文本文档然后重命名,这只是我的个人习惯,呵呵。
二、启动游戏
文件创建好了,我双击桌面那个蛇形的图标,就是本程序“桌面贪吃蛇”启动游戏。这时候桌面只剩下三个图标,有两个在左下角,代表贪吃蛇;另一个随机出现,就是食物;其他图标都被移出屏幕,具体坐标为(0, -100),只有当食物被吃掉后下一个才出现。
眼尖的朋友可能发现了屏幕的右上角有个白色小框,其实这就是本程序的界面,里面显示了剩余食物的个数。当然这里还包含了另一个秘密,在下一节揭晓!
三、控制方向
贪吃蛇每隔 200 毫秒前进一格,期间还得接受键盘的方向输入。如果你用 C 语言从零开始实现,这固然可行但很繁琐。在 VB 中不用考虑这么多,把贪吃蛇移动的代码加到一个定时器里即可(这也是我选用 VB 的原因);然后监听窗口 Form 的键盘输入,改变贪吃蛇的前进方向。
也许你发现了,其实键盘输入应该用系统钩子来捕获更合理,这样即使焦点离开了主程序也依然可用。这正是此程序现在最大的缺点,如果你不小心在运行的时候将鼠标点了一下桌面,焦点离开了主程序,就会发现贪吃蛇不再受控制。这一切都因为1. 我怕麻烦,2. 想快速开发。但也许你可以来帮我完善它!
四、老板来了
这是个无伤大雅的玩笑。视频播放到最后,你会看到桌面背景变成一个警告:“危险,危险!!老板来了!!”。然后我按键盘上的“Q”退出游戏后背景恢复。刷新一下,图标排列整齐。这样桌面就恢复原样,也许老板不晓得你摆弄桌面图标是在玩游戏^_^。
初衷
最近很流行说“寂寞”,身边的同学也动不动就冒出一句“哥读的不是书,是寂寞”,很烎很囧哈 ^_^。其实,身为光棍的我情感并没大家想的那么丰富,就像我之前在迷你博客里说的“为什么写这些小玩意儿?Because we can~”。
关于源码
本程序的源码是开发的,欢迎你参与完善。有朋友反映没找到源码,因为我只给了我 Google Sites 的主页地址。是我说的不够详细,这个程序在“天晴”版块,顺便介绍一下“天晴”这个版块放的都是和游戏相关的程序。该程序的链接地址是:http://sites.google.com/site/redraiment/sunshine/snake/。进入后下载 Snake_with_src.zip 这个文件就可以了。
评论
发表评论