唐型基 柴群 楊光臨
摘要:許多高校的Java程序設(shè)計課程教學(xué)正在改革,強(qiáng)調(diào)提升編程應(yīng)用能力。但在教學(xué)中普遍的學(xué)生完成作業(yè)還行,開發(fā)項目卻不會,一個主要的原因是面向?qū)ο蟮木幊趟枷霙]有建立起來,該文以項目驅(qū)動教學(xué)法案例——雷電游戲的設(shè)計實現(xiàn)為例討論引導(dǎo)學(xué)生學(xué)習(xí)面向?qū)ο蟮某绦蛟O(shè)計方法。
關(guān)鍵詞:Java程序設(shè)計;項目驅(qū)動;面向?qū)ο?教學(xué)方法
中圖分類號:TP311 ? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2021)31-0092-03
1 引言
Java程序設(shè)計這門課程是目前高校計算機(jī)類相關(guān)專業(yè)的基礎(chǔ)必修課程,該課程具有很強(qiáng)的運用性、實踐性,傳統(tǒng)的教學(xué)過程在大多數(shù)情況下只是讓學(xué)生學(xué)會了一門程序設(shè)計語言的基礎(chǔ),現(xiàn)代社會的競爭異常激烈,對學(xué)生的應(yīng)用能力要求也在提高。面對這樣的情形,各高校也在對Java程序設(shè)計課程進(jìn)行改革,不斷往課程里“加料”,強(qiáng)調(diào)提升學(xué)生的應(yīng)用能力。
Java 語言作為一門純面向?qū)ο缶幊陶Z言,面向?qū)ο缶幊趟枷牒退惴ㄊ撬撵`魂[1]。Java程序設(shè)計語言基礎(chǔ)語法部分的學(xué)習(xí)并不難,學(xué)過C語言的學(xué)生基本上都能掌握。但Java本身它是一門面向?qū)ο蟮某绦蛟O(shè)計語言,很多的學(xué)生不會使用面向?qū)ο蟮乃枷肴シ治鰡栴},對于Java的使用也僅停留在使用“升級版C語言”的層次,仍是采用面向過程的編程方式使用Java語言[2]。這也是許多學(xué)生完成課本作業(yè)還行,但獨立去完成一小個項目卻無從下手的根本原因。
2 項目驅(qū)動教學(xué)法
Java程序設(shè)計課程中的內(nèi)容相較多,基礎(chǔ)部分包括:數(shù)據(jù)類型、分支控制結(jié)構(gòu)、循環(huán)控制結(jié)構(gòu)、數(shù)組、異常處理、類和對象、接口等,結(jié)合應(yīng)用部分還有:圖形界面、數(shù)據(jù)庫連接和操縱、多線程、網(wǎng)絡(luò)、面向?qū)ο蟾呒壧匦缘取0磦鹘y(tǒng)的教師講,學(xué)生被動“填鴨”灌輸?shù)姆绞浇虒W(xué),學(xué)生難以接受眾多的知識,更別說應(yīng)用。只有將知識融合到項目中,以項目來驅(qū)動學(xué)生去學(xué)習(xí)掌握這些知識,才能讓學(xué)生更好地學(xué)會這些繁雜瑣碎的知識,并認(rèn)識到這些知識是怎么運用的。在課堂教學(xué)中結(jié)合項目開發(fā),激發(fā)學(xué)生學(xué)習(xí)興趣,增強(qiáng)他們的代碼調(diào)試能力,提高項目開發(fā)水平[3]。教學(xué)整體設(shè)計“以職業(yè)技能培養(yǎng)為目標(biāo),以項目任務(wù)實現(xiàn)為載體、理論學(xué)習(xí)與實際操作相結(jié)合”[4]。因此項目驅(qū)動教學(xué)法是學(xué)習(xí)Java程序設(shè)計課程的有效的教學(xué)方法。
3 雷電游戲項目的面向?qū)ο笤O(shè)計
為激發(fā)學(xué)生對項目驅(qū)動學(xué)習(xí)的積極性和興趣,選取的是游戲方面的項目,學(xué)習(xí)與娛樂相結(jié)合,將學(xué)生玩游戲的熱情與興趣引導(dǎo)向開發(fā)游戲和編程方面來,激起學(xué)生學(xué)習(xí)的熱情,在開發(fā)游戲的過程學(xué)習(xí)面向?qū)ο蠓椒ǖ某绦蛟O(shè)計,在項目開發(fā)過程中體會Java程序設(shè)計的相關(guān)知識。本文以“雷電游戲”這一項目案例的設(shè)計與實現(xiàn)來討論項目驅(qū)動教學(xué)法中引導(dǎo)學(xué)生進(jìn)行面向?qū)ο蟮脑O(shè)計與開發(fā)。
面向?qū)ο蟪绦蛟O(shè)計過程一般分為三個階段:面向?qū)ο蠓治?,面向?qū)ο笤O(shè)計,面向?qū)ο髮崿F(xiàn)[5]。
3.1 面向?qū)ο蠓治?/p>
將游戲程序分享給學(xué)生,讓學(xué)生一起運行體驗和觀察游戲。引導(dǎo)學(xué)生開始面向?qū)ο蟪绦蛟O(shè)計的第一階段:面向?qū)ο蟮姆治?。此階段分為兩個小的步驟,第一步是找出游戲中有哪些元素組成?這些元素也就是項目中的對象。
通過觀察和分析,在游戲中找到如下的對象:1)主角飛機(jī),2)敵人飛機(jī),3)主角子彈,4)敵人子彈,5)增加生命值物品,6)生命值(次)數(shù)(在窗體上方顯示的),7)最終的BOSS。從游戲界面上看,暫時找到的對象就是上述的對象。但是游戲要正常運行還缺少了一些東西,比如游戲背景,游戲運行時聽到的聲音,游戲主框架等,沒有他們程序是不完整的。因此把這三個元素分別擬定成為游戲項目中的對象,它們是:8)游戲背景,9)游戲聲音,10)游戲主框架。
接下來是面向?qū)ο蠓治鲭A段中的第二步,分析各個對象具有什么特性(屬性)?主要指靜態(tài)和動態(tài)兩個方面的特性。靜態(tài)的是成員變量,動態(tài)的則是成員方法。
經(jīng)分析得到各對象的屬性有:
1)主角飛機(jī) 。靜態(tài)成員:位置坐標(biāo)(x,y),圖像大?。╳idth,height),圖片。動態(tài)成員:取得坐標(biāo)(x,y)、繪制圖片、發(fā)射子彈、移動。
2)敵人飛機(jī)。靜態(tài)成員:位置坐標(biāo)(x,y),圖像大?。╳idth,height),圖片。動態(tài)成員:取得坐標(biāo)(x,y)、移動、繪制圖片、發(fā)射子彈。
3)主角子彈。靜態(tài)成員:位置坐標(biāo)(x,y),圖像大小(width,height),圖片。動態(tài)成員:取得坐標(biāo)(x,y)、移動、繪制圖片。
4)敵人子彈。靜態(tài)成員:位置坐標(biāo)(x,y),圖像大?。╳idth,height),圖片。動態(tài)成員:取得坐標(biāo)(x,y)、移動、繪制圖片。
5)增加生命值物品對象。靜態(tài)成員:位置坐標(biāo)(x,y),圖像大?。╳idth,height),圖片。動態(tài)成員:取得坐標(biāo)(x,y)、移動、繪制圖片。
6)生命值(條)數(shù)。靜態(tài)成員:位置坐標(biāo)(x,y),圖像大?。╳idth,height),圖片。動態(tài)成員:繪制圖片。
7)最終的BOSS對象。靜態(tài)成員:位置坐標(biāo)(x,y),圖像大?。╳idth,height),圖片。動態(tài)成員:移動、繪制圖片。
8)游戲背景對象。靜態(tài)成員:位置坐標(biāo)(x,y),圖像大?。╳idth,height),圖片。動態(tài)成員:繪制圖片。
9)聲音對象。靜態(tài)成員:聲音文件名。動態(tài)成員:播放聲音文件。
10)游戲主框架對象。它是一個框架,把上述所有對象都包含,并控制著它們協(xié)調(diào)地工作。靜態(tài)成員:生命值(次)數(shù)對象,增加生命物品對象,敵機(jī)對象,主角飛機(jī)對象,敵方子彈對象,主角子彈對象,背景對象,聲音對象。動態(tài)成員:初始化游戲,繪圖,按鍵控制。
3.2 面向?qū)ο笤O(shè)計
面向?qū)ο箝_發(fā)過程的第二階段是面向?qū)ο笤O(shè)計,即以項目中的各對象為原型設(shè)計出各個類,各個類實例化之后即得到了項目中的對象。此階段中包含兩個步驟,第一步是分析項目中各對象之間的關(guān)系(如包含,控制,生成等),然后使用UML工具畫出類圖。
分析每個對象得知,他們有很多的共通點,如:靜態(tài)成員:位置坐標(biāo)(x,y),圖像大?。╳idth,height),圖片。動態(tài)成員:取得坐標(biāo)(x,y);移動;繪制圖片。于是提高代碼的重用性,采用面向?qū)ο蟮睦^承的思想,先定義出抽象類:移動對象類(MovableObject),然后其他相應(yīng)的各對象類可從該類那里繼承而得到。如圖1所示。
第二步是進(jìn)一步細(xì)化類圖,確定類中各個對象靜態(tài)成員的具體屬性的類型,明確動態(tài)成員要完成的功能,并用采用自然語言或者圖形工具(如流程圖,PAD圖等)描述出來。
1)MovableObject類的設(shè)計,x,y坐標(biāo)設(shè)定為整型數(shù)據(jù),高(height),寬(width)設(shè)定為整型數(shù)據(jù),圖片設(shè)定為Image類型,如圖2所示。
2)主角飛機(jī)(Hero)類的設(shè)計。繼承于抽象類MovableObject,增加發(fā)射子彈的成員方法。由于主角飛機(jī)類是受到按鍵控制的,因此不用父類中的move方法,新增加向上下左右四個方法的移動的成員方法。
其中,發(fā)射子彈方法的算法描述為生成主角子彈對象,并填寫它首次出現(xiàn)的位置坐標(biāo)及圖片小大等信息。
向上移動方法的算法描述為:如果縱坐標(biāo)y的值大于10則坐標(biāo)y值減去10,否則不減。
向下移動方法的算法描述為:如果縱坐標(biāo)y的值小于600(游戲窗口的高度值)減去70(主角飛機(jī)圖片的高度)則坐標(biāo)y加10,否則不加。
向左移動方法的算法描述為:如果橫坐標(biāo)x的值大于10則坐標(biāo)x值減去10,否則不減。
向右移動方法的算法描述為:如果橫坐標(biāo)x的值小于400(游戲窗口的寬度值)減去40(主角飛機(jī)圖片的寬度)則坐標(biāo)x加10,否則不加。
3)敵機(jī)(Enemy)類的設(shè)計。繼承于抽象類MovableObject,增加發(fā)射子彈的方法。
發(fā)射子彈方法的算法描述為生成敵機(jī)子彈對象,并填寫它首次出現(xiàn)的位置坐標(biāo)及圖片小大等信息。
重寫父類中的move方法,每間隔一段時間,向下移動5(坐標(biāo)y加5),向左或向右移動一段距離(x坐標(biāo)加上-5到5之間的一個數(shù)值)。
4)游戲主框架類(GamePanel)類的設(shè)計。主框架類繼承于Panel類,在該類中將各對象的運動變化交由一個線程來進(jìn)行處理運行,為確保游戲程序順暢運行,各對象的顯示和繪制交由另一個線程來進(jìn)行處理。其中,繪制顯示的對象,這線程不用新建線程另外處理,因為界面程序的組件都有繪制的線程和專用的方法(paint),對象運動變化之后,只要通知界面程序的組件繪制的線程(也可以理解為調(diào)用界面程序的繪圖方法更新內(nèi)容)即可。靜態(tài)成員:生命值(次)數(shù)對象列表,增加生命物品列表,敵機(jī)列表,主角飛機(jī),敵方子彈列表,主角子彈列表,背景對象,聲音對象,各圖形元素運動控制的線程對象。成員方法:初始化游戲,繪圖(重寫paint方法),按鍵控制(控制主角移動),(各對象碰撞的)音效播放,背景音樂播放;事件監(jiān)聽(按鍵監(jiān)聽處理);重新開始游戲。
5)各對象運動控制的線程(ThdObjMove)類的設(shè)計。此類最好在主框架類中進(jìn)行設(shè)計(內(nèi)部類),這樣方便線程訪問和控制主框架類的各成員。各圖形元素運動控制的線程類的設(shè)計:在線程體中控制敵人、敵人子彈、主角子彈、主角、增加生命值物品等各個對象的移動;并檢查是否發(fā)生(敵人與主角、敵人子彈與主角、主角子彈與敵人、增加生命值物品與主角)碰撞;游戲進(jìn)程發(fā)展;Boss出場;檢查游戲是否結(jié)束;播放指定音效等。靜態(tài)成員:循環(huán)控制標(biāo)記。成員方法:產(chǎn)生敵人;產(chǎn)生增加生命值物品;敵人開火(三類敵人,分別發(fā)射三種子彈);敵人移動;增加生命值物品對象移動;檢查增加生命值物品對象與主角是否碰撞;檢查敵人與主角是否碰撞;查檢敵人子彈與主角是否碰撞;查檢主角子彈與敵人是否碰撞(兩種子彈);線程主方法(線程體)。
項目中還有其他類和對象的設(shè)計,在此省略。
3.3 面向?qū)ο髮崿F(xiàn)
面向?qū)ο髮崿F(xiàn)階段的任務(wù)是將上一階段的類圖中各類的靜態(tài)成員和成員方法的算法用Java語言描述出來,加上類相應(yīng)的構(gòu)造方法,將上述每個類編寫為相應(yīng)的Java源程序文件。
1)MovableObject的定義:
2)主角飛機(jī)Hero類的定義:
其他類的定義在此省略。
最后定義程序的窗口類,在窗口類將游戲主框架類的對象加入到窗口內(nèi)容窗格的中間,于是游戲畫面便可在窗口中顯示出來了。
public class GameFrame extends JFrame {//游戲窗口類,繼承于JFrame
private GamePanel gpanel = new GamePanel();
public GameFrame() {//構(gòu)造方法
gpanel.setFocusable(true);
gpanel.requestFocus();
this.add(gpanel, BorderLayout.CENTER);
//將將游戲主框架類的對象gpanel添加到內(nèi)容空格的中間
}
public static void main(String[] args) {
GameFrame frame = new GameFrame();
frame.setSize(410, 630); //設(shè)定窗口的大小
frame.setIconImage(Resources.IconPNG);//設(shè)置窗口圖標(biāo)
frame.setTitle("雷電");//設(shè)置窗口標(biāo)題
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//設(shè)置窗口關(guān)閉按鈕的默認(rèn)動作是退出程序
frame.setVisible(true);//設(shè)置窗口可見
}
}
4 總結(jié)
項目驅(qū)動的教學(xué)方法是較為有效的學(xué)習(xí)Java程序設(shè)計的教學(xué)方法,以項目驅(qū)動學(xué)習(xí),結(jié)合學(xué)生感興趣的游戲項目激發(fā)學(xué)生主動學(xué)習(xí)的熱情。本文以雷電游戲項目的設(shè)計實現(xiàn)為例討論了在項目驅(qū)動教學(xué)法中引導(dǎo)學(xué)生學(xué)習(xí)面向?qū)ο蟮某绦蛟O(shè)計方法。展示了面向?qū)ο蟪绦蛟O(shè)計過程中面向?qū)ο蠓治?、面向?qū)ο笤O(shè)計、面向?qū)ο髮崿F(xiàn)三個階段的主要思想。項目驅(qū)動教學(xué)方法中第一個項目要教師帶領(lǐng)著學(xué)生練習(xí),然后再布置難度合理的項目讓學(xué)生自己動手去完成,在項目設(shè)計實現(xiàn)的過程中使學(xué)生學(xué)會面向?qū)ο蟮某绦蛟O(shè)計方法。
參考文獻(xiàn):
[1] 田春婷.單機(jī)版記憶游戲的設(shè)計與實現(xiàn)——Java語言任務(wù)驅(qū)動教學(xué)法應(yīng)用案例[J].科技與創(chuàng)新,2021(5):21-22,25.
[2] 曹文平,寧彬.任務(wù)驅(qū)動+過程反饋的Java教學(xué)方法研究[J].教育教學(xué)論壇,2021(4):165-168.
[3] 虞曉霞,彭浩.項目制班內(nèi)分層互動教學(xué)模式在Java程序設(shè)計課程教學(xué)中的應(yīng)用[J].計算機(jī)教育,2021(5):96-100.
[4] 張虎,葉傳奇,谷志峰.基于案例驅(qū)動的教學(xué)在《Java程序設(shè)計》課程中的實施與探索[J].電腦知識與技術(shù),2021,17(14):146-148.
[5] 張海藩,牟永敏.軟件工程導(dǎo)論[M].6版.北京:清華大學(xué)出版社,2013.
【通聯(lián)編輯:朱寶貴】
收稿日期:2021-05-25
項目基金:凱里學(xué)院線下一流課程——“Java程序設(shè)計”(課題編號:xx202009)
作者簡介:唐型基(1984—),男,貴州凱里人,副教授,主要從事數(shù)據(jù)結(jié)構(gòu)與算法分析研究。