摘要:悅?cè)せ瘜W(xué)習(xí)是一種“玩中學(xué)”的學(xué)習(xí)方式,通過(guò)激發(fā)學(xué)習(xí)者的學(xué)習(xí)動(dòng)機(jī)促進(jìn)學(xué)習(xí),將學(xué)習(xí)融入游戲中,又稱(chēng)“游戲化學(xué)習(xí)”。悅?cè)せ瘜W(xué)習(xí)方式多種多樣,文章就Robocode軟件在面向?qū)ο蟪绦蛟O(shè)計(jì)聾學(xué)中的應(yīng)用進(jìn)行研究,闡述Robocode在程序設(shè)計(jì)學(xué)習(xí)中的價(jià)值,論述Robocode在程序設(shè)計(jì)教學(xué)中的組織應(yīng)用,同時(shí)也對(duì)悅?cè)せ瘜W(xué)習(xí)進(jìn)行總結(jié)和反思。
文章編號(hào):1672-5913(2013)18-0099-04
中圖分類(lèi)號(hào):G642
0 引言
悅?cè)せ瘮?shù)字學(xué)習(xí)又稱(chēng)數(shù)字游戲式學(xué)習(xí)(Digital Game-Based Learning,DGBL),是強(qiáng)調(diào)以學(xué)生為中心并融合數(shù)字游戲的創(chuàng)新教學(xué)方式,即學(xué)生以小組合作的方式,通過(guò)解決數(shù)字游戲中的問(wèn)題與挑戰(zhàn)來(lái)學(xué)習(xí)知識(shí)。一邊游戲一邊學(xué)習(xí)可以為學(xué)習(xí)者提供一個(gè)充滿(mǎn)樂(lè)趣與挑戰(zhàn)的學(xué)習(xí)環(huán)境,更能強(qiáng)化學(xué)習(xí)動(dòng)機(jī),加快知識(shí)的充分吸收。臺(tái)灣學(xué)者將這種學(xué)習(xí)方式譯為“悅?cè)せ瘜W(xué)習(xí)”。
面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)課程在整個(gè)計(jì)算機(jī)課程教學(xué)中占據(jù)非常重要的地位,目前國(guó)內(nèi)高校計(jì)算機(jī)專(zhuān)業(yè)普遍開(kāi)設(shè)了此類(lèi)課程。類(lèi)和對(duì)象是面向?qū)ο蟪绦蛟O(shè)計(jì)中最重要的概念,目前多數(shù)教材對(duì)這些概念以文字進(jìn)行介紹,對(duì)學(xué)習(xí)者而言,這些概念難以理解,學(xué)習(xí)效果不甚理想。建構(gòu)主義教學(xué)論原則指出:“復(fù)雜的學(xué)習(xí)領(lǐng)域應(yīng)針對(duì)學(xué)習(xí)者先前的經(jīng)驗(yàn)和學(xué)習(xí)者的興趣,只有這樣,才能激發(fā)學(xué)習(xí)者的學(xué)習(xí)積極性,學(xué)習(xí)才可能是主動(dòng)的”。為了激發(fā)學(xué)生持久的學(xué)習(xí)興趣,讓學(xué)生產(chǎn)生學(xué)習(xí)的內(nèi)在驅(qū)動(dòng)力,教育工作者在一直不停地進(jìn)行著積極的探索。在面向?qū)ο蟪绦蛟O(shè)計(jì)課程教學(xué)過(guò)程中引入“悅?cè)せ瘜W(xué)習(xí)”就是一個(gè)行之有效的方法。悅?cè)せ瘜W(xué)習(xí)的方式多種多樣,如模擬仿真類(lèi)游戲“模擬城市(SimCi-ty)”、可用于學(xué)習(xí)地理的“大航海時(shí)代(Great Age of Voyage)”等。
Robocode是一款基于Java語(yǔ)言的坦克機(jī)器人作戰(zhàn)游戲。此款游戲在沒(méi)有用戶(hù)輸入的狀態(tài)下,讓許多坦克機(jī)器人在一個(gè)競(jìng)技場(chǎng)中比賽,而且用戶(hù)必須編制一個(gè)高效的坦克機(jī)器人來(lái)取勝。Robocode像一場(chǎng)坦克機(jī)器人的大混戰(zhàn),它們互相開(kāi)火直到只剩一個(gè)勝利者。Robocode要求使用Java語(yǔ)言對(duì)坦克機(jī)器人的動(dòng)作進(jìn)行編程,并設(shè)計(jì)不同的決策方案指揮坦克機(jī)器人的運(yùn)行。Java初學(xué)者可以在讓自己的坦克機(jī)器人戰(zhàn)勝對(duì)手坦克機(jī)器人的代碼編寫(xiě)過(guò)程中,掌握J(rèn)ava語(yǔ)言,提高程序設(shè)計(jì)能力。
1 悅?cè)せ瘜W(xué)習(xí)在程序設(shè)計(jì)學(xué)習(xí)中的價(jià)值
1)激發(fā)學(xué)習(xí)動(dòng)機(jī)。
學(xué)習(xí)動(dòng)機(jī)是學(xué)生學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)過(guò)程中一個(gè)非常重要的因素,很多學(xué)生學(xué)習(xí)積極性較差,卻在游戲方面顯出較高興趣。若將游戲的特點(diǎn)應(yīng)用到面向?qū)ο蟪绦蛟O(shè)計(jì)過(guò)程中,使學(xué)習(xí)更加有趣,不失為一個(gè)促進(jìn)學(xué)習(xí)的好方法。Robocode是一款機(jī)器人作戰(zhàn)游戲,符合青少年熱衷網(wǎng)絡(luò)游戲的特點(diǎn),可以使學(xué)生在設(shè)計(jì)代碼完成游戲的過(guò)程中提高學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)的積極熊。
2)體驗(yàn)式學(xué)習(xí)過(guò)程。
體驗(yàn)式學(xué)習(xí)(Experimental Learning)是指以學(xué)習(xí)者為中心,通過(guò)實(shí)踐與反思相結(jié)合來(lái)獲得知識(shí)、技能和態(tài)度的學(xué)習(xí)方式。簡(jiǎn)言之,體驗(yàn)式學(xué)習(xí)遵循了4個(gè)階段模型:首先從具體體驗(yàn)開(kāi)始,然后是觀(guān)察和反思,進(jìn)而形成抽象的概念和普遍的原理,最后將形成的理論應(yīng)用到新情境的實(shí)踐當(dāng)中。
在面向?qū)ο蟪绦蛟O(shè)計(jì)的教學(xué)中,教師一般要先講一下相關(guān)的概念和語(yǔ)句,但學(xué)生未必都能理解,學(xué)生在Robocode應(yīng)用中,為了游戲的順利進(jìn)行,必須不斷調(diào)試程序。教師要及時(shí)引導(dǎo)學(xué)生將注意力轉(zhuǎn)移到教學(xué)的實(shí)質(zhì)階段——編程知識(shí)的學(xué)習(xí)。當(dāng)講解到一些技術(shù)要點(diǎn)時(shí),演示該技術(shù)在游戲中的具體運(yùn)用,往往能夠更加吸引學(xué)生,從而達(dá)到在游戲中學(xué)習(xí)的目的。
3)提高解決問(wèn)題能力。
游戲往往充滿(mǎn)了挑戰(zhàn),不論是戰(zhàn)斗還是增強(qiáng)技巧,都需要游戲者千方百計(jì)地解決問(wèn)題。因此,游戲可以提高游戲者解決問(wèn)題的能力。Whitebread認(rèn)為解決問(wèn)題是一個(gè)復(fù)雜的智力過(guò)程,包括一系列的能力:①理解和描述問(wèn)題的能力(包括找出相關(guān)資訊的能力);②收集和組織相關(guān)資訊的能力;③制訂和管理行動(dòng)計(jì)劃或策略的能力;④問(wèn)題推斷和決斷能力;⑤使用各種解決問(wèn)題的工具的能力。
學(xué)生為了能夠完成Robocode實(shí)驗(yàn)平臺(tái)的搭建,就需要解決如何在Eclipse開(kāi)發(fā)平臺(tái)上建立Robocode平臺(tái)的問(wèn)題;為了了解如何設(shè)計(jì)機(jī)器人坦克,就需要解決如何使用API幫助文檔的問(wèn)題;如果在競(jìng)爭(zhēng)中失利,為了打敗對(duì)手,就會(huì)產(chǎn)生強(qiáng)烈的了解對(duì)手機(jī)器人坦克是怎么編程設(shè)計(jì)的念頭,于是會(huì)閱讀對(duì)手機(jī)器人坦克的源代碼,進(jìn)一步達(dá)到提高閱讀源代碼水平的能力。
4)提高協(xié)作學(xué)習(xí)能力。
網(wǎng)絡(luò)游戲本身就需要和其他人互動(dòng),并在互動(dòng)過(guò)程中形成游戲虛擬團(tuán)隊(duì)。在應(yīng)用Robocode進(jìn)行游戲時(shí),指導(dǎo)教師對(duì)學(xué)生進(jìn)行分組,讓學(xué)生以小組為單位協(xié)作學(xué)習(xí),每個(gè)小組有3~4名組員,開(kāi)發(fā)3~5段坦克控制程序,各組進(jìn)行競(jìng)賽,加載各組的坦克機(jī)器人進(jìn)行對(duì)決。組內(nèi)學(xué)生為了獲勝,相互交流編程技術(shù),以便設(shè)計(jì)出更為強(qiáng)大的機(jī)器人。各組學(xué)生直接交流獲勝經(jīng)驗(yàn),不僅提高編程能力,更樹(shù)立了協(xié)作意識(shí)。
5)提升創(chuàng)造能力。
創(chuàng)造能力又稱(chēng)創(chuàng)造力或創(chuàng)新能力,是當(dāng)前各行各業(yè)都非??粗氐哪芰Αkm然創(chuàng)造力有天賦的成分,不過(guò)學(xué)者們認(rèn)為創(chuàng)造力是可以通過(guò)后天努力培養(yǎng)的。游戲可以用來(lái)培養(yǎng)學(xué)習(xí)者的創(chuàng)造能力。在應(yīng)用Robocode進(jìn)行游戲時(shí),學(xué)生可以查看坦克機(jī)器人的源代碼,模擬游戲系統(tǒng)給出的模板機(jī)器人進(jìn)行設(shè)計(jì)。但為了在競(jìng)賽中獲勝,學(xué)生往往要在此基礎(chǔ)上進(jìn)行改造創(chuàng)新,從而設(shè)計(jì)出具有各種不同能力的機(jī)器人。
2 Robocode在程序設(shè)計(jì)教學(xué)中的組織應(yīng)用
1)類(lèi)、對(duì)象和包。
對(duì)象(Obiect)是類(lèi)(Class)的一個(gè)實(shí)例。面向?qū)ο蟪绦蛟O(shè)計(jì)的重點(diǎn)是類(lèi)的設(shè)計(jì)。Robocode機(jī)器人是一個(gè)圖形化的坦克,每個(gè)機(jī)器人都由一個(gè)或多個(gè)Java類(lèi)構(gòu)成。學(xué)生從菜單操作中新建一個(gè)機(jī)器人,首先輸入機(jī)器人的名字,名字首字母要大寫(xiě),然后輸入包的名字,這樣就生成了一個(gè)機(jī)器人的對(duì)象。
2)屬性。
封裝是面向?qū)ο蟮奶攸c(diǎn),即通過(guò)訪(fǎng)問(wèn)器(get和set)進(jìn)行屬性訪(fǎng)問(wèn)。Robocode機(jī)器人Vehicle(見(jiàn)圖1)有一門(mén)可以旋轉(zhuǎn)的炮Gun,炮上方的雷達(dá)Radar也是可以旋轉(zhuǎn)的。機(jī)器人坦克車(chē)(Vehicle)、炮(Gun)以及雷達(dá)(Radar)都可以單獨(dú)旋轉(zhuǎn),也就是說(shuō),機(jī)器人坦克車(chē)、炮以及雷達(dá)都是機(jī)器人坦克這個(gè)類(lèi)的屬性,都可以轉(zhuǎn)向不同的方向。
3)方法。
方法是類(lèi)中用于執(zhí)行計(jì)算或進(jìn)行其他操作的函數(shù)成員。如對(duì)象圖片體現(xiàn)、刷新、可見(jiàn)與不可見(jiàn)、自動(dòng)行走等就可以使用方法來(lái)完成,再在另一個(gè)類(lèi)中調(diào)用。
要讓學(xué)生理解創(chuàng)建的機(jī)器人坦克就是一個(gè)類(lèi),它繼承于robocode,Robot類(lèi),而Robot類(lèi)本身含有許多方法。機(jī)器人坦克要生命不息,戰(zhàn)斗不止,就要調(diào)用如下方法:
ahead(100);(前進(jìn)100像素)
tumGunRight(360);(轉(zhuǎn)動(dòng)炮塔360度)
back(100);(后退100像素)
turnRight(60);(右轉(zhuǎn)60度)
fire(1);(開(kāi)火)
4)事件。
事件是對(duì)象發(fā)送消息、信號(hào)通知客戶(hù)發(fā)生了操作。圖形用戶(hù)界面通過(guò)事件機(jī)制響應(yīng)用戶(hù)和程序的交互。響應(yīng)用戶(hù)時(shí)間通常稱(chēng)為事件處理。學(xué)生在編寫(xiě)程序時(shí)很少需要委托和事件,重點(diǎn)是對(duì)已有對(duì)象、控件的事件使用,了解“方法是必須是通過(guò)寫(xiě)代碼來(lái)調(diào)用,而事件由自己觸發(fā)”的基礎(chǔ)原理。
在教學(xué)過(guò)程中,結(jié)合Robocode可以使學(xué)生很容易理解事件處理。如幾個(gè)關(guān)鍵的事件類(lèi):
ScannedRobotEvent:雷達(dá)發(fā)現(xiàn)敵坦克事件類(lèi),它用作參數(shù)被onScannedRobot(ScannedRobotEvent e)方法處理,當(dāng)雷達(dá)檢測(cè)到機(jī)器人時(shí),就調(diào)用該方法。
HitByBulletEvent:被敵坦克擊中事件類(lèi),它用作參數(shù)被onHitByBullet(HitByBuUetEvent event)方法處理。當(dāng)機(jī)器人被炮彈擊中時(shí),就調(diào)用該方法。
HitRobotEvent:通過(guò)覆蓋onHitRobot()方法來(lái)處理HitRobotEvent。當(dāng)機(jī)器人擊中另外一個(gè)機(jī)器人時(shí),就調(diào)用該方法。
HitWallEvent:撞墻事件類(lèi),它用作參數(shù)被onHitWall(HitWallEvent eventl方法處理。當(dāng)機(jī)器人撞到墻時(shí),就調(diào)用該方法。
5)繼承。
繼承是使用已存在類(lèi)的定義作為基礎(chǔ)建立新類(lèi)的技術(shù)。新類(lèi)的定義可以增加新的數(shù)據(jù)或新的功能,也可以用父類(lèi)的功能,但不能選擇性地繼承父類(lèi)。這種技術(shù)使得復(fù)用以前的代碼變得非常容易,能夠大大縮短開(kāi)發(fā)周期,降低開(kāi)發(fā)費(fèi)用。例如可以先定義一個(gè)類(lèi):車(chē),車(chē)有以下屬性:車(chē)體大小、顏色、方向盤(pán)、輪胎,而由車(chē)這個(gè)類(lèi)派生出轎車(chē)和卡車(chē)兩個(gè)類(lèi),為轎車(chē)添加一個(gè)小后備箱,而為卡車(chē)添加一個(gè)大貨箱。
每個(gè)學(xué)生創(chuàng)建的機(jī)器人坦克類(lèi)都繼承Robot類(lèi),也就是說(shuō)都具有onScannedRobot、onHitByBullet、onHitRobot、onHitWall等方法。
6)多態(tài)。
首先向?qū)W生講明多態(tài)的理論概念,即重載和重寫(xiě)。重載發(fā)生在一個(gè)類(lèi)中,重寫(xiě)發(fā)生在子類(lèi)中,意思就是子類(lèi)重寫(xiě)父類(lèi)中相同名稱(chēng)的方法。
每個(gè)學(xué)生在創(chuàng)建機(jī)器人坦克類(lèi)時(shí),為了躲避敵方坦克的炮火,為了迷惑敵方坦克、不讓對(duì)方雷達(dá)過(guò)多地掃描到自己,為了盡量不撞到墻,就要編寫(xiě)自己的策略代碼,覆蓋onScannedRobot、onHitByBullet、onHitRobot、onHitWall等方法。這樣學(xué)生就會(huì)明白在面向?qū)ο缶幊讨羞@就是多態(tài)。
3 悅?cè)せ瘜W(xué)習(xí)的反思
通過(guò)一個(gè)學(xué)期的教學(xué),采用悅?cè)せ瘜W(xué)習(xí)方式,將游戲Robocode引入面向?qū)ο蟪绦蛟O(shè)計(jì)課程的教學(xué)中,使學(xué)生對(duì)Java語(yǔ)言產(chǎn)生了濃厚的學(xué)習(xí)興趣,提高了學(xué)生的編程能力。在教學(xué)過(guò)程中,教師及時(shí)引導(dǎo)學(xué)生將注意力集中到編程知識(shí)的學(xué)習(xí)中并演示具體技術(shù)在游戲中的運(yùn)用,會(huì)有更好的課堂教學(xué)效果。
采用悅?cè)せ虒W(xué)也存在下面一些問(wèn)題:
(1)有的學(xué)生過(guò)多地使用了“試誤”的策略,這些學(xué)生對(duì)面向?qū)ο蟮木幊桃恢虢猓还茈S便編寫(xiě)機(jī)器人坦克類(lèi)的編碼,結(jié)果也可想而知。其實(shí)試誤也是一種重要的解決問(wèn)題的策略,只不過(guò)這種學(xué)習(xí)有一定的盲目性,學(xué)習(xí)效率自然不是很高。
(2)低效的協(xié)作。有的學(xué)生經(jīng)常向?qū)W習(xí)好的學(xué)生請(qǐng)教問(wèn)題,但是別人告訴他的只是一些支離破碎的知識(shí)點(diǎn),而不是系統(tǒng)的答案,因此,不能很好地掌握機(jī)器人坦克設(shè)計(jì)的技巧。
(3)膚淺的反思。許多學(xué)者都認(rèn)為在游戲進(jìn)行過(guò)程中和游戲結(jié)束后進(jìn)行反思和總結(jié)是提高學(xué)習(xí)成效的有效方法,因此在面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)中要特別強(qiáng)調(diào)反思。從課后分析中可以看出,大部分學(xué)生也都在努力反思,但不一定深刻和全面,如有的學(xué)生也反思過(guò)自己設(shè)計(jì)的坦克被擊中卻沒(méi)做出反應(yīng)的錯(cuò)誤,但是后面還是會(huì)經(jīng)常重復(fù)類(lèi)似的錯(cuò)誤。
(4)簡(jiǎn)單的查找。教師在面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)中鼓勵(lì)學(xué)生在學(xué)習(xí)、游戲的過(guò)程中要善于通過(guò)網(wǎng)絡(luò)查找資料,但是有的學(xué)生只是簡(jiǎn)單地查找API手冊(cè),得到一些孤立的知識(shí)點(diǎn)。例如,有的學(xué)生也知道自己的坦克被擊中后要躲閃、反擊,但只是簡(jiǎn)單的幾條語(yǔ)句的算法,并沒(méi)有系統(tǒng)地設(shè)計(jì)一個(gè)完整的算法。
4 結(jié)語(yǔ)
教學(xué)實(shí)踐證明,編寫(xiě)Robocode不但會(huì)用到面向?qū)ο蟪绦蛟O(shè)計(jì)的知識(shí),還會(huì)涉及數(shù)據(jù)結(jié)構(gòu)、人工智能等知識(shí)與技術(shù),并且在游戲的過(guò)程中能夠完成學(xué)習(xí)任務(wù),充分地調(diào)動(dòng)了學(xué)生學(xué)習(xí)的積極性、主動(dòng)性和創(chuàng)造性,培養(yǎng)了學(xué)生分析問(wèn)題和解決問(wèn)題的能力,以及團(tuán)隊(duì)協(xié)作精神,對(duì)提高面向?qū)ο蟪绦蛟O(shè)計(jì)課程的教學(xué)質(zhì)量有較大的幫助。當(dāng)然,Robocode游戲不可能囊括面向?qū)ο蟪绦蛟O(shè)計(jì)的所有方面,但是作為輔助教學(xué)工具,足以引起計(jì)算機(jī)教師的重視。下一步,我們還要對(duì)其中存在的一些問(wèn)題進(jìn)行研究。
(見(jiàn)習(xí)編輯:劉麗麗)