梁見斌
為讓學生通過仿真實踐,體驗使用計算機編程解決問題的全過程,掌握分支和循環等算法結構,熟練使用Python內置模塊和自定義函數,理解模塊化編程思想,筆者嘗試使用海龜繪圖模塊編程來設計簡單的物理仿真程序。從仿真自由落體運動、平拋運動和斜拋運動,到實現漫天煙花效果,項目難度不斷進階,最后鼓勵學有余力的學生自主學習交互式操作和面向對象編程方法,獲得更炫目的漫天煙花視覺效果,逐步形成了從易到難的計算思維的培養。
項目一:繪制自由落體運動物體徑跡圖
仿真技術是利用計算機并通過建立模型進行科學實驗的一門多學科綜合性技術。人們對現實系統進行簡化和模仿,建立相關模型,并對該模型進行試驗,從中得到所需的信息,然后幫助人們更好地理解現實世界。
在物理課上,由于實驗條件的限制,沒有暗室操作頻閃照片的實驗,只能簡單介紹其工作原理,學生缺乏對頻閃照片的感性認識,不能準確理解物理過程。教師可以根據自由落體運動規律,使用編程繪圖動態模擬運動過程,并獲得相應的仿真實驗照片,幫助學生理解物理規律。
為了讓學生體驗使用計算機編程解決問題的全過程,教師可以將實際實驗獲得的頻閃照片和仿真實驗繪制的粒子徑跡圖展示給學生,先讓學生分析如何抽象建模和設計算法,再編寫代碼和調試程序。因為本項目的重點是解析算法的應用,如果學生對繪圖模塊不是很熟悉,教師可以提供半成品參考代碼,對繪圖相關語句進行說明,學生只需填寫計算坐標的核心代碼。
繪制自由落體運動粒子徑跡圖的算法比較簡單,只需設置好初始位置坐標,然后每隔一段時間獲取t時刻物體的位置坐標,并在該位置繪制一個白色小球即可。根據自由落體運動規律,小球的x坐標不變,t時間內下落高度為h=0.5*g*t*t。這是典型的解析算法,只要學生熟悉物理公式,就可以直接寫出賦值語句。
因為海龜在屏幕中移動的距離是以像素為單位,所以我們需要為下落高度乘以一個放大倍數mult,以獲得合適的距離;同時考慮海龜的運動方向與y軸正方向相反,故計算y坐標的解析式為y=-0.5*g*t*t*mult。
為了獲得理想的仿真實驗效果,還可以引導學生對程序進行多次調試,合理設置時間間隔、放大倍數和重力加速度等參數值。核心代碼略。
項目二:繪制平拋運動物體徑跡圖
在自由落體運動的基礎上,可以讓學生進一步研究平拋運動。平拋運動分解為水平方向的勻速直線運動和豎直方向的自由落體運動,教師可以引導學生先繪制兩個分運動的頻閃照片,再處理合運動,通過對比分析3個小球的頻閃照片,可以更好地理解物理模型。
有了模擬自由落體運動的程序,模擬平拋運動的代碼不難寫出,只需在原有代碼的基礎上增加一個表示水平初速度的變量vx,并在循環體中增加計算水平位移的賦值語句x=vx*t*mult即可。核心代碼略。
項目三:繪制斜拋運動物體徑跡圖
學生掌握仿真平拋運動的方法后,可以進一步擴展到斜拋運動,并使用這個例子來進行自定義函數的教學。
一些教師在教授自定義函數時,把重點放在了語法教學上,筆者認為這是不妥當的。Python的自定義函數語法相當復雜,其形式參數就有必需參數、關鍵字參數、默認參數、不定長參數等多種類型,更別說各種實參的變異寫法和復雜的閉包語法了。這些復雜的語法不是光靠死記硬背就能掌握的,需要多次實踐的積累才能逐步理解。題目是做不完的,知識也教不完,“師傅領進門,修行靠個人”,教師主要起到引導學生入門和指明前進方向的作用,具體的知識和技能還是要靠學生自己去領悟和理解。
筆者認為,自定義函數的教學重點應該是讓學生理解模塊化編程的作用,初步掌握模塊化編程的方法,能夠根據需要設計自定義函數(包括明確函數功能、設置參數和返回值、給出樣例演示等)。其中,設計自定義函數是重中之重,需要反復練習和比較,力求達到意義明確、格式規范、表述簡明的目標。
模塊化的目的是降低程序復雜度,使程序設計、調試和維護等操作簡單化。利用函數,可以實現程序的模塊化,使得程序設計更加簡單和直觀,從而提高程序的易讀性和可維護性。那么本案例需要把哪些功能模塊化?又如何設計函數呢?
分析斜拋運動粒子徑跡圖,發現它是由一個個處在特定位置的白色小球排列而成,因此可以把繪制一組白色的斜拋運動粒子作為基本功能模塊。那么,要把斜拋運動粒子徑跡圖繪制出來,需要明確它的哪些屬性呢?(其實這里已經暗含面向對象的思想了,只不過時機未到,暫時不點破)
教師可以引導學生從函數功能、函數名、參數表和返回值的角度逐個分析,最后整理出一份完整的函數頭說明文檔。參考示例略。
項目四:同時繪制多個粒子(單個煙花)斜拋運動徑跡圖
自定義函數oblique_throw()只能繪制單個粒子斜拋運動徑跡圖,為了實現漫天煙花的效果,先要學會同時繪制多個粒子斜拋運動徑跡圖的方法。
在繪制單個粒子徑跡圖時,只需使用一重循環,計算出粒子在各時刻的位置坐標,并在該位置繪制一個代表該粒子的圓點即可。為了同時繪制多個粒子的徑跡圖,需要使用二重循環,其中外層循環控制時間,內層循環依次繪制各個粒子。
為了對不同的粒子進行區分,需要設置3個列表v、a、c分別表示各粒子的初速度、角度和顏色信息,并通過使用隨機數模塊來為各個粒子設置不同的顏色和初速度等屬性。
為了實現煙花效果,需要設置合理的粒子數量、放大倍數和重力加速度值,并為每一朵煙花(粒子群)設置一支畫筆,刷新每一幀畫面。在繪制完該粒子群的所有圖像后,還要清除畫筆,讓煙花消失,才能繪制另一朵煙花。
同樣,教師可以引導學生分析函數功能、函數名、參數表和返回值,整理出函數頭說明文檔。參考示例略。
項目五:交互式操作和面向對象(點放漫天煙花效果)編程方法
自定義函fireworks()雖然通過同時繪制多個粒子斜拋運動徑跡圖的方法,實現了放煙花的動態效果,但是它每次只能繪制一朵煙花,而且顏色不能動態變化,與實際的煙花效果還有一段距離。要想獲得更絢麗的漫天煙花效果,需要使用面向對象的編程技術,構造一個煙花類,可以同時生成多個煙花實例,四處綻放,還可以采用交互方式,實現在鼠標點擊處生成煙花的功能。
面向對象編程思想更符合人類的自然思維方式,學生理解起來比較自然,可以把源代碼和相關資料提供給學生,鼓勵學有余力的學生課后自學,通過調整參數、修改代碼,實現更為炫目的煙花效果。
綜合以上分析,上述項目從最簡單的“繪制自由落體運動物體徑跡圖”開始,逐次增加難度,學生面對的每一次挑戰都是建立在之前經驗的基礎上,并不顯得突兀,遵循“最近發展區”教學規律。項目一和項目二,主要學習解析算法和使用繪圖模塊編寫物理仿真程序的基本原理,相對簡單,可以在一個課時里完成教學任務;項目三和項目四,主要學習自定義函數的構造和使用方法,其中項目四還運用了列表和二重循環等難度較大的知識點,綜合度較高,預計需要兩個課時;項目五需要用到交互式操作和面向對象編程方法,已經超出了高中信息技術必修課的教學要求,但是趣味性比較高,而且難度也不大,可以引導學有余力的學生通過自學實現相關功能。
蒼山點題
計算思維作為信息技術學科核心素養之一,是信息化社會中數字公民所應具備的基本素養?,F在普遍的觀點是在編程教學中更容易培養計算思維,計算思維培養的模式、實踐與案例也是新課程教學研究中最受關注的焦點。
第一篇文章,對計算思維內涵及其對學生發展的意義進行分析,提出計算思維的培養應夯實學生信息技術學科思想和方法基礎,培養學生運用計算思維解決問題的關鍵能力,以簡明、實操性強的教學模式來指引教師在教學中落實計算思維,并提出“不插電的計算思維”等直觀教學、基于問題解決的計算思維培養以及在教學中的應用等教學策略和方法。
第二篇文章,通過對“繪制自由落體運動物體徑跡圖、繪制平拋運動物體徑跡圖、繪制斜拋運動物體徑跡圖、繪制多個粒子(單個煙花)斜拋運動徑跡圖、交互式操作和面向對象(點放漫天煙花效果)編程方法”五個項目的進階設計,基本可以讓學生熟悉解析算法的基本特征,掌握自定義函數的基本方法,理解模塊化編程和面向對象編程的基本思想。在編程實踐過程中,學生還加深了對物理規律的理解,掌握了物理仿真技術的基本方法,從而可以使用編程繪圖等工具去實現更多更復雜的物理仿真模型,提升計算思維水平。