Programming 版 (精华区)
发信人: reise (旅行), 信区: Programming
标 题: 编《扫雷》的故事
发信站: 哈工大紫丁香 (2003年09月01日18:50:37 星期一), 站内信件
编程是件难事,更是件乐事。如何将这其中的“难”破解成“乐”,确实是个值得
研究一番的问题。
区区一个《扫雷》游戏,模仿别人已写好的东东,这样的程序,我写了两年多,总
算完工了。如果自诩为程序员的话,确实觉得自己太笨。在学习编程的路上,慢慢
地欣赏着风景慢慢地走,体会一下其中的难与乐,从另一个角度来想也是一件好事。
1、呆板的扫雷,差点笑掉了弟弟的大牙
当我将8*8格的扫雷拿给小弟玩的时候,惹来了小弟一阵大笑,谁会来玩这笨拙不
堪的玩意呢?象我在看完别人写好的美文后,自己又根据人家的意思东施效颦般搞
出来一篇一样,这样的东东确实没有什么创意。不过从另一个角度来想,作文其实
还是有大量的训练和阅读做为前提,俗语说的好:“读书破万卷,下笔如有神”。
编程的过程中,我们就不能先写几个蹩脚的程序吗?
在学会了计算机语言的语法常识后,对于编程素材的选择变得异常重要,太难的题
目不会编,太简单的题目不屑编,为了克服掉这一点,那最好的办法是找一些我们
最熟悉的题目来动手了。小游戏无疑是其中最好的选择。
2001年1月,由于年关临近,在蜜月里和老婆在家玩游戏的过程中,一个赌才赌出
了这个扫雷。其实在玩扫雷的过程中我也想过:我能不能编出这个游戏呢?可是一
直没有下决心,没下决心的原因是觉得其有难度,无处下手。有了这个赌,才开始
动手做,可做起来才知道也不是说做出来,十分八分钟就能搞定的。在编的过程中
有许多问题要解决。
对编一个程序的全程要进行了解,涉及到具体的语言(VB),对语言的控件,子程序,
自定义函数,随机函数,数组等也能有所了解,这些都是在我刚开始编这个程序
时始料不及的。更好的是通过“按钮”做出的8*8格的扫雷实在是太呆板了,当我
复制完8*8=64个按钮后,除非转变思维方式,我明白不可能再让他变成m*n的样子
了,这种不可能使我的注意力得到了集中,从m*n任意区域的扫雷中解脱出来,好
专心研究扫雷内部的问题,又因为8*8的格子数不少也不多,我找他们的规律不是
轻而易举就出来了,要费一些劲,但又不至于难到搞不出。选材问题就是这样一把
双刃剑。
编程就是这么有意思。选择稍稍高于自己现在编程水平的题目来编,使自己努努力
能够达到,无形中,这是一种提高。
我将这个扫雷整理了一下投了出去,竟然见报了。这使我的心中一动,这种扫雷的
编法的一个意义是:我们可通过它来锻炼和学习编程。
也许在通往优秀程序员的大道上,就是由这样的许许多多程序铺就的。
2、M*N的扫雷,去了我的一块心病
在而后的两年时间里,我开始留心如何能使我的《扫雷》摆脱8*8的枷锁,其中还
发生了一件十分有意思的事情,这件事情也更加坚定了我完善我做出的这个扫雷的
决心。
当我收到某投稿杂志的样刊时,在无意间,在我发表的一篇文章的前面,见到了一
篇关于扫雷的文章,我十分好奇,再往后看,觉得越来越面熟,看完才知晓,大约
有90%以上的代码和100%的思路就是我的,但文章前面赫然印着别人的名字。我的
第一个想法是抄袭,另一个更加重要的思想是觉得我的文章竟然有人抄了(第一次
被人抄袭的感觉是幸福的,被抄袭也是一种价值)!看样子是有人看了也研究过一
番。
此次抄袭事件让我看到了这个扫雷的价值。也就更加坚定了我做好我的扫雷的决心。
可是从何处去下手呢?从复制的过程中想到,对于雷区按钮,最好是通过程序来复
制,,这样可以得出任意多个,2003年5月,在给团市委修改一个人才信息库系统
时,终于无意中找到了答案,这也就出来了V2.0版本,也就是m*n区域的扫雷。
于是,我将程序写了出来,并投向了《家用电脑》。但这时的扫雷仍然有一个重要
的功能未能实现:左右键共用扫雷。这个问题一直萦绕在我的心头。在长火编辑的
提议下,我才下决心将这项功能做出,可是只下决心是没有用的,我实在想不出如
何来实现。从理论上我明白鼠标左键值是1,右键值是2,可是通过对两个键共同按
下时取值为3,在实践中却什么作用也不起。我百思不得其解,和几个朋友交流后
也未找出结果来。后来通过百度(www.baidu.com)来搜索了一下,终于找到了介
绍共用左右键的文章,其实理论上没有错,只不过不可能或者说很难实现左右键的
“同时”按下罢了,其实这种同时是有一个先后关系将键一个一个按下。
有时问题解决就是这样有意思。强求是不行的,在这时需要转换一下思路,最好还
要多找一些资料,搜索引擎是一种非常好的工具。
就这样V3.0也有了。
有时给自己加点压力,原本做不出的程序,可能就做出了。要学会转变思路,当然
更要交流,包括那些普通的朋友和网上的未曾谋面的朋友的。
3、编程,圆了我的一个梦
大学时,我的编程是为应付考试学习的,所以,那时我的编程水平也就是局限在语
法知识上。
我从小有一个梦想,想当一名大作家。大学时是我的这个梦最炽热的时候。我也想
成为一个求伯君式的程序员,但在二者发生冲突时,我选择了前者。我冒雪骑着破
自行车拿着自己的手稿花了一整天的时间打听着找到了一位作家的家,这是我的第
一次登门求教,我多么渴望发表自己的第一篇作品。
象我曾经痴迷于写小说一样,我不明白好多哥们迷恋金庸或琼瑶的原因。我决定以
身试法,我开始看武侠小说,明知书里面说的那个社会是不存在的,却进入之后也
不能自拔,竟甘心情愿地不吃不喝没日没夜地读。读者都能有这样的痴迷,作者的
那种快乐一定更加诱人。
作家最后送给我一句话:对于我们不理解的东东,我们要去崇拜。
那时求伯君先生虽然是我的崇拜对象之一,其实从内心深处还是不理解它的那种快
乐,编程有什么魔力竟能使他不吃不喝地比我读武侠还过份。
我崇拜地想,编程的魅力也许正在于此,编程的快乐也许正在于此,我也要努力拥
有那种快乐。
编程象在写作文,与写作文唯一不同的一点是。作文的主观性很强,同样的文章,
不同的人评价不同,程序不存在这样的主观性,关键是看电脑能不能接受,或者说,
作文写出的东西在现实生活中不一定是存在的,而编出的程序则在计算机上一定
是能执行的,程序是生活在一个虚拟的世界里,但它通过电脑对于我们来说又是可
见的。
从这一点上来说,程序需要有约束的创造性,这也是它比作文难的地方。一篇再恶
劣的文章,读下来应该问题不大,一个稍稍恶劣一点的程序,计算机的世界不会接
纳它。
编出一个好的程序其实并不逊于写出一篇好的文章。只不过对于某件东东,我们往
往有心去看表面的热闹,而却很难体会内部的精彩。
对于我来说,我不是一个很好的小说家,也不是一个最棒的程序员,但是,我是对
程序进行解剖的一个小说家,我愿意让大家和我共同来分享介于写作和编程之内的
快乐,正是这个过程,让我了解了编程。编程和写作二者不仅不矛盾,并且是可以
相辅相成的。2001年8月,我终于发表了自己的第一篇文章,圆了我的一个梦。
编程是“功利性”非常强的一项工作,编程是为我们解决一些实际问题的,同时,
解决这个问题的路上有许多迷人的景观值得我们这么去做。
4、什么是“程序”
当我们能明白“程序”这两个字的意思的时候,距明白编程就不远了。
程序意思非常简单,就是步骤,我们向计算机下命令时的1,2,3……的步骤。我
们通过下面的示例来看一下。
示例:水杯问题
两个同样大小的茶杯a,b中盛有满满的两杯水,一个杯a中是茶水,另一个杯b中也
是水,只不过是汽水,请将两杯水交换。
请思考。直接交换显然是不行的,不可能将第一个杯的水直接倒在第二个杯中,那
不是我们所希望的结果。
仅仅只有两个杯子是怎么也不能完成的,我们需用第三只杯子c。我们的工作可以
这么做(如下图示):
1、 将茶水倒入空杯中,使茶水杯先空出来;
杯子a
杯子b
杯子c
1
2
3
2、将汽水倒入空出来的茶水杯中,现在汽水杯空出来了;
3、将第三只杯中的茶水倒入汽水杯中。
上面事实上就是程序,通过赋值(将水赋给或者说装入不同的杯子)运算来完成了
我们的工作。
上面是我们所遇到的最简单的一个可以做为程序的例子。1、2二者的次序可以交换,
但前二者和3的次序不能变。
这就是程序,我们对电脑说的话,一定要符合事情发生的规律,不然,电脑就不会
做,或者给出我们一个和我们的期望完全不同的结果。
5、给编程初学者的几点建议
程序的意义
语言的语法知识是容易学的,象我们每个人都认识很多汉字,但不全是写文章的专
家一样。编程强调的是一种整体效果,是一个整体的步骤,这也就是编“程序”中
程序二字的含义。
编程的精彩
程序有什么值得我们去编的呢?不管圆梦还是其他,想当一名优秀的程序员,内在
的动力是重要的,吸引我们的其实就是它的精彩,有许多榜样如求伯君等告诉我们,
编程的世界很精彩。
题材的选择
我们要对其编程的对象,对它的选择要适当,不能太难,也不能太易;功能较多的
比较难的化繁就简,然后从简单向繁杂扩展不失为一种好的方法。
博与精的关系
一个人的知识是有限的,要学习,更要讲究学习的方法;互联网给我们提供了一种
学习的途径。选择好一门语言,将其研究透彻,不要见异思迁,今天喜好这种语言,
明天喜好那种,除非你是天才。如果您会所有的语言,很可能就说明您对什么语
言也不精通。
的确,扫雷是一个非常好的也是非常有意思的编程题材,我之所以最后将这个程序搞
定了,其实最重要的一点就是信心和适当的简化。前人已经写出了的程序,我们也
应该写出,信心就是从这里开始的。另一点就是简化,通过死板地手工复制命令按
钮,使我的注意力放到一个扫雷的特例(8*8)上,从特殊到一般,这是解决问题
的一种方法。希望我的扫雷故事对于正在热爱编程的您有所启示。
--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.188]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.330毫秒