4、炮打飞机

那天,阳光特别灿烂,计算机们唱着欢快的蜂鸣声,欢迎着木鸿飞一行。木鸿飞心中荡漾着一股激情:“今天,我开始编程了!我将编写人生的第一个软件,第一个游戏软件!”

“雄赳赳,气昂昂,跨入了机房。”后来同学们是这么评价木鸿飞的,虽然木鸿飞与其他人一样,都是静悄悄地跨入机房,据后世好事者评价,木鸿飞那犀利的眼神,紧握的双拳,坚定的步伐,早已将他出卖,任谁在他身边,都能明显的感觉到,木鸿飞的小宇宙在燃烧,今天机房里面绝对不寻常!

进入机房,木鸿飞环视四周,一一扫过整齐排放的计算机,最终目光定格到一台286机型上,然后迈大步靠近,坐下,插入软盘,按下电源键,稍稍等待后进入DOS提示符。木鸿飞拿出笔记,输入了几个命令,每当他敲入一个回车,屏幕上就对应显示了一行英文,虽然这些英文句子并不都认识,但每个句子中都有显目的单词“error”。木鸿飞点点头,露出“果然如此”的神情,离开286,来到墙边一台被淘汰的“苹果机”前。

开机,等待启动,输入命令,苹果机的屏幕出现了全屏的字符输入界面。木鸿飞在键盘上输入:“print 1+1”,按下运行(RUN)键,屏幕显示:“2”。结果完全符合预期,木鸿飞松了一口气。

“木木,教材上使用的是以前的苹果机吗?”导弹目睹了木鸿飞的全过程,拿起教材问答。

“是的。我刚刚运行了11等于2进行测试,完全正确!”木鸿飞肯定回答,“幸亏这些老机器没有淘汰,不然就只有倚天屠龙,没有用武之地了。呵呵。”

历史其实有着惊人的相似性,木鸿飞不知道,早在十多年前的大洋彼岸,一个叫做“比尔·盖茨”的年轻人,与其伙伴开发BASIC语言解释程序,销售其产品时,这个年轻人运行的第一个程序就是“print 1+1”。正是那个“一加一等于二”,证明了比尔·盖茨设计程序的正确性,赚取了其人生的第一桶金,也造就了一个世界首富。十多年后的中国,同样是这个“一加一等于二”,拉开了木鸿飞编程的帷幕,撰写了其传奇的起点,从此木鸿飞在编程路上一路狂奔,渐行渐远。时间飞逝,又是十多年过去了,在这期间也不知道世界上还有多少年轻人,被“一加一等于二”所感召,踏上编程之路。我们行走在同一条道路上,这条道路时常万里无云、一马平川,激励着你前进,时常却又乌云密布、天旋地转,迷惑你走上歧途,或者中途退出。编程之路,是一条坎坷的路,充满着羁绊,每一步的前行都充斥的汗水;编程之路,是一条寂寞的路,除了寥寥行色匆匆的路人,就只有孤独相伴;编程之路,是一条乏味的路,枯燥的代码是它不变的景色。但我们相信,我们会用必胜的信念挑战磕磕碰碰;会学会与代码交流,一路将不再孤单;会透过我们的眼睛,观察掩藏在代码中的精灵,欣赏她们美妙的舞蹈。既然选择了这条路,就无怨无悔,让我们携手共进,去创造人生的辉煌吧!

一旦确定了编程工具,木鸿飞马上实施游戏软件的设计。他选择的是在D县一中历届学生中大名鼎鼎的“炮打飞机”程序。之所以称之为“大名鼎鼎”,是因为他之前,从D县一中走出的计算机专业大学生几乎都知道这个程序,所有的计算机粉丝都亲手敲过这段代码。记得多年之后,D县一中一个学长与木鸿飞见面,他望了望木鸿飞,用一种大家都知道的神情说到:“炮打飞机拉,大家都编过,我编的第一个程序就是炮打飞机。”。

由于教材上已经详详细细列举了炮打飞机的所有代码,所以与其说是“设计”,还不如说是“打字练习”。木鸿飞轻松的输入了50多行的代码后,按下“RUN”——解释运行键(注:BASIC是解释运行语言,不是编译运行语言),但是预期的游戏界面没有出现,取而代之的是一串英文提示和程序中一处反显提示。木鸿飞用仅有的一点点英语知识来阅读,察觉出有信息未定义,于是再回到程序中反显部分,仔细观察发现原来是关键字输入错误,修改后继续按下“RUN”键,如此大约反复五、六次后,终于界面终于发生了变化:在黑漆漆的屏幕上,一架相当简陋的飞机(图像显示:“-=< ”)从右向左缓缓飞过,下面是一个同样简陋的固定炮台(图像显示:“^”),当游戏玩家按下字母“a”时,一个由感叹号“!”描述的炮弹从炮台缓缓升起,冲向飞机。如果击中,则游戏爆机Over;否则可以继续发射炮弹,直到飞机到达最左端时,Game Over

炮弹飞机界面示意图,汉字和坐标系为解释,实际界面中无

