管海蓉
● 教学背景
程序设计教学一直是我们信息技术学科教师心中的“痛”,必修课程中并未涉及,而选修课程的实施尚差强人意。我长期以来一直在寻找契机,希望在这方面能对部分有兴趣的学生进行普及性教育。对于我们这么一所普通初中来说,或许参赛获奖无望,或许付出多收获少,可是当教师的,所谓收获又岂止是获奖名次,真正的收获难道不是学生能力的提高和发展吗?所以,要为喜欢编程的孩子教授程序设计课程,是我一直以来的愿望,我也一直在寻找机会。
● 着手实施
恰巧,从2009年起,学校开始规范和强化实施校本课程。结合一直以来的想法,我决定在初一年级开设以VB程序设计为专题的校本课程,这无论是对我还是对学生来说都是一次新的挑战。因为,VB课程一般安排在初三或高中选修课程开设,这主要是取决于学生的思维和知识储备有了一定的基础,对于逻辑推理性较强的程序设计才能更好地掌握。初一的学生能力可及吗?后来,回顾一年的教学,我惊喜地发现学生的能力远胜于我的预期。而总结这其中的经验,实际上正是对学生能力的担心,使我将课程设计中的学习任务起步点降低,再对学习任务进行逐步细化和改良,学生学习颇有信心,VB教学才有了一定的成效。
● 游戏教学
实际上,VB教学中有很多现成的源程序,但学生一直问:老师能不能教我们编个游戏啊?我想,游戏虽只是载体,但却是我们不可回避的学生关注点。既然无法回避,那不如因势利导,我设计一个有立意的游戏,既能充分激发他们强烈的学习欲望,又能不着痕迹地进行引导。这样的教学设想令我异常激动,于是,我爽快地答应了孩子们的要求。
可是,由于校本课程的授课时间有限,学生们所学到的仅仅是VB的皮毛,只了解了简单的控件、属性、事件,只学了顺序和分支结构,就连循环结构还没接触到,想要真正完成一个游戏是何其困难。况且,课本没有、网上找不到这样的例子,答应他们真是自讨苦吃。不过,作为教师哪能食言,我开始了辛苦的开发之旅,经过一段时间的努力终于完成。程序实现的是:在游戏时间内,从天空不断下落纸片垃圾,操控者要控制游戏窗口底部的垃圾桶左右移动,接住垃圾,游戏程序将根据接住的垃圾数量自动计分。这个“垃圾入桶”游戏在技术上融合了VB可视化窗口的控件、属性、事件等相关操作,IF分支结构、键盘响应等知识点,而同时又结合我校绿色环保学校的主题,引导孩子们保护环境。
程序设计,在很多人眼里很神秘、很难,学生更有这种心理。所以我在设计“垃圾入桶”游戏一例时,就要求自己从最简单的可实现程序入手,做到每步有成就,每步有提高,为学生们搭好台阶。且看看这个综合实例是如何由浅入深、层层推进,来完成我校VB校本课程的实施的。
● 逐步求精
对学生来讲,基于原有知识基础的设计体验,最能激发他们的成就感和进一步的求知欲。而根据了解,学生们在学习这个程序设计之前,前期制作过自己的图片浏览软件,能通过按钮控制图片在窗口中的移动。因此,我从这里切入,逐步完善,而为了思路更清析,我梳理了一个开发进度图来描述这个过程。
当然,在这个开发设计过程中,有学生已有的知识基础,也有一些需要传授的新的知识技能和思路方法,在下面的描述中,以教师提示、学生分析来区分授课环节的安排。
第一步:在窗体中加入纸片控件,制作纸片垃圾的单次下落过程
这个操作对学生来说是十分简单的入手题。插入图片控件对学生来讲没有问题。而对比上述图片浏览软件中移动图片的效果和现在开发中要实现的效果,师生分析了以下共同点及需要改进之处:(备注:纸片控件名称为Zhipian)。
教师提示:如何实现纸片下移?(已有知识储备)
学生分析:Zhipian.Top= Zhipian.Top+30s。
及时巩固知识点:这个式子在数学上是不成立的,但在程序设计中的意思是:把Zhipian.top的值加上30以后再存入Zhipian.Top中,即:使Zhipian.Top增大30。
教师提示:纸片不是用按钮控制移动,而是要自动持续不断地下移(不同之处需改进)。
学生分析:控制每毫秒纸片图片的位置下移固定的像素值,当然可以使用前期学过的Timer控件。
教师提示:纸片持续下移位置超过窗口时,程序实现自动结束(不同之处需改进)。
学生分析:要使用一个IF语句来判断,纸片是否在窗口内,是则不断下掉,否则结束。
因此判断的语句为:If Zhipian.Top < Form1.Height Then Zhipian.Top=Zhipian1.Top+30。
教师提示:上述判断是由Timer控件控制,每毫秒运行一次这个IF语句。
IF判断的运行是由Timer控件控制,所以IF语句应该放在Private Sub Timer1_Timer()中。
而Timer控件是在窗体一加载时就开始起作用,即由打开窗体这个事件引发,所以放在Private Sub Form_Load()中。
经过上述分析,得到代码如下:
Dim a As Integer
Private Sub Form_Load()
Timer1.Interval = 1
End Sub
Private Sub Timer1_Timer()
If Zhipian.Top < Form1.Height Then Zhipian.Top = Zhipian.Top + 30
End Sub
第二步:在窗体中加入接垃圾的垃圾桶,使纸片垃圾下落到垃圾桶时就不再显示了
教师提示:原来Zhipian的top属性是和整个窗口的高度比,超过这个高度即结束,现在要和哪个数据来比较呢?(备注:垃圾桶控件名称为Tong)
学生分析:是低于桶的高度就消失,故应该和垃圾桶控件Tong进行比较。
经过上述分析,得到代码如下:
Dim a As Integer
Private Sub Form_Load()
Timer1.Interval = 1
End Sub
Private Sub Timer1_Timer()
If Zhipian.Top < Tong.Top Then Zhipian.Top = Zhipian.Top + 30
End Sub
第三步:任务是使纸片循环不断下落,而不是只落一次就结束
教师提示:原来的IF语句比较Zhipian的top值大于与Tong的top值,程序结束,而如果需要纸片不断下落,则应从顶部重新落下,Zhipian的top值如何变化?
学生分析:上一次纸片下落过程完成后,应当让纸片图片的Top属性值归零。
经过上述分析,得到需要修改的IF语句代码如下:
If Zhipian.Top Zhipian.Top = Zhipian.Top + 30 Else Zhipian.Top = 0 End If 在这个过程中,用到了IF语句块,应当特别提醒学生注意写程序代码时的缩进,良好的规范有利于别人和自己对程序的阅读及理解。 第四步:使纸片每次在不同位置下落 教师提示: ①纸片控件(Zhipian)在不同的位置下落,需要Zhipian的什么属性不同? ②用以前学习的什么方法可以实现随机出现的位置? 通过上述两个问题的讨论,学生分析得到: 用Zhipian.Left来控制纸片的左右位置,用Rnd来实现取随机值的效果,得到代码: Zhipian.Left = Form1.Width * Rnd 经过修改后,完善代码如下: If Zhipian.Top < Tong.Top Then Zhipian.Top = Zhipian.Top + 30 Else Zhipian.Top = 0 Zhipian.Left = Form1.Width * Rnd End If 至此,以上程序设计已完成了纸片在不同位置随机循环下落的过程。 第五步:根据纸片是否落入了垃圾桶中,通过Label控件显示得分 既然是游戏,当然需要设置得分,以区分玩家玩得好不好,那么可以设计一个Label控件,来实现计分的功能。 教师提示:①在什么时间点进行判断?(即写在程序的哪个位置)②Zhipian(纸片图片)的位置在Tong(垃圾桶图片)中间时,即可加分。那么使用IF语句的判断条件是什么?③Label控件用于计分,故起名为Score。 学生分析:①判断的时间应在纸片图片下落到垃圾桶图片的同高(或超出)时,即应当写在判断是否下落到底的IF语句中的Else段中。②纸片落在垃圾桶中,即Zhipian距离窗体左边(left值)大于Tong距离窗体左边(left值);同时,Zhipian距离窗体右边大于Tong距离窗体右边。问题是:如何表示图片距离右边的值? 引导学生思考、讨论后得出:距离窗体右边的值,可以用其left属性加上其width属性。 If Zhipian.Top < Tong.Top Then Zhipian.Top = Zhipian.Top + 30 Else If Zhipian.Left > Tong.Left And Zhipian.Left + Zhipian.Width < Tong.Left + Tong.Width Then Score.Caption = Score.Caption + 10 Zhipian.Top = 0 Zhipian.Left = Form1.Width * Rnd End If 第六步:使用键盘来控制垃圾桶的左右移动 在这个环节,需要学生了解键盘每个键的键值。因此,在讲解完键盘控制原理后,给出了控制键对应的码值表。经过多次修正,由浅入深,最终的代码为: Dim a As Integer Private Sub Form_Load() Timer1.Interval = 1 a = 0 End Sub Private Sub Timer1_Timer() a = a + 1 If a < 1000 Then If Zhipian.Top < Tong.Top Then Zhipian.Top = Zhipian.Top + 30 Else If Zhipian.Left > Tong.Left And Zhipian.Left + Zhipian.Width < Tong.Left + Tong.Width Then Score.Caption = Score.Caption + 10 Zhipian.Top = 0 Zhipian.Left = Form1.Width * Rnd End If
End If
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 37 Then Tong.Left = Tong.Left - 50
If KeyCode = 39 Then Tong.Left = Tong.Left + 50
If KeyCode = 38 Then Tong.Top = Tong.Top - 10
If KeyCode = 40 Then Tong.Top = Tong.Top + 10
End Sub
(注:变量a,用于控制游戏持续的时间)
● 教学相长
程序设计从最简单的图片(纸片)位置下移入手,逐步加入了控制移动结束、控制多个纸片下落、使每个下落的纸片在不同位置随机出现、计算正确得分、最后到键盘控制图片(垃圾桶)的上下左右移动。整个程序的任务逐次递进,总共分成了六个渐进的步骤,最终完成整个代码的设计。
在这个校本课程的教学实践中,不仅教给了学生知识方法与综合应用能力,同时教给学生的还有解决问题的思想,先从简单的,能够入手的问题切入,慢慢修正,直至完成设计。从一两句到几十句,看到自己所写的代码越来越长,程序效果慢慢完善,孩子们心中的喜悦与成功感越来越强,这也正是程序设计工程中所要经历的种种。VB程序设计的教学不仅要教会学生面对对象的思想、算法及数据结构,更需要教师开动脑筋,设计合适的例题,培养学生不怕困难,抓住要点,自顶向下,逐步求精的IT设计精神。
正是这个自主编制的VB校本课程实例,让学生初步领略了程序设计的乐趣,也让我从中领悟到,程序设计的教学不仅可以教知识内容、算法结构,还可以教我们曾经学过的软件工程中程序开发流程和思想等,而这似乎是更有意义的。正如耶鲁大学校长理查德·查尔斯·莱文说的:“有用性的教育,只专注于某一专业的教育,只重视知识的传授,从长远来讲没太多价值。无用性的通识教育,赋予学生更广阔的视野。”虽然作为教师不可能离开知识性的传授,但在知识传授中,主观贯穿的、我们更应该注重的却应当还有些专业思想的通识性教育吧。