设计程序要简单——计算机达人成长之路(17)

简介:

10、俄罗斯方块(五)模块

他山之石,可以攻玉。

木鸿飞兴趣广泛,除了英语,各门功课都很爱好,参加了数学、物理、化学和生物的奥林匹克竞赛,当时的D县信息技术相当闭塞,要不肯定还会参加计算机奥赛。

编写俄罗斯方块陷入困境的第二天晚自习,木鸿飞参加数学奥赛的培训。授课老师姓李名锐,人称锐哥,华中师范大学高材生,据说受到89年事件的牵连,回到了在中国地图上都不一定标记的D县任教。锐哥授课,最爱说“我们”,比如:

“我们假设圆半径长度为a……

“让我们设立一个极坐标系,……

“我们一起来审题,……

每次锐哥如此培训,导弹都会窃窃私语:

“什么我们,明明是你自己!”

“你自己假设a=b,别拖上我们。”

“简直就是强奸民意!”

锐哥并不知道导弹的腹议,仍然兴致勃勃的使用我们:“今天我们来学习简单化原则。所谓简单化原则就是我们在做数学题时可以化普通条件为特殊条件,比如题设中是一个长方形,要求证明某项规则,我们可以假设这个长方形是一个正方形,然后根据正方形来证明。我们想想,正方形是长方形的特殊形式,长方形都正确,正方行肯定也是正确的,然后我们再根据思路逐步扩充到长方形的证明中。这就是简单化原则,即先把一个问题想简单,然后逐步复杂,直到回到问题本身,……

导弹正在数锐哥一句话中有多少个“我们”,木鸿飞本来也在自动忽略“我们”二字,突然犹如一道电光闪过,木鸿飞猛地一惊,自言自语道:“简单化原则,简单化原则,……,我知道了!”

多年以后,木鸿飞回忆秋季夜晚的那一次顿悟,那情那景仍然历历在目。

“简单化原则,简单化原则,为什么不应用到程序设计中去!将程序将程序划分为多个简单的步骤,每次只设计一个步骤,完成后再增加设计下一个步骤,每个步骤相对于整个程序而言简单多了。比如整个俄罗斯方块具有显示大棋盘、显示小方块、移动小方块、旋转小方块、消行处理等等多种复杂的功能要求。但若简单化之,可以先编写一个简化的俄罗斯方块程序,只显示大棋盘,即把建模棋盘的二维数组的信息显示到屏幕上。然后再设计一个程序,只显示小方块,接着在上面的程序中增加方块左右移动的功能,以此类推,直至实现全部的游戏。这就是退一步海阔天空,有时后退是为了更好的前进!”

闪电划过夜空,余下的就是无穷无尽的思考。木鸿飞陷入了使用新型思维对俄罗斯方块的设计之中,他时而皱眉沉思,时而洋溢笑容,锐哥的讲课自然一句也没有听见。不知道锐哥有没有发现木鸿飞同学走神了,也许锐哥误以为木鸿飞的表情是对其课堂最好的互动,也许锐哥老师对走神的学生已经见怪不怪。

时至今日,木鸿飞对这次走神事件仍然无怨无悔。因为不知不觉中,木鸿飞已经触及了模块化设计思想的门槛,他所需做的就是通过及时的训练来强化这种感觉。也许木鸿飞并不知道,从一无所知两眼一摸黑的设计方式到模块化设计方式,是多么大的一次飞跃,也许木鸿飞要等到下一次设计碰上困难时才回想起模块化设计,但这一切都是前进途中的坎坷罢了。无论如何,一粒种子已经种下,等待合适的条件,这颗种子会生根发芽,待到木鸿飞正式学习计算机之时,掌握模块化设计思想就只是水到渠成之事。

奥数培训结束,木鸿飞第一个冲出了教室,回到自己的座位上,拿出了写满俄罗斯方块代码的笔记本。曾经这本代码使他伤心欲绝,长长的代码行数和低下的打字速度扼杀了一个美好的梦想,而今再度翻开这本洒满心血的笔记本,希望之花再度开放。

木鸿飞没有多做任何停留,直接在笔记本上写下:

我决定应用简单化原则重新设计俄罗斯方块。首先,由于俄罗斯方块中一共有7中基本方块,每种均可以旋转,所有的变体一共有19中形态。鉴于应用简单化原则,目前假设只有长条形方块,则只有长条形横向和纵向两种形状,其他的方块待程序完成后再逐步增加。

其次,一次性设计完整的俄罗斯方块过于复杂,我将它分解为很多个小程序,每次完成一个,最后叠加起来就是符合要求的程序了。分拆方法如下:

程序一:

名称:大棋盘显示程序。

内容:根据二维数组的内容显示俄罗斯方块的20×10的棋盘。

注意事项:可以先定义一个二维数组,然后手工更改数组中各元素的取值,看看显示的内容与二维数组各元素取值是否相一致。

程序二:

名称:俄罗斯方块显示程序。

内容:在棋盘内显示俄罗斯方块。

注意事项:目前只显示长条形方块。

程序三:

名称:俄罗斯方块左右移动程序。

内容:完成内循环,根据输入的命令左右移动俄罗斯方块,越界时不能移动。

