宋雅娟,邊 晶
(1.蘇州市職業(yè)大學 計算機工程學院,江蘇 蘇州 215104;2.長春大學 計算機科學技術(shù)學院,長春 130022)
C語言是計算機基礎(chǔ)性程序設(shè)計語言,它的發(fā)展貫穿了計算機發(fā)展的歷程,它蘊含了程序設(shè)計的基本思想,是理工科高等院校的一門基礎(chǔ)課程[1]。一直以來,C語言教學都是圍繞語法知識這個主線展開,按照順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)的順序來學習程序結(jié)構(gòu),這種線性教學模式可以循序漸進地把教學內(nèi)容傳授給學生,但是很難鍛煉學生的整體編程思維。學生長期反復地學習基礎(chǔ)知識和經(jīng)典算法,雖然可以讀懂和編寫簡單的程序,但很難形成對編程的興趣,也沒有自主思維和實踐創(chuàng)新的意識[2]。王洋在《Java就該這樣學》一書中提出一種以玩游戲的方法來玩代碼的思路,借助Java的圖形類庫引導學生設(shè)計自己的小動畫,小游戲[3]。標準的C是沒有圖形庫的,圖形庫都是第三方的擴展,比如TC2.0的graphics.h等等。但目前C語言的教學實踐環(huán)境主要是在VC環(huán)境下進行,而VC下制作圖形程序需要使用MFC或者OPENGL,增加了學習的難度。如果能找到在VC環(huán)境下制作圖形程序的一種方便的庫,設(shè)計適合的案例引導學生掌握圖形程序設(shè)計方法,把原來的語法知識融入案例的開發(fā)過程中,同時鼓勵學生開放想象力自行設(shè)計自己的動畫,必能激發(fā)學生學習C語言編程的興趣,提高自主思維和實踐創(chuàng)新的意識。easyX圖形庫正是這樣的一種工具,它融合了VC方便的開發(fā)平臺和TC簡單的繪圖功能,可以幫助C語言初學者快速上手圖形和游戲編程[4]。easyX可以從網(wǎng)上下載,安裝簡單。本文以easyX開發(fā)的一個簡單案例為線索來設(shè)計C語言程序設(shè)計課程的教學方法。
easyX是針對C++的圖形庫,可以幫助C語言初學者快速上手圖形和游戲編程。比如,可以用VC + easyX很快地用幾何圖形畫一個房子,或者一輛移動的小車,可以編寫俄羅斯方塊、貪吃蛇、黑白棋等小游戲,可以練習圖形學的各種算法等等[4]。
easyX圖形庫主要提供了用于繪制圖形的常用函數(shù)庫及相應(yīng)的頭文件。使用easyX非常簡單,只要下載文件夾,將其lib文件夾和include文件夾內(nèi)容分別拷貝到Visual C++的include和lib文件中即可。
在使用easyX提供的函數(shù)前需要使用initgraph(640, 480)對屏幕進行初始化,設(shè)置顯示屏幕的大小,結(jié)束后使用closegraph()函數(shù)關(guān)閉。
easyX主要提供了顏色設(shè)置、繪制圖形、輸出文本等函數(shù)。其中前景顏色設(shè)置函數(shù)為setcolor,如果要將前景色設(shè)置為紅色,可使用預定義顏色setcolor(RED)或使用RGB顏色setcolor(0xff0000)。填充色設(shè)置函數(shù)為setfillcolor。可以結(jié)合畫筆程序?qū)φ誩asyX提供的庫函數(shù)幫助學生理解函數(shù)的意義和用法。畫筆程序提供的畫圖工具如圖1所示。
下面列出幾個常用于繪制圖形的函數(shù):
(1)void circle(int x,int y,radius):以指定的x,y坐標為圓心、radius為半徑畫圓,對應(yīng)于畫筆程序里的畫空心圓的工具。
(2)void fillellipse(int left,int top,int right,int bottom):以left,top為橢圓外切矩形左上角坐標、right,bottom為右下角坐標繪制具有指定填充色的橢圓。
(3)void rectangle(int left,int top,int right,int bottom):以left,top為矩形左上角坐標、right,bottom為右下角坐標繪制具有矩形。
(4)void moveto(int x,int y):將光標移動到坐標x,y 處。
(5)void lineto(int x,int y):從光標所在處畫一條直線到坐標x,y處,對應(yīng)于畫筆程序里的畫直線工具。
(6)void polygon(const POINT *points,int num):畫多邊形。
easyX中在指定位置輸出文本的函數(shù)是outtextxy(int x,int y, LPCTSTR str),可配合settextcolor和settextstyle在屏幕上輸出不同顏色和字體的文字。
在實踐過程中可結(jié)合應(yīng)用C語言其它的庫函數(shù)來完成動畫效果,比如用隨機函數(shù)rand()來獲得隨機值,用Sleep(int time)來使程序進行休眠。
結(jié)合1節(jié)介紹的函數(shù)制作一個動畫程序應(yīng)用案例,程序部分運行效果如圖2所示。
圖2 不斷上升的氣泡
程序運行時,屏幕上出現(xiàn)一個640×480的窗口,背景色為天青色模擬魚缸中水的顏色。水中出現(xiàn)50個大小不同、位置不同的白色氣泡。每個氣泡都以緩慢的速度在上升,當氣泡接觸到上邊沿時消失,從下方同樣橫坐標的位置重新出現(xiàn),重復上升過程,循環(huán)往復。這個程序中涉及了順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、選擇結(jié)構(gòu)、函數(shù)、結(jié)構(gòu)體、數(shù)組等C語言語法[5]內(nèi)容。此程序案例作為一個基礎(chǔ),在此基礎(chǔ)上可以增加水草、魚等更多水里不同的生物以及不同的運動方式。也可以繼續(xù)在此基礎(chǔ)上增加鼠標、鍵盤等處理方法形成人機互動的游戲效果。在實踐過程中有學生以此實現(xiàn)大魚吃小魚的程序、天空落雨、景物變化等種種不同的動畫效果。
easyX用于開發(fā)圖形案例、動畫案例甚至游戲都比較容易上手,在教學過程中首先尋找已有的動畫案例,向?qū)W生展示動畫效果,使學生對C語言的學習結(jié)果產(chǎn)生向往。之后,提取出常用的幾個函數(shù),簡單地向?qū)W生講解一下函數(shù)的含義和調(diào)用方法。教師使用自行設(shè)計的小而全功能的案例在課堂上首先快速開發(fā)出原型程序,讓學生體會easyX的易用性,激發(fā)學習動力。之后,課程即以案例為主線,在開發(fā)案例的過程中穿插講解相關(guān)理論知識。
在初始窗口中繪制一個魚缸及水底一氣泡。
(1)圖形界面初始化??赏ㄟ^下面的圖形函數(shù)進行初始化,運行界面如圖3所示。
initgraph(640,480)。
圖3 設(shè)置初始窗口
當圖形繪制結(jié)束后,可用圖形關(guān)閉函數(shù)closegraph()進行關(guān)閉。
(2)繪制特定顏色圖形。例如在特定背景色下繪制特定顏色實心圓,如圖4所示。
圖4 天青色背景下的指定位置的白色實心圓
initgraph(640,480);
setbkcolor(CYAN);
cleardevice();
setcolor(WHITE);
setfillcolor(WHITE);
fillcircle(300,450,30);
getch()。
上述代碼可以讓學生了解C語言中的函數(shù)調(diào)用方式及順序結(jié)構(gòu)的使用方法。
(3)學生自由繪制。讓學生自行學習“幫助文件”,繪制出不同大小、不同位置的圓及其它組合圖形。
在基本圖形的基礎(chǔ)上,結(jié)合變量及循環(huán)結(jié)構(gòu)的使用,使圖形復雜化。
(1)講解for循環(huán)常規(guī)語法知識及變量使用。
(2)重新設(shè)置圓的坐標及大小為變量值。
(3)使用循環(huán)重復在屏幕上畫圓,使得后產(chǎn)生的圓都在原來圖形位置偏上一點,并且變大一點,如圖5所示。
圖5 引入循環(huán)結(jié)構(gòu)后的多個不同圓的繪制
(4)引入Sleep()函數(shù)保持畫面穩(wěn)定。
(5)引入使用背景色重畫原圖實現(xiàn)擦除原圖形效果,從而形成動畫效果。
(6)學生自行實踐如何使自己設(shè)計的組合圖形上下左右移動的效果。
此部分可以讓學生理解循環(huán)結(jié)構(gòu)的作用,學習循環(huán)結(jié)構(gòu)的語法知識。還可以引導學生以此為基礎(chǔ)設(shè)計自己需要的圖形及動畫效果。
通過案例展示,如何用“選擇結(jié)構(gòu)”處理圖形繪制過程中的邊界問題及事件觸發(fā)問題。
(1)講解if…else選擇結(jié)構(gòu)的基本語法。
(2)使用選擇結(jié)構(gòu)處理不斷上升的圓上越界的情況,當上越界時讓實心圓從下方重新以原有大小位置出現(xiàn)。
(3)引入鼠標處理方法,完成當鼠標點擊到圖形內(nèi)部時圖形消失功能。
此部分可以讓學生理解選擇結(jié)構(gòu)的作用,學習選擇結(jié)構(gòu)的語法知識,并引導學生以此為基礎(chǔ)設(shè)計自己需要的圖形及動畫效果。
通過案例展示,如何用數(shù)組對圖形進行批處理。
(1)讓屏幕上出現(xiàn)多個不同橫坐標的圓,縱坐標及大小保持相同。
(2)引入一維數(shù)組實現(xiàn)多個圓的同時存在、同時上升變化等,如圖6所示。
圖6 引入數(shù)組后的多個不同氣泡在屏幕上變化效果
(3)使用一維數(shù)組保存各個圓的消失和存在狀態(tài),當鼠標點擊到某個圓時該圓的標志為消失狀態(tài)。
引入數(shù)組后可讓學生理解批量數(shù)據(jù)的使用,在此處即可引導學生制作第2節(jié)中案例的多個不同位置的動畫形式氣泡。
用案例展示如何用“結(jié)構(gòu)體”繪制一批形態(tài)各異的氣泡。
(1)結(jié)構(gòu)體基本語法講解。
(2)使用結(jié)構(gòu)體保存各個圓的圓心坐標及半徑。
(3)改變程序為各個不同位置及大小的圓。
(4)自定義函數(shù)來進行圓的繪制與擦除。
可參考如下代碼進行講解:
void drawcircle(COLORREF color,struct circle mycircles[])
{ int i;
for(i=0;i<50;i++)
{
setcolor(color);
setfillcolor(color);
fillcircle(mycircles[i].x,mycircles[i].y,mycircles[i].r);
}
}
用文件方式保存程序結(jié)束時各個圓的狀態(tài),在程序運行時打開文件,取出上一次狀態(tài),再現(xiàn)前景。
在課程進行過程中,還可以采取各種方式鼓勵學生創(chuàng)新,如舉辦作品展及作品PK等方式激發(fā)學生不斷發(fā)揮潛力,完善自己作品。
隨著計算機的發(fā)展,計算機編程語言的學習已經(jīng)越來越普及,目前不只大學生學習計算機語言,中小學生的計算機編程課堂也越來越活躍。因而編程課程越來越需要行之有效并且趣味性強的教學方法。在C語言程序設(shè)計課堂應(yīng)用easyX圖形庫開發(fā)動畫程序案例比較符合教學需求。筆者在自己的C語言課堂嘗試使用這種方法,提高了學習興趣,激發(fā)了學生的創(chuàng)作欲望,從而以玩游戲的心態(tài)來玩代碼,學習效果比較明顯。當然,為了取得更好的教學效果,還需要編寫適合的教材、改革考核方式,這是在以后的教學工作中需要進一步嘗試的內(nèi)容。