李慎東
游戲程序加工,對(duì)學(xué)生來(lái)說(shuō)是一個(gè)非常新鮮、感興趣的課題。它不僅可以鍛煉學(xué)生的邏輯思維能力,還能充分發(fā)揮學(xué)生的創(chuàng)造力。設(shè)計(jì)“游戲程序加工”教學(xué)內(nèi)容,主要是為了開(kāi)啟游戲程序設(shè)計(jì)之門(mén),使每個(gè)學(xué)生都能領(lǐng)會(huì)信息的編程加工的原理和方法。因此我基于VB程序設(shè)計(jì)平臺(tái)以“雷電”程序的加工為例,對(duì)教學(xué)進(jìn)行了精心的設(shè)計(jì)與程序?qū)崿F(xiàn)的策劃,通過(guò)學(xué)生體驗(yàn)游戲程序的加工以充分達(dá)到教學(xué)目標(biāo)。
根據(jù)教材(《信息技術(shù)基礎(chǔ)》,上海教育科學(xué)出版社出版)課標(biāo)要求,這節(jié)內(nèi)容主要講述在VB編程環(huán)境下讓學(xué)生體驗(yàn)信息的編程加工的過(guò)程。因此在本課中我借助Moodle教學(xué)平臺(tái),以“游戲程序的簡(jiǎn)單加工”為主線,從學(xué)生通過(guò)VB源程序體驗(yàn)游戲并發(fā)現(xiàn)游戲存在的問(wèn)題著手,引導(dǎo)學(xué)生學(xué)會(huì)查看對(duì)象、修改對(duì)象屬性和變量值,以小組合作形式讓學(xué)生嘗試解決游戲存在的問(wèn)題,試圖閱讀程序代碼和代碼添加,使學(xué)生明白通過(guò)編寫(xiě)程序代碼就可以完善程序的功能。在教學(xué)過(guò)程中通過(guò)學(xué)生體驗(yàn)游戲程序加工過(guò)程再到知識(shí)歸納,充分體現(xiàn)隱性知識(shí)到顯性知識(shí)的轉(zhuǎn)化。下面我就結(jié)合教學(xué)實(shí)際,談一談“雷電”游戲程序加工在教學(xué)中的實(shí)現(xiàn)過(guò)程。
一、“雷電”游戲的設(shè)計(jì)思想
完成此游戲程序設(shè)計(jì)涉及以下幾個(gè)方面的內(nèi)容:①敵方飛機(jī):移動(dòng)(為簡(jiǎn)化程序,將敵機(jī)置為不動(dòng))、生命值(當(dāng)被我方子彈擊中后,生命值就減1,生命值為0時(shí)則我方贏,游戲結(jié)束)、子彈數(shù)(永遠(yuǎn)夠用)、子彈射擊的路徑(設(shè)置為無(wú)規(guī)則的曲線路徑射擊)。②我方飛機(jī):移動(dòng)(按“a、d、s、w”鍵時(shí)飛機(jī)“左、右、上、下”移動(dòng),飛機(jī)移動(dòng)時(shí),子彈跟著飛機(jī)一起移動(dòng))、子彈射擊(點(diǎn)擊鼠標(biāo)左鍵或按“,”鍵時(shí)發(fā)射子彈,每按一次子彈數(shù)減1,子彈數(shù)為0時(shí)則我方輸了,游戲結(jié)束)、子彈射擊路徑(垂直發(fā)射)、生命值(被敵方擊中1次則生命值減1,生命值為0時(shí)則我方輸,游戲結(jié)束)。③控制鍵的檢測(cè):通過(guò)文本框的SetFocus功能獲取光標(biāo)焦點(diǎn),檢測(cè)按鍵執(zhí)行相應(yīng)功能。④敵方與我方子彈射擊速度各由一個(gè)計(jì)時(shí)器控制。
二、簡(jiǎn)單的對(duì)象屬性、變量值的修改
課程中設(shè)計(jì)從學(xué)生體驗(yàn)并發(fā)現(xiàn)“雷電游戲”存在的問(wèn)題切入,學(xué)生在體驗(yàn)中發(fā)現(xiàn)我方飛機(jī)只能左移且移動(dòng)速度慢、控制鼠標(biāo)左鍵發(fā)射子彈、子彈數(shù)太少、生命值不夠、敵方飛機(jī)不能動(dòng)、敵機(jī)子彈無(wú)規(guī)則地曲線發(fā)射。
針對(duì)學(xué)生發(fā)現(xiàn)的問(wèn)題,經(jīng)過(guò)反復(fù)的思考與設(shè)計(jì),我巧妙地將問(wèn)題串起來(lái),同時(shí)也呈現(xiàn)了程序設(shè)計(jì)的基本過(guò)程。通過(guò)講解先讓學(xué)生了解程序的編寫(xiě)環(huán)境、界面的對(duì)象及基本屬性、查看與理解基本程序代碼,以便各組學(xué)生能順利地完成如下列表中的任務(wù)。
各組任務(wù)及指引表
各組任務(wù)既有梯度又有相似性,梯度表現(xiàn)在:從程序界面對(duì)象屬性的修改到變量值、代碼參數(shù)的修改,遵循了程序設(shè)計(jì)的思想;相似性表現(xiàn)在各組修改的都是數(shù)值,簡(jiǎn)單易懂。
三、如何實(shí)現(xiàn)多功能的代碼添加
教師提供給學(xué)生的雷電源程序,功能少漏洞多,希望同學(xué)們通過(guò)加工雷電程序,能夠使得程序功能更加完善。上述活動(dòng)是教學(xué)目標(biāo)達(dá)成的一個(gè)重要過(guò)程,要圓滿完成本節(jié)教學(xué)任務(wù),需要更深層次地拓展教學(xué)內(nèi)容。由于學(xué)生對(duì)程序代碼的陌生,教學(xué)設(shè)計(jì)中只能采取以誘善引的策略,逐步使學(xué)生了解程序代碼的編寫(xiě)過(guò)程,使學(xué)生既不產(chǎn)生對(duì)程序代碼的恐懼感,又能成功地添加代碼完善游戲功能,成就感會(huì)使學(xué)生保持良好的學(xué)習(xí)興趣。所以在源程序中只編寫(xiě)了簡(jiǎn)化后飛機(jī)左移的代碼。學(xué)生主動(dòng)查找飛機(jī)左移的代碼在哪里,并試圖理解飛機(jī)左移代碼:
If KeyAscii = Asc("a") Then '如果按的是a鍵,就執(zhí)行下面語(yǔ)句
myplayer.Left = myplayer.Left – 30'我方飛機(jī)向左移動(dòng)30個(gè)緹(單位)
End If'結(jié)束判斷
在教師的提示下學(xué)生很快便能掌握“if”和“end if”是成對(duì)出現(xiàn)的條件語(yǔ)句,可以用來(lái)判斷按鍵情況,以執(zhí)行相應(yīng)語(yǔ)句。(語(yǔ)句中的KeyAscii和Asc(“a”)不再過(guò)多解釋,學(xué)生可課后查閱相關(guān)知識(shí)。)接下來(lái)學(xué)生便可參照飛機(jī)“左移代碼”,兩個(gè)學(xué)生為一組探討添加“右移代碼”就簡(jiǎn)單多了。大部分學(xué)生通過(guò)復(fù)制“左移代碼”到“右移代碼”提示處,再將“a”改成“d”。把“myplayer.left”改成“myplayer.right”,按照正常理解思路是對(duì)的,可是我們回過(guò)頭來(lái)查看一下“myplayer”的對(duì)象屬性,在位置屬性里只有“l(fā)eft”和“top”,沒(méi)有“right”的屬性,因此需要理解的是“改變(減少或增加)對(duì)象與窗體左邊之間的距離就能實(shí)現(xiàn)飛機(jī)的左右移動(dòng)”,即執(zhí)行右移的語(yǔ)句為:
myplayer.Left = myplayer.Left + 100
游戲程序加工,除了要求每個(gè)學(xué)生都能完成上述基本的活動(dòng)任務(wù)外,更要強(qiáng)調(diào)學(xué)生創(chuàng)造力的發(fā)揮,要求學(xué)生課后有選擇地、有創(chuàng)造性地去修改游戲程序,比一比誰(shuí)加工的游戲程序功能更多、更合理,并要求學(xué)生一周后提交作品,教師對(duì)學(xué)生的優(yōu)秀作品進(jìn)行點(diǎn)評(píng)。
四、程序代碼(僅提供關(guān)鍵部分程序代碼)
Dim enemylife As Integer'敵方生命值
Dim mylife As Integer'你的生命值
Dim fs As Boolean'判斷子彈發(fā)射
Dim bullet As Integer'子彈數(shù)目
Private Sub Form_Load() '程序開(kāi)始運(yùn)行時(shí)初始化數(shù)據(jù)
enemylife = 10
fs = True
bullet = 10
La1.Caption = enemylife
mylife = 3
Label3.Caption = mylife
Label5.Caption = bullet
End Sub
Private Sub Form_Click()'點(diǎn)擊鼠標(biāo)時(shí)子彈發(fā)射
If bullet <> 0 And enemylife <> 0 And mylife <> 0
Then
mybullet.Visible = True: Timer1.Enabled = True
bullet = bullet - 1 '子彈數(shù)減1
Label5.Caption = bullet
End If
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
Text1.Text = ""
Text1.SetFocus
If fs = True Then
mybullet.Left = myplayer.Left + myplayer.Width / 2
'子彈未發(fā)射,我方飛機(jī)左移時(shí),子彈跟著左移.
End If
If KeyAscii = Asc("a") Then
myplayer.Left = myplayer.Left - 30
End If
'此處可添加按鍵控制的代碼,如右移等
End Sub
'計(jì)時(shí)器1控制我方子彈移動(dòng)速度程序段
'計(jì)時(shí)器2控制敵方子彈移動(dòng)速度程序段
'游戲結(jié)束程序段
'游戲開(kāi)始程序段
(作者單位:廣東廣州市第五中學(xué))