宋 晏,姚 琳,張 敏,李 莉
(北京科技大學(xué) 計(jì)算機(jī)與通信工程學(xué)院,北京100081)
計(jì)算思維于2006年由美國(guó)卡內(nèi)基·梅隆大學(xué)的周以真教授系統(tǒng)地提出,一經(jīng)問(wèn)世就引領(lǐng)了世界范圍內(nèi)計(jì)算機(jī)科學(xué)界尤其是計(jì)算機(jī)教育界的發(fā)展方向。她認(rèn)為:計(jì)算思維是運(yùn)用計(jì)算機(jī)科學(xué)的基本概念進(jìn)行問(wèn)題求解、系統(tǒng)設(shè)計(jì)以及人類(lèi)行為理解等一系列思維活動(dòng)[1]。計(jì)算思維將計(jì)算機(jī)作為一種不可或缺的工具,將各行各業(yè)的數(shù)據(jù)、業(yè)務(wù)通過(guò)計(jì)算機(jī)平臺(tái)予以表述、處理。
計(jì)算思維的本質(zhì)是抽象和自動(dòng)化,計(jì)算思維能力的構(gòu)建在程序設(shè)計(jì)類(lèi)課程的學(xué)習(xí)中可以得到很好的詮釋。從分析現(xiàn)實(shí)世界中的問(wèn)題開(kāi)始,在計(jì)算機(jī)世界中為其建模(抽象),最終用計(jì)算機(jī)語(yǔ)言予以實(shí)現(xiàn)(自動(dòng)化),一系列活動(dòng)都充分地展示了計(jì)算思維過(guò)程。
從計(jì)算思維的概念被提出到現(xiàn)在,如何系統(tǒng)地培養(yǎng)計(jì)算思維能力仍處于探索階段,還沒(méi)有一個(gè)系統(tǒng)性的特定教學(xué)設(shè)計(jì)和教學(xué)模式,但毋庸置疑的是,程序設(shè)計(jì)類(lèi)課程的教學(xué)主線(xiàn)應(yīng)按照抽象思維和邏輯思維的培養(yǎng)目標(biāo)搭建,教學(xué)設(shè)計(jì)輕語(yǔ)法、重思維。
計(jì)算思維中的“抽象”解決的是連通現(xiàn)實(shí)世界和計(jì)算機(jī)世界的問(wèn)題,即將現(xiàn)實(shí)世界中的信息用計(jì)算機(jī)世界的符號(hào)描述,也就是將形象思維中的事物映像為計(jì)算機(jī)世界的概念。
近年來(lái),一些學(xué)者提出了“輕游戲”的教學(xué)理念,用寓教于樂(lè)的方式將教育的外在和游戲的內(nèi)涵融為一體,通過(guò)互動(dòng)的方式更好地參與、理解一些經(jīng)典問(wèn)題的解決過(guò)程?!拜p游戲”利用學(xué)習(xí)者的成長(zhǎng)環(huán)境和思維習(xí)慣的特點(diǎn),通過(guò)游戲提高學(xué)習(xí)的趣味性,將形象上升為抽象,將經(jīng)典問(wèn)題中的信息映像到計(jì)算機(jī)世界[2]。
如果游戲過(guò)程可以激發(fā)學(xué)習(xí)興趣并輔助抽象化思維的建立過(guò)程,那么身臨其境地參與游戲的設(shè)計(jì)將是一件富有樂(lè)趣、挑戰(zhàn)性和成就感的事情。設(shè)計(jì)游戲可以更好地實(shí)踐計(jì)算思維中的抽象過(guò)程,并遞進(jìn)式地通過(guò)游戲的各個(gè)環(huán)節(jié)建立對(duì)自動(dòng)化的理解,形成學(xué)習(xí)知識(shí)的心理,積極主動(dòng)地學(xué)習(xí)知識(shí)和內(nèi)化知識(shí),更充分地挖掘程序設(shè)計(jì)課程中的算法思維。
FunCode是一款基于可視化界面設(shè)計(jì)、編寫(xiě)游戲程序的C、C++和Java語(yǔ)言綜合實(shí)驗(yàn)教學(xué)平臺(tái)。學(xué)生可以在可視化的環(huán)境中輕松設(shè)計(jì)游戲界面,添加各種被稱(chēng)為“精靈”的游戲元素,在Visual C++、Eclipse等集成開(kāi)發(fā)環(huán)境中編寫(xiě)代碼。
FunCode平臺(tái)作為小型游戲引擎,對(duì)游戲所涉及的各處理流程的細(xì)節(jié)都進(jìn)行了封裝,它將用戶(hù)與游戲交互的鼠標(biāo)事件、鍵盤(pán)事件以及精靈與精靈碰撞事件、精靈與邊界碰撞事件都抽象為回調(diào)函數(shù),事件發(fā)生時(shí)自動(dòng)調(diào)用,事件處理過(guò)程只需要在這6個(gè)事件函數(shù)中編寫(xiě)。基于平臺(tái)的游戲開(kāi)發(fā)更為簡(jiǎn)潔。
任何事物都具有兩面性,結(jié)合游戲編程平臺(tái)進(jìn)行教學(xué)組織時(shí)必須揚(yáng)長(zhǎng)避短,發(fā)揮游戲及平臺(tái)的優(yōu)勢(shì),避免產(chǎn)生負(fù)面效應(yīng)。
結(jié)合游戲編程平臺(tái)的教學(xué),利用學(xué)習(xí)者熟悉的場(chǎng)景和游戲過(guò)程,幫其掌握對(duì)現(xiàn)實(shí)世界進(jìn)行抽象和算法設(shè)計(jì)的方法。游戲本身不是目標(biāo),而是在設(shè)計(jì)游戲的過(guò)程中完成對(duì)計(jì)算思維能力的訓(xùn)練,提高程序?qū)嵺`能力,潛移默化地引導(dǎo)學(xué)習(xí)者內(nèi)化計(jì)算思維方法。
游戲利用圖形用戶(hù)界面生動(dòng)形象地展現(xiàn)事物和事物的運(yùn)動(dòng),通過(guò)點(diǎn)擊鼠標(biāo)、鍵盤(pán)按鍵控制事物的運(yùn)動(dòng)完成交互,但是教學(xué)不能忽視傳統(tǒng)的控制臺(tái)文本交互,并應(yīng)努力將二者相結(jié)合。
在結(jié)合游戲編程平臺(tái)的教學(xué)設(shè)計(jì)中,可以把游戲作為載體和教學(xué)手段,讓游戲在其所屬的學(xué)習(xí)階段起到思維訓(xùn)練的引領(lǐng)和整合作用,如將其安排在某個(gè)知識(shí)的起點(diǎn)或終點(diǎn),在起點(diǎn)更直觀地建立體驗(yàn),由表象理解到本質(zhì),激發(fā)學(xué)習(xí)興趣;在終點(diǎn)用一種大部頭的方式對(duì)所學(xué)進(jìn)行綜合實(shí)踐,將計(jì)算思維轉(zhuǎn)換為看得見(jiàn)的形象成果,如圖1所示的3步走方式。
游戲案例服務(wù)于教學(xué),案例選擇既要考慮游戲與知識(shí)的相關(guān)度,又要難度適中,真正起到帶動(dòng)學(xué)習(xí)的效果。在FunCode平臺(tái)下進(jìn)行游戲編程的基本步驟包括:①在可視化的圖形環(huán)境下建立游戲場(chǎng)景及精靈對(duì)象;②在游戲主函數(shù)中利用狀態(tài)變量控制游戲的流程;③在初始化函數(shù)中對(duì)游戲進(jìn)行初始化;④在游戲函數(shù)中按游戲規(guī)則編寫(xiě)代碼;⑤在各種事件函數(shù)中進(jìn)行鼠標(biāo)、鍵盤(pán)或碰撞等事件處理。
顯然,構(gòu)建完整游戲所需的環(huán)節(jié)很多,復(fù)雜游戲中每個(gè)環(huán)節(jié)的代碼量也會(huì)很大。為了防止游戲編程平臺(tái)對(duì)當(dāng)前教學(xué)內(nèi)容造成干擾,增加教學(xué)難度,游戲案例在設(shè)計(jì)時(shí)采用統(tǒng)一的接口(play()函數(shù))方式,每個(gè)案例都搭建好游戲框架,只將服務(wù)于當(dāng)前教學(xué)、借力游戲的部分留給學(xué)習(xí)者在該接口中完成設(shè)計(jì)。
在為多分支結(jié)構(gòu)設(shè)計(jì)的游戲案例“蔬菜園”中,用戶(hù)用鼠標(biāo)點(diǎn)擊菜園中的植物,負(fù)責(zé)將植物的名稱(chēng)顯示出來(lái)的功能在函數(shù)void play(int i)中完成,i表示被點(diǎn)中蔬菜的序號(hào)。
在為一維數(shù)組設(shè)計(jì)的游戲案例“猴子選大王”中,選大王的過(guò)程在函數(shù)void play(int array[], int n)中完成,array[]數(shù)組用來(lái)存放n只猴子的狀態(tài),可以通過(guò)該案例學(xué)習(xí)使用一維數(shù)組元素為事物做標(biāo)記的用法。
游戲案例統(tǒng)一設(shè)計(jì)play()函數(shù)作為教學(xué)接口(它的參數(shù)部分隨案例的需要作相應(yīng)調(diào)整),從而規(guī)避游戲平臺(tái)架構(gòu)本身的復(fù)雜度,使案例有的放矢地服務(wù)于當(dāng)前的教學(xué)內(nèi)容。
縱觀各類(lèi)編程語(yǔ)言書(shū)籍的結(jié)構(gòu)安排,自定義函數(shù)通常位于選擇、循環(huán)、數(shù)組之后,用來(lái)實(shí)現(xiàn)“模塊化”的設(shè)計(jì)思想,并在面向?qū)ο蟮某绦蛟O(shè)計(jì)中體現(xiàn)實(shí)體的行為。
圖1 游戲案例的分布和作用
結(jié)合游戲平臺(tái)的編程必然離不開(kāi)函數(shù)的調(diào)用和定義。一方面是游戲程序的架構(gòu)由若干函數(shù)組成,平臺(tái)提供了諸多API函數(shù)供使用;另一方面教學(xué)將main()函數(shù)的定義轉(zhuǎn)移為教學(xué)接口play()函數(shù)的定義,因此教學(xué)設(shè)計(jì)中的函數(shù)部分需要調(diào)整。
與main( )函數(shù)不同,play( )函數(shù)中的參數(shù)問(wèn)題在學(xué)習(xí)伊始就不能回避,需要在使用游戲平臺(tái)進(jìn)行教學(xué)的起點(diǎn)位置即擴(kuò)充自定義函數(shù)的概念,但不必深入到思維的層次,尚不需要建立模塊化的設(shè)計(jì)思想,而只作為模塊化思維的使用者。當(dāng)進(jìn)入“函數(shù)”這個(gè)知識(shí)的正式學(xué)習(xí)階段時(shí),再進(jìn)行模塊化的抽象思維訓(xùn)練,再涉及參數(shù)的值傳遞、地址傳遞、重載、重寫(xiě)等復(fù)雜概念。學(xué)習(xí)過(guò)程如圖2所示。
圖2 結(jié)合游戲編程平臺(tái)的函數(shù)教學(xué)過(guò)程
圖3 自動(dòng)化思維訓(xùn)練的Java教學(xué)設(shè)計(jì)
根據(jù)IEEE發(fā)布的2017年編程語(yǔ)言排行榜數(shù)據(jù),Java語(yǔ)言是企業(yè)招聘中最受歡迎的語(yǔ)言,在用戶(hù)群體上僅位于Python和C語(yǔ)言之后。Java語(yǔ)言以其完全面向?qū)ο?、?jiǎn)單、健壯、安全、可移植性好等特性一直備受歡迎,非常適合以計(jì)算思維培養(yǎng)為目標(biāo)的教學(xué)。
圖3所示為教學(xué)設(shè)計(jì)包含F(xiàn)unCode游戲平臺(tái)計(jì)算思維培養(yǎng)的案例(表示),以及控制臺(tái)模式下的具有游戲基因或?qū)嶋H應(yīng)用場(chǎng)景的一些題目[3](表示)?!镏痢铩铩锏陌咐诮虒W(xué)過(guò)程中難度適中,★★★★的可以作為擴(kuò)展性學(xué)習(xí)使用。
教學(xué)設(shè)計(jì)秉承趣味性加實(shí)用性的風(fēng)格,將問(wèn)題求解提升到計(jì)算思維的高度,探索將傳統(tǒng)教學(xué)與游戲編程相結(jié)合的計(jì)算思維培養(yǎng)模式。以自動(dòng)化思維訓(xùn)練的教學(xué)設(shè)計(jì)為例,設(shè)計(jì)如下。
計(jì)算思維中的自動(dòng)化是對(duì)于機(jī)器而言的,即機(jī)器可以機(jī)械、一步步地按照指令執(zhí)行計(jì)算步驟。實(shí)現(xiàn)機(jī)械自動(dòng)化運(yùn)行的前提條件是在問(wèn)題抽象的過(guò)程中,進(jìn)行精確和嚴(yán)格的符號(hào)標(biāo)記和建模,并明確各個(gè)抽象層次間的聯(lián)系;而實(shí)現(xiàn)機(jī)械的自動(dòng)化控制過(guò)程則體現(xiàn)在利用計(jì)算機(jī)語(yǔ)言進(jìn)行算法的設(shè)計(jì)上。因此,自動(dòng)化思維訓(xùn)練的主體是順序、選擇、循環(huán)3種控制結(jié)構(gòu)的邏輯組建。
以上FunCode平臺(tái)游戲中,“用開(kāi)關(guān)控制燈泡”案例非常簡(jiǎn)單,根據(jù)變量的兩個(gè)取值,令燈泡呈現(xiàn)“亮”或者“滅”的狀態(tài),直接展示控制的效果。“用按鍵控制小魚(yú)游動(dòng)”案例是典型ifelse 的if結(jié)構(gòu)或switch結(jié)構(gòu)的應(yīng)用,用小魚(yú)的不同游動(dòng)方向呈現(xiàn)選擇結(jié)構(gòu)的意義和效果?!安榭词卟藞@”案例是典型的switch結(jié)構(gòu)的應(yīng)用。“打靶計(jì)分”是連續(xù)區(qū)間離散化處理的switch應(yīng)用?!澳嬷脫淇伺啤钡挠螒蛘故玖耸褂胒or循環(huán)實(shí)現(xiàn)遍歷的思想?!俺?jí)瑪麗頂蘑菇的計(jì)分”游戲是使用for循環(huán)進(jìn)行累加計(jì)算的效果展示。這些小游戲都賦予了抽象的順序、選擇、循環(huán)結(jié)構(gòu)以形象的表現(xiàn)。
循環(huán)嵌套的兩個(gè)游戲略為復(fù)雜,它們體現(xiàn)的是多維空間中的遍歷思想?!按┰交鹁€(xiàn)”游戲中設(shè)計(jì)了一個(gè)棋盤(pán)地圖,精靈從(0, 0)處方格出發(fā),點(diǎn)擊精靈相鄰的某個(gè)方格,精靈跳入,遍歷該方格的周邊是否存在怪物,如果存在則精靈被怪物吃掉。教學(xué)設(shè)計(jì)中用play()函數(shù)檢測(cè)鼠標(biāo)點(diǎn)擊精靈周邊某個(gè)方格時(shí)的響應(yīng)?!按虻厥蟆庇螒蛟跇?shù)林里設(shè)有4×4個(gè)坑,每個(gè)坑有一只地鼠,每次會(huì)有一只地鼠隨機(jī)地從某個(gè)坑里冒出頭來(lái),用戶(hù)用木槌敲打它們,每擊中一只地鼠,屏幕頂部會(huì)顯示擊中的數(shù)量。教學(xué)設(shè)計(jì)中用play()函數(shù)遍歷4×4個(gè)坑,判斷木槌是否擊中地鼠。
以思維訓(xùn)練為主線(xiàn),結(jié)合FunCode游戲開(kāi)發(fā)平臺(tái),將游戲融入傳統(tǒng)教學(xué)過(guò)程的Java語(yǔ)言教學(xué)模式、教學(xué)設(shè)計(jì),從賦予編程應(yīng)用場(chǎng)景出發(fā),對(duì)游戲進(jìn)行合理化的設(shè)計(jì),按照為教學(xué)所需的原則抽取一部分游戲環(huán)節(jié)服務(wù)于教學(xué),用游戲的趣味性驅(qū)動(dòng)學(xué)習(xí)的熱情,并自然而然地將形象思維內(nèi)化為抽象思維,按照抽象、自動(dòng)化的路徑達(dá)到了計(jì)算思維的培養(yǎng)目標(biāo)。新模式與傳統(tǒng)模式的更好結(jié)合將在未來(lái)的教學(xué)中進(jìn)一步改進(jìn)、完善。