偷懒才能编程序——计算机达人成长之路(18)

11、俄罗斯方块(六)简洁

好景不长,没有挑战性的游戏只能暂时吸引眼球,却不能留住客户。大家稍稍接触,YY完毕之后,纷纷回到现实,给木鸿飞写下一个“继续编完整的俄罗斯方块,我看好你”的留言,然后各回各位。

不是木鸿飞不想完成完整的俄罗斯方块,而是力不能及。前面讲过,木鸿飞设计的代码有2千多行,而此处只有400行就完成了基本的功能,那么多余的1600行是什么内容呢?其实木鸿飞的设计思路存在问题,他为每一种俄罗斯方块都设计了一套单独的代码,比如单独针对长条形方块的纵向形态,涉及的函数有:

“纵向长条形方块左移”、

“纵向长条形方块右移”、

“纵向长条形方块旋转”、

“纵向长条形方块下落”、

“纵向长条形方块下落到底,赋值到二维数组中”

等等一套多个函数,那么所有7种俄罗斯方块共19种形态,就共有19套接近80个函数,如此之多的函数牵涉到太多的代码,不是一个打字新手所能及时输入的。

程序设计必须修改,否则完整的俄罗斯方块将与木鸿飞无缘。

想睡觉就有人送枕头,这一次送枕头的是鸭子。

鸭子此人成绩不好,爱好是懒惰,凡事均喜欢走捷径。的确有时需要捷径,但是很多捷径都是在勤奋之下才踩出来的,没有勤奋就无所谓捷径,书山有路勤为径就是这个道理。

第二天就要物理小考了,鸭子满面愁容:“头晕死了,明天就要考物理,公式还没有背熟。”

“不是吧,物理课的公式很少的,这都记不住,那数学公式怎么办?”木鸿飞表示反对。

“你是高材生,当然记的!我是差等生,肯定记不住。”鸭子无不痛心的说。

“你说说你到底哪里记不住若。”木鸿飞问道。

“主要是公式太多太复杂,要是只有一个万能公式该多好啊,我们就不要这么辛苦的背诵了。”鸭子看看了木鸿飞不相信的脸,说:“你别不信,还真有可能,我证明给你看。我问你,万有引力的计算公式是什么?”

“万有引力常数G乘以两个物体的质量再除以距离的平方。”虽然木鸿飞很疑惑,但还是回答了。

“好,那么库仑定律中两个电荷之间的作用力公式是什么?”鸭子继续发问。

“库仑常数F乘以两个电荷的电量再除以距离的平方。”木鸿飞继续疑惑的回答,这次他把两个公式都写到了纸上:

 

 

“你难道不觉得则两个公式长的一模一样,简直就是双胞胎吗?既然如此,为什么要搞一个万有引力公式,一个库仑定律公式,直接合一不就得了!”鸭子得意的问答。

“这是因为,因为两个定律使用的范围不一致,一个宏观,一个微观,如果把它们合一,如果把它们合一,那么,嗯,可能,也许会,大概,……”木鸿飞真正绞尽脑汁的反驳,突然他神色一震,迅速的站了起来,拍着鸭子说道:“天才!你真是一个天才!我知道怎么做了!他们应该合一!”

“什么?”鸭子被木鸿飞的动作吓了一跳,“你没事吧?”

“没事,我清醒的很。你刚才对我醍醐灌顶,使我茅塞顿开,解决了长期困扰我的难题!没想到啊没想到,你居然是个天才,能够提出如此天才的想法,高,实在是高!”木鸿飞仍然处于兴奋当中。

“别,我是为了偷懒而乱说的,你可别当真。”鸭子连忙摆手,“坏了你物理的大好前程我可负责不起。”

“物理?才不是呢,不跟你说了,我去应用你天才的思想去了!”说完木鸿飞急忙回到了座位。

木鸿飞没有发疯,鸭子的确是一语惊破梦中人,不过不是物理,而是计算机编程。俄罗斯方块中虽然有各式各样的方块,但为什么要将之分别独立设计呢,观察每种方块的处理函数,从流程到代码均有90%以上的相似性,既然如此,为什么不将之整合到一起呢。比如设计一个通用的函数完成所有方块的左、右移动,设计一个统一的函数完成所有方块的下落处理等等。

说干就干,木鸿飞再度翻开曾被翻开无数遍的笔记本,重新研究起代码来,经过对比和归纳,他对俄罗斯方块重新建模,增加一个4×4的二维数组代表下落的方块,此数组的不同取值,代表了不同类型的方块。再针对这个二维数组进行统一的左移、右移、旋转、下落一行和下落到底等操作。这样,经过代码的归纳和总结,程序最终仅接近400行代码,与仅有一个长条形方块的程序九代码长度相当。

每每回忆自己的这一次编程大冒险,木鸿飞总是感触颇深。大家都说勤奋比懒惰好,但是老天似乎在这里开了一个大大的玩笑,勤奋设计全部19种变化形态的代码不能成功,而偷懒的只设计一种通用公式的代码反而立即成功了,难道真的是“懒惰使人进步”,人类真的因为懒于走路而发明了汽车,真的因为懒于计算而发明了电脑?既然如此,我们何必再学十年寒窗,直接懒惰即可。

事实并非如此,为了实现这一次的懒惰,人们可能需要上百次的勤奋。木鸿飞正是进行了2000行的代码设计,才具备将之压缩到400行的能力。正是对每个特殊方块都做了深刻的分析,才能将之归纳为一个统一的模型。其实这在计算机编程中是一种简洁化原则,即尽可能的减少一些无用的罗嗦的代码,归纳一些相似的代码。

最终,木鸿飞赶在计算机课结束前的几周内完成了只拥有7种基本方块形态的标准俄罗斯方块和拥有众多奇形怪状方块形态的扩展俄罗斯方块,同学们在上机时都疯玩起来,杨老师也以帮助程序调优为由复制了一份拷贝。

上一篇   目录  下一篇

ps1:至此中秋佳节到来之际,祝各位读者身体健康,阖家幸福,万事如意,同时奉上俄罗斯方块游戏源码和可执行程序两份,以报答广大读者长期以来对本人的厚爱。

DOS下的俄罗斯方块程序,Borland C++ 3.1 For Dos下编译通过。由于我做了图像安装处理,如果你们重新编译请删除:registerbgidriver(EGAVGA_driver);。

http://img1.51cto.com/attachment/201009/653596_1285063813.rar

Windows下俄罗斯方块程序,在Vc++6.0下编译通过,但是本处指抽取了其中的源代码文件,其他文件没有附带,所以如果读者重新编译,需要做一定的微调。

http://zhuyunxiang.blog.51cto.com/attachment/201009/653596_1285063947.rar

 游戏方法:方向键左,右,分别向左、右移动。方向键上,旋转方块。方向键下,向下加速。ESC退出键,退出程序。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 37
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱云翔老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值