管海蓉
● 教學(xué)背景
程序設(shè)計(jì)教學(xué)一直是我們信息技術(shù)學(xué)科教師心中的“痛”,必修課程中并未涉及,而選修課程的實(shí)施尚差強(qiáng)人意。我長(zhǎng)期以來(lái)一直在尋找契機(jī),希望在這方面能對(duì)部分有興趣的學(xué)生進(jìn)行普及性教育。對(duì)于我們這么一所普通初中來(lái)說(shuō),或許參賽獲獎(jiǎng)無(wú)望,或許付出多收獲少,可是當(dāng)教師的,所謂收獲又豈止是獲獎(jiǎng)名次,真正的收獲難道不是學(xué)生能力的提高和發(fā)展嗎?所以,要為喜歡編程的孩子教授程序設(shè)計(jì)課程,是我一直以來(lái)的愿望,我也一直在尋找機(jī)會(huì)。
● 著手實(shí)施
恰巧,從2009年起,學(xué)校開(kāi)始規(guī)范和強(qiáng)化實(shí)施校本課程。結(jié)合一直以來(lái)的想法,我決定在初一年級(jí)開(kāi)設(shè)以VB程序設(shè)計(jì)為專(zhuān)題的校本課程,這無(wú)論是對(duì)我還是對(duì)學(xué)生來(lái)說(shuō)都是一次新的挑戰(zhàn)。因?yàn)?,VB課程一般安排在初三或高中選修課程開(kāi)設(shè),這主要是取決于學(xué)生的思維和知識(shí)儲(chǔ)備有了一定的基礎(chǔ),對(duì)于邏輯推理性較強(qiáng)的程序設(shè)計(jì)才能更好地掌握。初一的學(xué)生能力可及嗎?后來(lái),回顧一年的教學(xué),我驚喜地發(fā)現(xiàn)學(xué)生的能力遠(yuǎn)勝于我的預(yù)期。而總結(jié)這其中的經(jīng)驗(yàn),實(shí)際上正是對(duì)學(xué)生能力的擔(dān)心,使我將課程設(shè)計(jì)中的學(xué)習(xí)任務(wù)起步點(diǎn)降低,再對(duì)學(xué)習(xí)任務(wù)進(jìn)行逐步細(xì)化和改良,學(xué)生學(xué)習(xí)頗有信心,VB教學(xué)才有了一定的成效。
● 游戲教學(xué)
實(shí)際上,VB教學(xué)中有很多現(xiàn)成的源程序,但學(xué)生一直問(wèn):老師能不能教我們編個(gè)游戲???我想,游戲雖只是載體,但卻是我們不可回避的學(xué)生關(guān)注點(diǎn)。既然無(wú)法回避,那不如因勢(shì)利導(dǎo),我設(shè)計(jì)一個(gè)有立意的游戲,既能充分激發(fā)他們強(qiáng)烈的學(xué)習(xí)欲望,又能不著痕跡地進(jìn)行引導(dǎo)。這樣的教學(xué)設(shè)想令我異常激動(dòng),于是,我爽快地答應(yīng)了孩子們的要求。
可是,由于校本課程的授課時(shí)間有限,學(xué)生們所學(xué)到的僅僅是VB的皮毛,只了解了簡(jiǎn)單的控件、屬性、事件,只學(xué)了順序和分支結(jié)構(gòu),就連循環(huán)結(jié)構(gòu)還沒(méi)接觸到,想要真正完成一個(gè)游戲是何其困難。況且,課本沒(méi)有、網(wǎng)上找不到這樣的例子,答應(yīng)他們真是自討苦吃。不過(guò),作為教師哪能食言,我開(kāi)始了辛苦的開(kāi)發(fā)之旅,經(jīng)過(guò)一段時(shí)間的努力終于完成。程序?qū)崿F(xiàn)的是:在游戲時(shí)間內(nèi),從天空不斷下落紙片垃圾,操控者要控制游戲窗口底部的垃圾桶左右移動(dòng),接住垃圾,游戲程序?qū)⒏鶕?jù)接住的垃圾數(shù)量自動(dòng)計(jì)分。這個(gè)“垃圾入桶”游戲在技術(shù)上融合了VB可視化窗口的控件、屬性、事件等相關(guān)操作,IF分支結(jié)構(gòu)、鍵盤(pán)響應(yīng)等知識(shí)點(diǎn),而同時(shí)又結(jié)合我校綠色環(huán)保學(xué)校的主題,引導(dǎo)孩子們保護(hù)環(huán)境。
程序設(shè)計(jì),在很多人眼里很神秘、很難,學(xué)生更有這種心理。所以我在設(shè)計(jì)“垃圾入桶”游戲一例時(shí),就要求自己從最簡(jiǎn)單的可實(shí)現(xiàn)程序入手,做到每步有成就,每步有提高,為學(xué)生們搭好臺(tái)階。且看看這個(gè)綜合實(shí)例是如何由淺入深、層層推進(jìn),來(lái)完成我校VB校本課程的實(shí)施的。
● 逐步求精
對(duì)學(xué)生來(lái)講,基于原有知識(shí)基礎(chǔ)的設(shè)計(jì)體驗(yàn),最能激發(fā)他們的成就感和進(jìn)一步的求知欲。而根據(jù)了解,學(xué)生們?cè)趯W(xué)習(xí)這個(gè)程序設(shè)計(jì)之前,前期制作過(guò)自己的圖片瀏覽軟件,能通過(guò)按鈕控制圖片在窗口中的移動(dòng)。因此,我從這里切入,逐步完善,而為了思路更清析,我梳理了一個(gè)開(kāi)發(fā)進(jìn)度圖來(lái)描述這個(gè)過(guò)程。
當(dāng)然,在這個(gè)開(kāi)發(fā)設(shè)計(jì)過(guò)程中,有學(xué)生已有的知識(shí)基礎(chǔ),也有一些需要傳授的新的知識(shí)技能和思路方法,在下面的描述中,以教師提示、學(xué)生分析來(lái)區(qū)分授課環(huán)節(jié)的安排。
第一步:在窗體中加入紙片控件,制作紙片垃圾的單次下落過(guò)程
這個(gè)操作對(duì)學(xué)生來(lái)說(shuō)是十分簡(jiǎn)單的入手題。插入圖片控件對(duì)學(xué)生來(lái)講沒(méi)有問(wèn)題。而對(duì)比上述圖片瀏覽軟件中移動(dòng)圖片的效果和現(xiàn)在開(kāi)發(fā)中要實(shí)現(xiàn)的效果,師生分析了以下共同點(diǎn)及需要改進(jìn)之處:(備注:紙片控件名稱(chēng)為Zhipian)。
教師提示:如何實(shí)現(xiàn)紙片下移?(已有知識(shí)儲(chǔ)備)
學(xué)生分析:Zhipian.Top= Zhipian.Top+30s。
及時(shí)鞏固知識(shí)點(diǎn):這個(gè)式子在數(shù)學(xué)上是不成立的,但在程序設(shè)計(jì)中的意思是:把Zhipian.top的值加上30以后再存入Zhipian.Top中,即:使Zhipian.Top增大30。
教師提示:紙片不是用按鈕控制移動(dòng),而是要自動(dòng)持續(xù)不斷地下移(不同之處需改進(jìn))。
學(xué)生分析:控制每毫秒紙片圖片的位置下移固定的像素值,當(dāng)然可以使用前期學(xué)過(guò)的Timer控件。
教師提示:紙片持續(xù)下移位置超過(guò)窗口時(shí),程序?qū)崿F(xiàn)自動(dòng)結(jié)束(不同之處需改進(jìn))。
學(xué)生分析:要使用一個(gè)IF語(yǔ)句來(lái)判斷,紙片是否在窗口內(nèi),是則不斷下掉,否則結(jié)束。
因此判斷的語(yǔ)句為:If Zhipian.Top < Form1.Height Then Zhipian.Top=Zhipian1.Top+30。
教師提示:上述判斷是由Timer控件控制,每毫秒運(yùn)行一次這個(gè)IF語(yǔ)句。
IF判斷的運(yùn)行是由Timer控件控制,所以IF語(yǔ)句應(yīng)該放在Private Sub Timer1_Timer()中。
而Timer控件是在窗體一加載時(shí)就開(kāi)始起作用,即由打開(kāi)窗體這個(gè)事件引發(fā),所以放在Private Sub Form_Load()中。
經(jīng)過(guò)上述分析,得到代碼如下:
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
第二步:在窗體中加入接垃圾的垃圾桶,使紙片垃圾下落到垃圾桶時(shí)就不再顯示了
教師提示:原來(lái)Zhipian的top屬性是和整個(gè)窗口的高度比,超過(guò)這個(gè)高度即結(jié)束,現(xiàn)在要和哪個(gè)數(shù)據(jù)來(lái)比較呢?(備注:垃圾桶控件名稱(chēng)為T(mén)ong)
學(xué)生分析:是低于桶的高度就消失,故應(yīng)該和垃圾桶控件Tong進(jìn)行比較。
經(jīng)過(guò)上述分析,得到代碼如下:
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
第三步:任務(wù)是使紙片循環(huán)不斷下落,而不是只落一次就結(jié)束
教師提示:原來(lái)的IF語(yǔ)句比較Zhipian的top值大于與Tong的top值,程序結(jié)束,而如果需要紙片不斷下落,則應(yīng)從頂部重新落下,Zhipian的top值如何變化?
學(xué)生分析:上一次紙片下落過(guò)程完成后,應(yīng)當(dāng)讓紙片圖片的Top屬性值歸零。
經(jīng)過(guò)上述分析,得到需要修改的IF語(yǔ)句代碼如下:
If Zhipian.Top Zhipian.Top = Zhipian.Top + 30 Else Zhipian.Top = 0 End If 在這個(gè)過(guò)程中,用到了IF語(yǔ)句塊,應(yīng)當(dāng)特別提醒學(xué)生注意寫(xiě)程序代碼時(shí)的縮進(jìn),良好的規(guī)范有利于別人和自己對(duì)程序的閱讀及理解。 第四步:使紙片每次在不同位置下落 教師提示: ①紙片控件(Zhipian)在不同的位置下落,需要Zhipian的什么屬性不同? ②用以前學(xué)習(xí)的什么方法可以實(shí)現(xiàn)隨機(jī)出現(xiàn)的位置? 通過(guò)上述兩個(gè)問(wèn)題的討論,學(xué)生分析得到: 用Zhipian.Left來(lái)控制紙片的左右位置,用Rnd來(lái)實(shí)現(xiàn)取隨機(jī)值的效果,得到代碼: Zhipian.Left = Form1.Width * Rnd 經(jīng)過(guò)修改后,完善代碼如下: If Zhipian.Top < Tong.Top Then Zhipian.Top = Zhipian.Top + 30 Else Zhipian.Top = 0 Zhipian.Left = Form1.Width * Rnd End If 至此,以上程序設(shè)計(jì)已完成了紙片在不同位置隨機(jī)循環(huán)下落的過(guò)程。 第五步:根據(jù)紙片是否落入了垃圾桶中,通過(guò)Label控件顯示得分 既然是游戲,當(dāng)然需要設(shè)置得分,以區(qū)分玩家玩得好不好,那么可以設(shè)計(jì)一個(gè)Label控件,來(lái)實(shí)現(xiàn)計(jì)分的功能。 教師提示:①在什么時(shí)間點(diǎn)進(jìn)行判斷?(即寫(xiě)在程序的哪個(gè)位置)②Zhipian(紙片圖片)的位置在Tong(垃圾桶圖片)中間時(shí),即可加分。那么使用IF語(yǔ)句的判斷條件是什么?③Label控件用于計(jì)分,故起名為Score。 學(xué)生分析:①判斷的時(shí)間應(yīng)在紙片圖片下落到垃圾桶圖片的同高(或超出)時(shí),即應(yīng)當(dāng)寫(xiě)在判斷是否下落到底的IF語(yǔ)句中的Else段中。②紙片落在垃圾桶中,即Zhipian距離窗體左邊(left值)大于Tong距離窗體左邊(left值);同時(shí),Zhipian距離窗體右邊大于Tong距離窗體右邊。問(wèn)題是:如何表示圖片距離右邊的值? 引導(dǎo)學(xué)生思考、討論后得出:距離窗體右邊的值,可以用其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 第六步:使用鍵盤(pán)來(lái)控制垃圾桶的左右移動(dòng) 在這個(gè)環(huán)節(jié),需要學(xué)生了解鍵盤(pán)每個(gè)鍵的鍵值。因此,在講解完鍵盤(pán)控制原理后,給出了控制鍵對(duì)應(yīng)的碼值表。經(jīng)過(guò)多次修正,由淺入深,最終的代碼為: 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,用于控制游戲持續(xù)的時(shí)間)
● 教學(xué)相長(zhǎng)
程序設(shè)計(jì)從最簡(jiǎn)單的圖片(紙片)位置下移入手,逐步加入了控制移動(dòng)結(jié)束、控制多個(gè)紙片下落、使每個(gè)下落的紙片在不同位置隨機(jī)出現(xiàn)、計(jì)算正確得分、最后到鍵盤(pán)控制圖片(垃圾桶)的上下左右移動(dòng)。整個(gè)程序的任務(wù)逐次遞進(jìn),總共分成了六個(gè)漸進(jìn)的步驟,最終完成整個(gè)代碼的設(shè)計(jì)。
在這個(gè)校本課程的教學(xué)實(shí)踐中,不僅教給了學(xué)生知識(shí)方法與綜合應(yīng)用能力,同時(shí)教給學(xué)生的還有解決問(wèn)題的思想,先從簡(jiǎn)單的,能夠入手的問(wèn)題切入,慢慢修正,直至完成設(shè)計(jì)。從一兩句到幾十句,看到自己所寫(xiě)的代碼越來(lái)越長(zhǎng),程序效果慢慢完善,孩子們心中的喜悅與成功感越來(lái)越強(qiáng),這也正是程序設(shè)計(jì)工程中所要經(jīng)歷的種種。VB程序設(shè)計(jì)的教學(xué)不僅要教會(huì)學(xué)生面對(duì)對(duì)象的思想、算法及數(shù)據(jù)結(jié)構(gòu),更需要教師開(kāi)動(dòng)腦筋,設(shè)計(jì)合適的例題,培養(yǎng)學(xué)生不怕困難,抓住要點(diǎn),自頂向下,逐步求精的IT設(shè)計(jì)精神。
正是這個(gè)自主編制的VB校本課程實(shí)例,讓學(xué)生初步領(lǐng)略了程序設(shè)計(jì)的樂(lè)趣,也讓我從中領(lǐng)悟到,程序設(shè)計(jì)的教學(xué)不僅可以教知識(shí)內(nèi)容、算法結(jié)構(gòu),還可以教我們?cè)?jīng)學(xué)過(guò)的軟件工程中程序開(kāi)發(fā)流程和思想等,而這似乎是更有意義的。正如耶魯大學(xué)校長(zhǎng)理查德·查爾斯·萊文說(shuō)的:“有用性的教育,只專(zhuān)注于某一專(zhuān)業(yè)的教育,只重視知識(shí)的傳授,從長(zhǎng)遠(yuǎn)來(lái)講沒(méi)太多價(jià)值。無(wú)用性的通識(shí)教育,賦予學(xué)生更廣闊的視野?!彪m然作為教師不可能離開(kāi)知識(shí)性的傳授,但在知識(shí)傳授中,主觀貫穿的、我們更應(yīng)該注重的卻應(yīng)當(dāng)還有些專(zhuān)業(yè)思想的通識(shí)性教育吧。