第一章 游戏的描述

以往的编程教材通常会从语言的要素开始讲起,首先介绍基本概念,如数据类型、变量、表达式、语句等等,通过给出例子让读者理解这些概念,并学会使用它们。在这本书里,笔者希望能够尝试一种不同的学习路径,把编程语言暂时放在一边,先来讲讲如何描述我们身边熟悉的事情,并如何把它们逐步地用程序的语言表达出来。

俄罗斯方块是一款大家都非常熟悉的游戏,游戏中有七种颜色及形状各异的块(本书中称之为组块),它们在屏幕顶端生成,并以一定速度逐行下落,同时屏幕的右上角会随机生成一个小的组块,来预报下一个将要出现的组块;玩家可以用上下左右键来控制这些组块,实现组块的旋转、加速下落、左移及右移;当组块的下部触到底部边界,或触碰到其他已经落底的组块时,将停止移动和旋转;在组块的旋转及移动过程中,不能与其他已经落底的组块重叠,也不能越出边界;如果落下的组块恰好填满一行或多行,则消除这一行或多行,然后让上面的块落下来,增加得分,并在屏幕顶端生成已经预报的新组块;如果落底的组块不能填满一行或多行,则立即在屏幕顶端生成新组块;当某个块因无处下落而触顶时,游戏结束。

图1-1 安卓手机中运行的俄罗斯方块游戏

以上是我对这个游戏的描述,你也可以试试看,用自己的语言来描述它。用人类语言描述同一件事情,可以有多种不同的版本,因为人类语言的要素(字、词、句、段等等)非常丰富,比如我们表达一种失落的心情时,可以说“悲伤”、“伤感”,也可以说“不开心”、“不快乐”等等。对于一名学生而言,丰富贴切的用词可以增加一篇作文的感染力,彰显学生的文字表达能力,但是对于一段描述游戏功能的文字来说,更重要的完整性及准确性,它反映的是书写者的思考能力。你可以思考一下,这两类文字最根本的不同之处。

游戏的描述是游戏开发的第一步。在整个游戏开发过程中,我们会时不时地回过头来,查看这段描述,用它来指引自己的开发进程。无论多么简单的一个应用,开发者都应该事先草拟一个作品描述文档,逐条列出作品所具备的要素及运行过程,这些条目可以没有条理,也不必十分严谨,但要尽可能地全面。随着你完成的作品越来越多,这种编写描述文档的技能就会越来越熟练,即,文档会越来越有条理,越来越严谨。初学编程者往往会忽略这个环节,心里想到了就急于上手做,这倒也不是一件坏事,毕竟我们我能被一个形式上的文档困住手脚;但是如果你能有意识地培养自己描述作品的能力,并逐步养成写作的习惯,那么你成长的起点就比较高,将来收获的结果也就自然比较丰厚。

在我上小学的那个年代,语文课上讲记叙文有四大要素——时间、地点、人物、事件,不过现在到网上一搜,记叙文的要素已经增加到六个,原来的事件分化成“事件的起因、经过及结果”。无论怎样,我们对游戏的描述其实离不开这些要素。对这些要素的分类有助于我们写作的条理化,也会提高内容描述的完整性。表1-1中以俄罗斯方块为例,解析了描述这一类游戏应该具备的基本要素。在游戏开发之初,对俄罗斯方块的描述并没有这么完整,有些要素是在开发完成之后才提取出来的,这是由于我们思维能力的局限,我们很难在做一件事之前,预料到过程中的所有可能的环节及问题。

表1-1 描述游戏作品的基本要素

也许下面的故事可以鼓励你勇敢地尝试。“这是一个简单的游戏,我也可以把它做出来”,这是十几年前我刚开始学习编程时的想法,于是我就饶有兴致地开始了我的尝试。然而事实并非如此,这是一个看似简单、做起来却很费思量的游戏,许多次的走投无路和推倒重来,许多次的放弃与搁置。终于有一天我遇到了App Inventor,好奇心驱使我想探探这个东西的虚实,也想挑战一下自己的耐力,于是重拾旧趣,同时给自己一个额外的任务——记录开发过程,便有了现在这本书。我想说的是:“开始尝试”非常重要,不要忽视自己想要创作的冲动,它比世间任何的宝藏都更加珍贵,它像蒙昧时代的火种,可以带来更大的、更长久的光明;别担心自己缺乏知识与技术,这个年代最不缺乏的就是知识与技术,网络上随处可得的资源,就像空气一样无处不在,只要有心,事就一定能成。俗话说,无知者无畏,这也是初学者的通行证和保护伞,是每一名程序员的必经之路。

编程如同游戏,如果它过于简单容易,则毫无魅力可言。喜欢玩游戏的同学,尤其是那些喜欢玩复杂游戏的同学,你一定也会成为一名优秀的程序员。对于初学者,入门的导师不是那些学习编程的书,而是你自己想做一个产品的强烈愿望。一旦你心中勾勒出一幅未来作品的图景和线索,你就可以开始编写你的程序了,至于使用什么编程语言,那只是一种选择。现在有太多的语言可供选择,比如这本书中使用的App Inventor,它是一个适合初学者使用的可视化编程工具,你的编程之路也不妨从这里开始。

每一种编程语言都是一个非常大的集合,就像一个万能的工具箱一样,里面装满了各式各样的工具——语言要素,App Inventor也不例外。这个庞大的集合有时会扰乱我们的视线,让我们无所适从,因此我们应该学会取舍;况且,试图用少量的工具实现复杂的功能,这也是创造的乐趣所在。在我们制作这个“俄罗斯方块”时,核心的要素只有两个,即“画布”和“列表”。在这个《开发笔记》中,我将尝试以一种“进化”的方式来演绎编程的过程,看一个软件作品是如何完成的。何谓“进化”?“进化”是生物由低级到高级、由简单到复杂的发展过程。