注意事项:先将二维数组元素全置为0,测试棋盘全空时的移动。再手工更改二维数组的内容,在棋盘内堆砌一些方块,如果有方块在左边时,则不能左移,同理不能右移。

程序四:俄罗斯方块旋转程序。

内容:与程序三相同,当输入旋转命令时旋转俄罗斯方块,其中需要进行越界判断。

注意事项:与程序三相同,先测试棋盘空时的旋转,再手工添加方块,测试有阻塞时的旋转。

程序五:

名称:俄罗斯方块定时下落程序

内容:完成中循环,俄罗斯方块定时下落,直到落到底部或者下方有方块支撑。

注意事项:先将二维数组元素全置为0,测试棋盘全空时的下落。再手工更改二维数组的内容,测试棋盘有方块时的下落,如果下方有方块则下落结束,中循环中断。

程序六:

名称:俄罗斯方块下落后堆积程序

内容:集合上述所有程序,即内循环中可以移动和旋转方块,内循环结束后方块下落,此时将俄罗斯方块的内容赋值到二维数组相应的位置,形成在棋盘上永久留下方块的效果。

注意事项:先测试棋盘空时的效果,再测试有方块时的效果。

程序七:

名称:随机产生俄罗斯方块程序

内容:设计外循环,内部调用程序六的内容,每个外循环随机产生一个俄罗斯方块,并置放与棋盘中间上方,如果方块置放位置已经有小方块阻塞,则退出循环,程序结束。

注意事项:本程序中俄罗斯方块已经初具模型,只是不具备消行功能,可以试玩了。

程序八:

名称:俄罗斯方块消行处理。

内容:在程序七的基础上增加消行操作。

注意事项:由于本程序已经具备试玩功能,故可通过试玩,无需手工修改二维数组,即可获得测试数据。

程序九:

名称:俄罗斯方块优化和补齐。

内容:补齐所有欠缺的游戏功能。

注意事项:欠缺的功能至少有:分数设计、速度等级设计、预先显示方块设计等等。

…………

简化程序后,果然容易了很多,代码也急剧减少,即使完成程序九,也没有超过400行。同时,木鸿飞更加充分地利用上机时间,一去就是两节课,反正下一节课本班自习,自己又不是玩耍,不翘它白不翘。

四周后,史上最奇特的俄罗斯方块新鲜出炉。相信俄罗斯方块的玩家都有一个愿望,那就是希望多来长条形方块以救命之用,而木鸿飞的俄罗斯方块程序安全满足你的这个愿望,它只落长条形方块。如此俄罗斯方块实在是太简单了,一时间,吸引了不少同学过来游玩,连杨老师也以检测程序是否正确为由狠狠的玩了几把,看着不住增长的分数,大家在YY之中过足了俄罗斯方块高手的瘾。






 本文转自 zhuyunxiang 51CTO博客,原文链接:http://blog.51cto.com/zhuyunxiang/395155,如需转载请自行联系原作者


相关文章
|
1月前
|
存储 Linux 编译器
Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣
Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣
50 0
|
7月前
|
网络协议 NoSQL Java
终于有阿里大牛把困扰我多年的计算机组成原理:网络通信讲明白了
终于有阿里大牛把困扰我多年的计算机组成原理:网络通信讲明白了,今天就把这块儿的视频内容分享给大家学习,总共有70P,希望大家能够喜欢,下面我就给大家介绍包含的主要内容是什么?
|
人工智能 算法 架构师
计算机学习路线规划,和我一同打开计算机学习的大门吧!
计算机学习路线规划,和我一同打开计算机学习的大门吧!
149 0
计算机学习路线规划,和我一同打开计算机学习的大门吧!
|
IDE 前端开发 JavaScript
聊一聊我的计算机学习经历吧(四)
hey guys ,我是 cxuan,这一篇文章我就要和你聊聊编程如何学习,这一篇文章涉及的内容简直太多了,我将从入门开始,一步一步到如何提高,然后到一些学习的相关问题,还有一些计算机相关的术语等,干货也非常多,准备好了吗?那么我们开始吧。
|
算法 前端开发 JavaScript
聊一聊我的计算机学习经历吧(一)
hey guys ,我是 cxuan,这一篇文章我就要和你聊聊编程如何学习,这一篇文章涉及的内容简直太多了,我将从入门开始,一步一步到如何提高,然后到一些学习的相关问题,还有一些计算机相关的术语等,干货也非常多,准备好了吗?那么我们开始吧。
聊一聊我的计算机学习经历吧(一)
|
算法 前端开发 Java
聊一聊我的计算机学习经历吧(二)
hey guys ,我是 cxuan,这一篇文章我就要和你聊聊编程如何学习,这一篇文章涉及的内容简直太多了,我将从入门开始,一步一步到如何提高,然后到一些学习的相关问题,还有一些计算机相关的术语等,干货也非常多,准备好了吗?那么我们开始吧。
|
移动开发 前端开发 JavaScript
聊一聊我的计算机学习经历吧(三)
hey guys ,我是 cxuan,这一篇文章我就要和你聊聊编程如何学习,这一篇文章涉及的内容简直太多了,我将从入门开始,一步一步到如何提高,然后到一些学习的相关问题,还有一些计算机相关的术语等,干货也非常多,准备好了吗?那么我们开始吧。