汪紅兵 姚琳 張敏 武航星 李莉
摘要:軟件課程設(shè)計(jì)是大學(xué)生計(jì)算機(jī)實(shí)踐教育體系中的重要環(huán)節(jié)。通過(guò)具有較高顯示度的作品激發(fā)學(xué)生學(xué)習(xí)興趣,使得學(xué)生在做完課程實(shí)踐之后具有強(qiáng)烈的成就感,是做好軟件課程設(shè)計(jì)的關(guān)鍵。作為基于游戲界面的C、C++和Java語(yǔ)言綜合實(shí)驗(yàn)教學(xué)平臺(tái),F(xiàn)uncode完全滿足這些要求。本文在簡(jiǎn)要介紹我校計(jì)算機(jī)應(yīng)用實(shí)踐體系之后,對(duì)Funcode平臺(tái)的使用、教學(xué)案例設(shè)計(jì)、教學(xué)效果等進(jìn)行了詳細(xì)的解析。今后需要結(jié)合計(jì)算思維的培養(yǎng)要求,將抽象的計(jì)算思維轉(zhuǎn)化為直觀的游戲精靈,進(jìn)一步據(jù)此建立基于Funcode平臺(tái)的計(jì)算思維訓(xùn)練平臺(tái)。
關(guān)鍵詞:Funcode;軟件課程設(shè)計(jì);實(shí)踐教育體系;計(jì)算思維
中圖分類(lèi)號(hào):G642.41 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1674-9324(2016)31-0253-03
一、背景
當(dāng)前正處于知識(shí)經(jīng)濟(jì)時(shí)代,社會(huì)需要高校培養(yǎng)更多的理論和應(yīng)用兼?zhèn)涞膬?yōu)秀人才,要求學(xué)生具有較高的信息素養(yǎng)和信息處理能力。因此,社會(huì)和時(shí)代迫切需要提高程序設(shè)計(jì)類(lèi)實(shí)踐性課程的教學(xué)質(zhì)量和教學(xué)效果,要求在人才培養(yǎng)模式上進(jìn)行相應(yīng)的改革和創(chuàng)新,促使課程體系、教學(xué)內(nèi)容、教學(xué)方法等緊跟社會(huì)發(fā)展的步伐。但是,教學(xué)質(zhì)量的提高、教學(xué)效果的加強(qiáng)和高素質(zhì)人才的培養(yǎng)不是只靠理論教學(xué)就可以達(dá)到的,同樣離不開(kāi)與理論教學(xué)同等重要的實(shí)踐教學(xué)。一般來(lái)說(shuō),計(jì)算機(jī)實(shí)踐教學(xué)往往存在以下問(wèn)題:
1.實(shí)踐教學(xué)以驗(yàn)證為主,難以培養(yǎng)學(xué)生創(chuàng)新能力。目前在程序設(shè)計(jì)課程的課內(nèi)實(shí)驗(yàn)中,為了鞏固理論課堂所講解的語(yǔ)法規(guī)則和算法,采取驗(yàn)證性的實(shí)驗(yàn)居多,學(xué)生只需要按照實(shí)驗(yàn)指導(dǎo)書(shū)的步驟,即可得到理想的實(shí)驗(yàn)結(jié)果,完成實(shí)驗(yàn)。這很容易導(dǎo)致學(xué)生實(shí)際動(dòng)手能力、創(chuàng)新能力的不足。
2.教學(xué)案例與現(xiàn)實(shí)問(wèn)題結(jié)合不密切。理論教學(xué)過(guò)程中以經(jīng)典算法為基礎(chǔ),對(duì)基本概念、語(yǔ)法和程序設(shè)計(jì)知識(shí)進(jìn)行講解,采用的大多是比較抽象的案例,與現(xiàn)實(shí)問(wèn)題有一定差距。對(duì)于大學(xué)一年級(jí)學(xué)生,既枯燥又難以理解,常常感到課堂上聽(tīng)懂算法思想,當(dāng)自己編程解決問(wèn)題時(shí),又覺(jué)得無(wú)從下手。
3.實(shí)踐教學(xué)內(nèi)容單一、枯燥,學(xué)生缺乏學(xué)習(xí)興趣。程序設(shè)計(jì)課程中,首先介紹數(shù)據(jù)類(lèi)型、語(yǔ)法規(guī)則、基本程序設(shè)計(jì)框架和函數(shù)定義等基礎(chǔ)知識(shí),課內(nèi)實(shí)驗(yàn)內(nèi)容一般與課程的知識(shí)點(diǎn)相對(duì)應(yīng),一個(gè)實(shí)驗(yàn)對(duì)應(yīng)一部分知識(shí)點(diǎn),內(nèi)容比較單一、枯燥。綜合性的實(shí)驗(yàn)受時(shí)間、學(xué)生理解等多種因素影響,練習(xí)相對(duì)比較少。而學(xué)生的自學(xué)能力與主動(dòng)學(xué)習(xí)的意識(shí)不高,很多學(xué)生課外很少主動(dòng)做練習(xí),欠賬后更缺乏學(xué)習(xí)興趣。如何激發(fā)學(xué)生對(duì)程序設(shè)計(jì)課程的興趣,調(diào)動(dòng)學(xué)生的學(xué)習(xí)積極性,培養(yǎng)學(xué)生創(chuàng)新能力、計(jì)算思維能力,是教學(xué)中亟待解決的一個(gè)難題。
“實(shí)踐是催生創(chuàng)新的動(dòng)力源泉”。近年來(lái)我校一直強(qiáng)化計(jì)算機(jī)類(lèi)課程的實(shí)踐教學(xué),以增強(qiáng)學(xué)生利用計(jì)算機(jī)解決實(shí)際問(wèn)題的應(yīng)用能力,順應(yīng)當(dāng)前信息社會(huì)發(fā)展和工程教育認(rèn)證的需要為目標(biāo)?;贔uncode平臺(tái)的軟件課程設(shè)計(jì)是計(jì)算機(jī)實(shí)踐教學(xué)體系改革中重要環(huán)節(jié)。
二、我校的計(jì)算機(jī)實(shí)踐教育體系
需要說(shuō)明的是,這里的計(jì)算機(jī)實(shí)踐教育體系指的是我校非計(jì)算機(jī)專(zhuān)業(yè)的計(jì)算機(jī)相關(guān)課程第二個(gè)學(xué)習(xí)階段的實(shí)踐教育體系。第一個(gè)學(xué)習(xí)階段,非計(jì)算機(jī)專(zhuān)業(yè)學(xué)生主要按照大專(zhuān)業(yè)分類(lèi)學(xué)習(xí)不同知識(shí)模塊組成的計(jì)算機(jī)基礎(chǔ);第二個(gè)學(xué)習(xí)階段,非計(jì)算機(jī)專(zhuān)業(yè)學(xué)生按照理工和非理工類(lèi)進(jìn)行劃分,非理工類(lèi)學(xué)生學(xué)習(xí)多媒體相關(guān)課程并據(jù)此進(jìn)行有關(guān)實(shí)踐活動(dòng),理工類(lèi)學(xué)生學(xué)習(xí)程序設(shè)計(jì)語(yǔ)言課程并據(jù)此進(jìn)行有關(guān)實(shí)踐活動(dòng)。
針對(duì)程序設(shè)計(jì)基礎(chǔ)課程,需要在課堂教學(xué)中設(shè)置單元實(shí)驗(yàn)來(lái)鞏固課堂教學(xué)所講授的知識(shí)點(diǎn),也可以在教學(xué)后期由教師根據(jù)需要設(shè)置一些綜合實(shí)驗(yàn)來(lái)串聯(lián)各個(gè)知識(shí)點(diǎn),例如可以設(shè)置一個(gè)排序?qū)嶒?yàn),可以根據(jù)鍵盤(pán)輸入的選擇來(lái)完成對(duì)整數(shù)、字符、字符串和對(duì)象構(gòu)成的集合進(jìn)行排序。學(xué)生在完成課堂實(shí)驗(yàn)教學(xué)之后,在當(dāng)年的暑期即進(jìn)入軟件課程設(shè)計(jì)。由于VB語(yǔ)言教學(xué)中已經(jīng)具有窗口功能,VB的軟件課程設(shè)計(jì)一般沿用課堂教學(xué)需要延展的綜合性案例。C和C++語(yǔ)言在日常教學(xué)過(guò)程中沒(méi)有涉及到窗口設(shè)計(jì),學(xué)生做的幾乎所有實(shí)驗(yàn)的運(yùn)行結(jié)果都是命令行的顯示方式,迫切需要一種更能激發(fā)學(xué)生興趣且具有較高顯示度的方式來(lái)支持C和C++的軟件課程設(shè)計(jì)。Funcode平臺(tái)是一個(gè)很好的選擇。當(dāng)然,學(xué)生在完成課程設(shè)計(jì)之后,還可以參加相應(yīng)的程序設(shè)計(jì)大賽和SRTP項(xiàng)目,繼續(xù)加強(qiáng)對(duì)程序設(shè)計(jì)語(yǔ)言的實(shí)踐學(xué)習(xí)。
三、基于Funcode平臺(tái)的軟件課程設(shè)計(jì)
(一)Funcode平臺(tái)介紹
Funcode是一款全新的基于游戲和動(dòng)畫(huà)界面的C、C++和Java語(yǔ)言綜合實(shí)驗(yàn)教學(xué)平臺(tái)。基于Funcode平臺(tái),學(xué)生用課堂里學(xué)到的程序設(shè)計(jì)知識(shí),即能輕松開(kāi)發(fā)出一款互動(dòng)式游戲或應(yīng)用系統(tǒng)。Funcode旨在點(diǎn)燃學(xué)生學(xué)習(xí)激情,激發(fā)學(xué)生創(chuàng)新靈感,培養(yǎng)學(xué)生綜合編程能力,最大程度減輕教師的工作負(fù)擔(dān)。Funcode包含界面設(shè)計(jì)和項(xiàng)目開(kāi)發(fā)兩大模塊。學(xué)生在編輯器中輕松設(shè)計(jì)游戲界面、特效、各種精靈(動(dòng)態(tài)精靈和靜態(tài)精靈),在VC++(或其他IDE)中編寫(xiě)代碼,完成各種定制功能。
Funcode平臺(tái)實(shí)際是一個(gè)小型游戲引擎,對(duì)涉及處理流程的細(xì)節(jié)進(jìn)行了封裝,將游戲運(yùn)行過(guò)程劃分為游戲初始化、游戲運(yùn)行和游戲結(jié)束三個(gè)函數(shù)。
以下代碼是關(guān)于CGameMain類(lèi)的成員函數(shù)GameMainLoop,該函數(shù)在main函數(shù)中被循環(huán)重復(fù)調(diào)用來(lái)運(yùn)行游戲。成員函數(shù)GameMainLoop內(nèi)部,涉及初始化游戲、游戲運(yùn)行和運(yùn)行結(jié)束三種狀態(tài),分別使用GameInit函數(shù)完成游戲初始化功能、使用GameRun函數(shù)執(zhí)行游戲運(yùn)行功能,使用GameEnd函數(shù)執(zhí)行游戲結(jié)束功能,三種狀態(tài)按如下代碼進(jìn)行切換。
void CGameMain::GameMainLoop(float fDeltaTime)
{
switch( GetGameState() )
{
// 初始化游戲,清空上一局相關(guān)數(shù)據(jù)
case 1:
GameInit();
// 初始化之后,將游戲狀態(tài)設(shè)置為進(jìn)行中
SetGameState(2);
break;
// 游戲進(jìn)行中,處理各種游戲邏輯
case 2:
GameRun( fDeltaTime );
if(……) GameEnd();
break;
// 游戲結(jié)束/等待按空格鍵開(kāi)始
case 0:
// 通過(guò)設(shè)置游戲狀態(tài)可以讓游戲重新開(kāi)始
break;
}
}
此外,F(xiàn)uncode平臺(tái)將游戲中所涉及的各類(lèi)實(shí)體劃分為靜態(tài)精靈和動(dòng)態(tài)精靈,將精靈與精靈、精靈與邊界的交互抽象為回調(diào)函數(shù),使得當(dāng)事件發(fā)生時(shí)系統(tǒng)會(huì)自動(dòng)地進(jìn)行調(diào)用。如下函數(shù):
void CGameMain::OnSpriteColSprite(const char *szSrcName,const char *szTarName);
在精靈和精靈發(fā)生碰撞時(shí)會(huì)自動(dòng)被回調(diào),其中szSrcName指針指向發(fā)起碰撞的精靈,而szTarName指針指向接受碰撞的精靈。如下函數(shù):
void CGameMain::OnSpriteColWorldLimit(const char *szName,const int iColSide);
在精靈與邊界發(fā)生碰撞時(shí)會(huì)自動(dòng)被回調(diào),其中,szName指針指向發(fā)起碰撞的精靈,iColSide確定精靈與邊界碰撞的方向,其中值為0表示與左邊邊界碰撞,值為1表示與右邊邊界碰撞,值為2表示與上邊邊界碰撞,值為3表示與下邊邊界碰撞。
最后,F(xiàn)uncode將用戶(hù)與游戲的交互劃分為鍵盤(pán)和鼠標(biāo)兩類(lèi),并提供相應(yīng)的函數(shù)自動(dòng)處理,如下所示:
void CGameMain::OnKeyUp(const int iKey);
void CGameMain::OnKeyDown(const int iKey,const bool bAltPress,const bool bShiftPress,const bool bCtrlPress);
void CGameMain::OnMouseUp(const int iMouseType,const float fMouseX,const float fMouseY);
void CGameMain::OnMouseClick(const int iMouseType,const float fMouseX,const float fMouseY);
void CGameMain::OnMouseMove(const float fMouseX,const float fMouseY);
所有這些為學(xué)生進(jìn)行代碼編寫(xiě)帶來(lái)了極大的方便,實(shí)際上學(xué)生只需要根據(jù)項(xiàng)目需要完成這些函數(shù)的實(shí)際功能即可。
(二)教學(xué)案例設(shè)計(jì)
Funcode平臺(tái)中提供了大量的教學(xué)案例,如海底世界、黃金礦工、拼圖游戲、桌球游戲、拍飛蟲(chóng)、打飛碟、太空戰(zhàn)機(jī)和坦克大戰(zhàn)等傳統(tǒng)小游戲。
學(xué)生根據(jù)需要,可以選擇Funcode中自帶的教學(xué)案例,教師需提供簡(jiǎn)單的功能說(shuō)明,鼓勵(lì)學(xué)生增加新的功能,如積分、排名和倒計(jì)時(shí)等。此外,鼓勵(lì)學(xué)生積極設(shè)計(jì)新的游戲,充分利用各種多媒體工具制作素材,發(fā)揮團(tuán)隊(duì)作戰(zhàn)效能,按照制作腳本、素材準(zhǔn)備、Funcode制作和運(yùn)行優(yōu)化的步驟有計(jì)劃、有步驟地完成軟件課程設(shè)計(jì)。下表分別為C++和C課堂學(xué)生自選課題和選擇Funcode平臺(tái)中題目的比例。
四、應(yīng)用Funcode平臺(tái)的軟件課程設(shè)計(jì)的教學(xué)效果
(一)Funcode平臺(tái)使用情況介紹
對(duì)于2014~2015學(xué)年夏季學(xué)期,全校大約有3300名學(xué)生參加暑期實(shí)踐。暑期實(shí)踐分為計(jì)算機(jī)實(shí)踐、英語(yǔ)夏令營(yíng)和創(chuàng)業(yè)訓(xùn)練三個(gè)部分。其中,選擇參加計(jì)算機(jī)實(shí)踐的學(xué)生大約為1600名,近50%。這其中,選擇參加C和C++Funcode游戲設(shè)計(jì)的學(xué)生大約1200名,選擇Office綜合練習(xí)的約300名,選擇VB窗口系統(tǒng)設(shè)計(jì)的約120名。
(二)教學(xué)反饋
軟件課程設(shè)計(jì)結(jié)束后,基于學(xué)校課程中心提供的在線調(diào)查功能對(duì)學(xué)生進(jìn)行了教學(xué)效果的網(wǎng)絡(luò)調(diào)查。下面分別從課程對(duì)培養(yǎng)團(tuán)隊(duì)精神的重要性、使用程序設(shè)計(jì)語(yǔ)言的體驗(yàn)感和成就感以及綜合評(píng)價(jià)四個(gè)方面分別進(jìn)行說(shuō)明。
五、總結(jié)與展望
基于Funcode平臺(tái)進(jìn)行C和C++軟件課程設(shè)計(jì)達(dá)到應(yīng)有的目標(biāo),在培養(yǎng)學(xué)生團(tuán)隊(duì)能力、提升學(xué)生使用C和C++程序設(shè)計(jì)語(yǔ)言的體驗(yàn)感和成就感方面效果顯著。未來(lái)需要進(jìn)一步改進(jìn)的工作包括:將C和C++程序設(shè)計(jì)語(yǔ)言課程中各種抽象的計(jì)算思維,實(shí)例化為游戲中各種實(shí)際的精靈和實(shí)際算法需求,進(jìn)一步將Funcode建設(shè)成為計(jì)算思維的訓(xùn)練平臺(tái)。
參考文獻(xiàn):
[1]Jeannette M. Wing. Computational Thinking. Communications of the ACM. 2006,49(3):33-35.
[2]陳國(guó)良.計(jì)算思維[J].中國(guó)計(jì)算機(jī)學(xué)會(huì)通訊,2012,8(1):31-34.
[3]李廉.計(jì)算思維-概念與挑戰(zhàn)[J].中國(guó)大學(xué)教學(xué),2012,(1):7-12.
[4]陳國(guó)良,董榮勝.計(jì)算思維與大學(xué)計(jì)算機(jī)基礎(chǔ)教育[J].中國(guó)大學(xué)教學(xué),2011,(1):7-12.
[5]武航星,姚琳,張敏.基于Funcode平臺(tái)的C語(yǔ)言課程設(shè)計(jì)教學(xué)改革[J].計(jì)算機(jī)教育,2014,(24):30-33.