偷懒才能编程序——计算机达人成长之路(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://zhuyunxiang.blog.51cto.com/p_w_upload/201009/653596_1285063813.rar
Windows下俄罗斯方块程序,在Vc++6.0下编译通过,但是本处指抽取了其中的源代码文件,其他文件没有附带,所以如果读者重新编译,需要做一定的微调。
http://zhuyunxiang.blog.51cto.com/p_w_upload/201009/653596_1285063947.rar
游戏方法:方向键左,右,分别向左、右移动。方向键上,旋转方块。方向键下,向下加速。ESC退出键,退出程序。
转载于:https://blog.51cto.com/zhuyunxiang/395158
偷懒才能编程序——计算机达人成长之路(18)相关推荐
- 用C语言设计光线成像程序——计算机达人成长之路(26)
7.C语言光线成像(一)诡异的笑 世界上的很多道理,没有亲身经历过,是不会有太大感触的.比如"少壮不努力,老大徒伤悲",这句话从小时就耳熟能详,可是从小真正能理解的又有几人?大多数 ...
- 最NB的打字练习程序——计算机达人成长之路(39)
8.PASCAL语言(二)最小的打字练习程序 大一下学期,有一门课程如钻石般散发着亮光,无与伦比地吸引了大家的目光,那就是<Pascal程序设计>,该学期中唯一的一门计算机软件专业课程. ...
- 计算机达人成长之路 目录
计算机达人成长之路 木鸿飞就是芸芸众生中推动历史年轮中的微小一员而已,他不是叱诧风云的人物,没有引领时代的潮流,但却走出了自己的计算机之路. "我是为计算机而生的."木鸿飞在日记中 ...
- 计算机达人成长之路目录
计算机达人成长之路 木鸿飞就是芸芸众生中推动历史年轮中的微小一员而已,他不是叱诧风云的人物,没有引领时代的潮流,但却走出了自己的计算机之路. "我是为计算机而生的."木鸿飞在日记中 ...
- 这样学习C语言最有效(连载2)——趣味、通俗、实用的计算机达人成长之路之C语言高级技巧篇
1.2 这样学习C语言最有效 学好C语言的秘诀就是1234:"一字真言,两种态度,三个框架,四项注意". 一.一字真言 各位看官,学好C语言,其实只需一个字,那就是"编& ...
- 计算机达人成长之路 之软件分析与设计
计算机达人成长之路 之软件分析与设计 最后,必须声明的事,任何事情都有一个熟能生巧的过程,系统分析也不例外.大家是不是看了上面的分析实例忽然觉得热血沸腾,发觉原来程序分析是如此简单如此清晰的一件事情 ...
- 开学前夕——计算机达人成长之路(30)
11.激情与憧憬 木鸿飞在XT大学的日子,不只有编程,还有激情蓬勃的生活.比如当太阳肆虐着大地.大家都午休的时候,总有几个大学生模样的人,光着膀子,流淌着汗水,在篮球场上奔跑,一遍又一遍的投篮.无论何 ...
- 《计算机达人成长之路——憧憬与迷茫篇》有钱的捧个预订场,有人的捧个评价场...
<计算机达人成长之路--憧憬与迷茫篇>终于上市了,现在已经在网上预售,预售地址为: 当当网:http://product.dangdang.com/product.aspx?product ...
- 快速编程的捷径——计算机达人成长之路(40)
9.PASCAL语言(三)木氏程序分析模型 一个小小的课程设计,其实就是一个验金石,谁爱好编程.谁擅长编程一目了然.动手能力强的同学,课程设计常常做的又快又好,而且能帮助很多其他的同学.而动手能力差一 ...
- 无准备,不编程——计算机达人成长之路(15)连载
8.俄罗斯方块(三)编码 嬉闹归嬉闹,最终二人静下心来,绍绍开始请教俄罗斯方块的设计,木鸿飞也不藏拙,马上开始讲解:"游戏其实分为三重循环,也就是可以分为三个部分." " ...
最新文章
- 功能强大的打包工具 NSIS,全部用脚本搞定 使用经验总结帖(持续更新中。。。)...
- 牛客多校第六场 E Androgynos 自补图
- 超越村后端开发(3:安装djangorestframework+序列化+API开发前期准备)
- Fleury (弗罗莱) 算法通俗解释
- java启动器在bin目录_org.iipg.starter
- 最前线 | 斗鱼一季度月活用户超虎牙,但上市时间仍不明确
- python 类型转换操作
- springboot的一些小问题
- SQL Server数据库查询sql去掉小数后点后末尾的0
- Java SSM面试题
- java教程视频下载,你值得拥有
- 人类微笑表情识别(HOG算法)
- java常用的对象转map的几种方式
- 亲测有效 破解 锐捷限制校园网多网卡 win10用校内网在虚拟机里开win7
- Windows10系统如何开启和关闭隐藏的卓越性能模式
- 互联网公司干不好上门维修?
- linux 打开关闭CPU超线程和查看逻辑CPU的个数
- 华为云鲲鹏云服务器系列的规格,#化鲲为鹏,我有话说#使用华为云鲲鹏弹性云服务器部署文字识别Tesseract...
- Linux下只允许用户远程scp
- CityMaker学习教程08 一个示例,创建漫游路径
热门文章
- mysql if没用_关于MySql中使用IFNULL()函数失效的问题。
- docker server 容器连接sql_借力 Docker ,三分钟搞定 MySQL 主从复制!
- 如何更改spring源码_如何看Spring源码、Java每日六道面试分享,打卡第二天
- html单元格选中状态,UITableViewCell 设置单元格选中后只显示一个打勾的状态
- centos7.6使用Mariadb官方二进制安装
- nsupdate处理ns注意事项
- linux软件包管理rpm
- 读取和导出下载 excel 2003,2007 资料
- Ajax专题:异步交互局部刷新初步
- linux查看硬件以及系统信息