这可能是世界上最简单的游戏了,同学们马上被吸引围观起来,有好事者开始试玩游戏,其中鸭子那个家伙居然一口气狠狠地玩了二十多次,颇有些游戏测试者的气质。更多的人则是充满着兴奋和疑惑,他们七嘴八舌的问道:

“木木,这是你编的游戏吗?”质疑逼人,木鸿飞点头。

“木木,这真的是你编的游戏吗?”质疑再度逼人,木鸿飞再次点头。

“木木,这真的真的是你自己刚刚编的游戏吗?”质疑再三逼人,木鸿飞再三点头。

“木木,这真的……

“停!这真的真的真的是我刚刚编的炮打飞机游戏!”。质疑四度逼人,木鸿飞赶忙提前辟谣,结束在琼瑶阿姨的小说中才会出现的爱情似问答。

其实不能责怪同学们的不信任,在没有学习BASIC语言的前提下,计算机编程对大家来说就如同仙女般遥远和神圣,如今仙女堕入凡尘,却对木鸿飞投怀送抱,怎能不使大家诧异和羡慕,不可避免在言语上质疑了。质疑过后,人们纷纷希望亲自设计这个程序,木鸿飞也不含糊,告诉大家几个基本的操作命令后,就将源代码显示在屏幕上,供大家对照输入。气质美女何丫丫继续当仁不让,充分利用平时的关系,强行招呼木鸿飞提供VIP式一对一指导。导弹等人看着羡慕,却也毫无办法,谁叫他的炮打飞机还没有运行成功的,只能咬咬牙,继续调试去吧。

不多久,一台台苹果机开始运行炮弹飞机,虽然只是个简单的游戏,同学们却照样玩的不亦乐乎。几分钟后,人们经历了最初的兴奋,渐渐冷静下来,于是有人开始思索游戏的设计来,真是一群喜欢打破沙锅问到底的家伙。

“为什么这些代码就可以炮打飞机呢?木木,你略懂吗?可以讲一讲不?”绍绍发问,首先打破全班游戏的气氛。

“错,我没有略懂。”木鸿飞回答。

“唉!真可惜,不知道为什么要这么设计。木木,知道就说出来,咱俩谁跟谁,不要藏私啊。”绍绍无不惋惜的说道。

“对啊,对啊,独乐乐不如众乐了,你如果知道就说出来,大家分享一下。”丫丫也想知其然知其所以然。

“这个炮弹飞机程序我真的没有略懂!”木鸿飞强调,然后继续强调:“我是全懂!”。四周立刻传来一群杀人的目光,丫丫甚至卷起衣袖,不顾美女的矜持,欲上演一场惊天地泣鬼神的“我的野蛮女同学”版暴力事件。

“我马上就解释。”见势不妙,木鸿飞急忙抢答,有效防止了暴力事件的升级,“其实整个程序就是一个循环,飞机从屏幕右边开始,到达左边结束。”

“循环是什么?”鸭子率先打断木鸿飞。

“循环就是把一个事情分割成很多相似的小步骤,这些小步骤除了一些具体的数值外,步骤和程序都是一样的。”木鸿飞看到鸭子紧锁的双眉,就知道解释工作不到位,赶紧停下来想了想,然后继续说道,“就好比走路,我们从那里走到这里,是一个事情。这个事情其实就是一个循环,可以分为若干个相同的小步骤,这些小步骤就是:抬起左脚,向前迈下,又抬起右脚,再向前迈下。OK,一次循环完成。下一次循环你继续抬左脚迈下,抬右脚迈下。以此类推,每次循环的内容都是一样的,不同的仅仅是起步的绝对位置。”

“就是把一个复杂的事情分为很多个简单的小步骤,我明白了。”鸭子难得清白了一回。

“对,就炮打飞机而言,每个循环需要完成三个内容:第一,飞机向前飞动一格。第二……”木鸿飞侃侃而谈。

“飞机怎么飞?”邵邵突然打断,提问道。

“这个问题暂时不要考虑,总之飞机需要向前飞动,至于如何实现的,这是下一步要考虑的内容,”木鸿飞看了看邵邵,继续解释道:“第二就是炮弹向上飞动一格。这个内容比较复杂,需要判断炮弹是否发送,炮弹是否打中飞机,炮弹是否已经到达顶部等等。第三就是接收我们在键盘上的按键,如果我们按下发送键,这里用字母a表示,就向上发送炮弹。”一边说,木鸿飞一边在纸上画出如下的图案:

 

导弹用手指了指“2.2”,问道:“是不是如果炮弹打中了飞机,那么游戏结束,否则继续游戏。”木鸿飞点头。

导弹又指着“2.3”问道:“是不是如果炮弹到达了最上面,那么炮弹消失,否则继续游戏。”木鸿飞再次点头。导弹也跟着点点头,表示懂了。

其他人思考了半天,最终参差不齐的点了点头,纷纷表示“略懂”,唯独鸭子仍然不解风情,一个劲的叫嚣:“不清楚,不清楚,那个飞机到底是怎么飞动的呢?”。直把木鸿飞气得咬牙切齿:“刚开始时不是说了吗,现在我们思考的是整个程序的设计流程,考虑的是大方面的东西,就不要管飞机怎么飞的这些具体细节。”

多年以后,木鸿飞曾指导过很多学生,有的学生很有天份,设计思想一点就透,而有一些却显得比较呆板,常常一个设计思想就需要思考半天,难道是他们不适合程序设计吗?木鸿飞曾为之交流过,发现很多这类学生的思维比较混乱:在设计整个系统框架,他们常常考虑某个具体细节如何实现;在设计A模块具体实现时,他们却又突然考虑起B模块中的对象。鸭子就是一个典型的例子,在设计炮打飞机整体流程图时,他总是陷入飞机动画中不能自拔,而一旦开始具体设计飞机动画时,他又总是担心炮弹如何打中飞机。对于这些学生,木鸿飞一般会先发大力气指导他们拨正混乱思维,果然,突破此屏障后的同学们编程能力大多突飞猛进。

其实这就是程序设计中最基础的思想,无论是划分模块还是编写模块,无论是选择对象还是设计对象,都务必保持清晰的头脑,分清楚当前工作的重心,先打好框架,再考虑细节,先设计蓝图,再加砖添瓦,打框架时不要被设计细节所蒙蔽,设计蓝图时不要被购买材料所羁绊。

木鸿飞一群人继续分析炮弹飞机的设计,其中大多数时候是木鸿飞讲述,其他人倾听,或者其他人提问,木鸿飞回答,偶尔导弹也会插上一两句,发表自己的观点。大家你来我去,分析得自得其乐,直到最后,突然听到圈外传来一阵鼓掌声,大家循声望去,杨老师不知什么时候出现在大家面前。只见杨老师满面笑容,翘起大拇指对木鸿飞说道:“不错,不错。虽然每届学生都编了这个炮弹飞机,但是把它的设计思路原原本本还原出来的就只有你一个!”

木鸿飞这家伙本来就有点洋洋自得,得到了杨老师的夸奖,更加喜洋洋的找不到灰太狼了,但又必须保持谦虚谨慎、戒骄戒躁的作风,只好强忍住笑容,露出一股丑陋的神情,假装谦虚的说道:“呵呵,我只是略懂,略懂,呵呵。”突然,木鸿飞迎上了丫丫那杀人的目光,赶紧改口,“略懂只是我的口头禅,其实我是全懂了!”

     

 ps1:浪子已经在很努力的更新了,其实以前每一章只有1K,到后来的2K,3K,现在本章有4K,还配了两个图和一个程序,本章的更新内容其实远远超过了以往各种。但是似乎本贴的热度越来越低,从最初的500多次阅读,到现在的60次阅读,从最初还有几个评论,到现在无人问津。浪子不禁想问,这个世界是怎么了,现在食品越来越多,可吃的越来越少。赚钱越来越多,幸福越来越少。汽车越来越多,道路越来越少。汗水越来越多,掌声越来越少。更新越来越多,阅读越来越少,文字越来越多,回帖越来越少。期待本章能够上榜,其他本书所有章节天天上榜!

ps2:炮弹飞机可执行程序,供试玩。发射炮弹命令是a,本程序在XP系统下测试通过。

 

ps3:附上炮打飞机游戏源代码。这是在Borlandc++3.1  for dos上调试通过的,如果使用TC2.0编译,请自己稍做修改。另外windows环境已经不再支持这种字符界面,故请不用使用Vc++,C++builder或Dev-C++编译。

 

 
  1. #include <conio.h>  
  2. #include <stdio.h>  
  3. #include <dos.h>  
  4.  
  5. int main()  
  6. {  
  7.     int x, y=23, c;  
  8.     int nFlag = 0;  
  9.     textmode(3);  
  10.     clrscr();  
  11.     gotoxy(40, 24);  
  12.     printf("^");  
  13.     gotoxy(40, 23);  
  14.     printf("!");  
  15.     for (x=75; x>=1; x--)  
  16.     {  
  17.         gotoxy(x, 3);  
  18.         printf("-=< ");  
  19.  
  20.         if (nFlag)  
  21.         {  
  22.             gotoxy(40, y);  
  23.             printf(" ");  
  24.             y = y - 5;  
  25.             gotoxy(40, y);  
  26.             printf("!");  
  27.             if (y == 3)  
  28.             {  
  29.                 if (x <= 40 && x + 3 >= 40)  
  30.                 {  
  31.                     return 0;  
  32.                 }  
  33.                 else 
  34.                 {  
  35.                     nFlag = 0;  
  36.                     gotoxy(40, y);  
  37.                     printf(" ");  
  38.                     y = 23;  
  39.                     gotoxy(40, y);  
  40.                     printf("!");  
  41.                 }  
  42.             }  
  43.         }  
  44.         if (kbhit())  
  45.         {  
  46.             c = getch();  
  47.             if (c == 'a') nFlag = 1;  
  48.                 }  
  49.         delay(300);  
  50.     }  
  51.     return 0;  
  52. }