EasyX教程.docx_第1頁(yè)
EasyX教程.docx_第2頁(yè)
EasyX教程.docx_第3頁(yè)
EasyX教程.docx_第4頁(yè)
EasyX教程.docx_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

一 創(chuàng)建新項(xiàng)目 VC 寫程序要有項(xiàng)目的概念,一個(gè)項(xiàng)目可以有多個(gè) .cpp 文件,多個(gè)項(xiàng)目構(gòu)成一個(gè)工作區(qū)。先記住這兩個(gè)英文單詞吧: Workspace: 工作區(qū) Project: 項(xiàng)目 現(xiàn)在開始創(chuàng)建一個(gè)新項(xiàng)目。 VC6 創(chuàng)建新項(xiàng)目請(qǐng)參考這個(gè)視頻:/news/View.aspx?id=65 VC2008 創(chuàng)建新項(xiàng)目請(qǐng)參考這個(gè)視頻: /news/View.aspx?id=85 VC2010 與 VC2008 相似。 看明白后,自己動(dòng)手建立項(xiàng)目試試,并輸入以下代碼: #include void main() printf(Hello World!); 尤其是之前用 tc 的同學(xué),請(qǐng)務(wù)必創(chuàng)建新項(xiàng)目試一試。成功執(zhí)行后,會(huì)看到屏幕上有“Hello World!”幾個(gè)字符。然后,再重新輸入以下代碼試試(無(wú)需理解代碼含義): #include #include void main() initgraph(640, 480); line(200, 240, 440, 240); line(320, 120, 320, 360); getch(); closegraph(); 執(zhí)行后應(yīng)該可以看到屏幕正中央有一個(gè)十字。 看到該十字后,本節(jié)課結(jié)束。 二 簡(jiǎn)單繪圖,學(xué)習(xí)單步執(zhí)行 學(xué)會(huì)簡(jiǎn)單繪圖,并學(xué)會(huì)簡(jiǎn)單調(diào)試。 先看看上一課的代碼,我加上了注釋 #include / 繪圖庫(kù)頭文件,繪圖語(yǔ)句需要 #include / 控制臺(tái)輸入輸出頭文件,getch()語(yǔ)句需要 void main() initgraph(640, 480); / 初始化 640x480 的繪圖屏幕 line(200, 240, 440, 240); / 畫線(200,240) - (440,240) line(320, 120, 320, 360); / 畫線(320,120) - (320,360) getch(); / 按任意鍵 closegraph(); / 關(guān)閉繪圖屏幕 解釋一下: 1. 創(chuàng)建的繪圖屏幕 640x480,表示橫向有 640 個(gè)點(diǎn),縱向有 480 個(gè)點(diǎn)。注意:左上角是原點(diǎn)(0,0),也就是說,y 軸和數(shù)學(xué)的 y 軸是相反的。 2. getch 實(shí)現(xiàn)按任意鍵功能,按任意鍵后,程序繼續(xù)執(zhí)行。否則,程序會(huì)立刻執(zhí)行 closegraph 以至于看不到繪制的內(nèi)容。 作業(yè) 用線條畫出更多的圖形,要求不少于 10 條直線。 學(xué)習(xí)單步執(zhí)行 完成作業(yè)后(務(wù)必完成),開始試著單步執(zhí)行剛才的程序,由于繪圖和多線程等因素的限制,請(qǐng)務(wù)必按照以下步驟嘗試(熟練了以后就不用了): 1. 將 VC 取消最大化,并縮小窗口,能看到代碼就行。 2. 按一下 F10(單步執(zhí)行),會(huì)看到屏幕上出現(xiàn)一個(gè)黃色的小箭頭,指示將要執(zhí)行的代碼。 3. 當(dāng)箭頭指向 initgraph 語(yǔ)句時(shí),按 F10,能看到窗口發(fā)生了變化。 4. 將新的繪圖窗口和 VC 并排放,相互不要有覆蓋。這步很重要,否則繪圖內(nèi)容將會(huì)被 VC 窗口覆蓋。 5. F10 執(zhí)行 getch 后,記得激活繪圖窗口,并按任意鍵,否則程序不會(huì)繼續(xù)執(zhí)行。 6. closegraph 后,直接按 F5 執(zhí)行全部剩余程序,結(jié)束。 單步執(zhí)行很重要,可以讓你知道程序執(zhí)行到哪里是什么效果,哪條語(yǔ)句執(zhí)行出了問題等等。 更詳細(xì)的調(diào)試資料,請(qǐng)看這里:/s/1eR6HT 該文檔寫的調(diào)試的東西比較多,看一下大概有個(gè)了解,以后都會(huì)用到(不過以后我就不再講了) 作業(yè) 2 仍然是寫一個(gè)用直線繪制的圖形,并熟悉調(diào)試過程。 注: 1. 許多學(xué)校都忽略了調(diào)試部分,如果你不曾用過調(diào)試,請(qǐng)務(wù)必熟練該過程。 2. win-tc 不帶有任何調(diào)試功能,即便你不用 vc,也請(qǐng)不要使用 win-tc。調(diào)試是相當(dāng)相當(dāng)重要的。 三 學(xué)會(huì)更多的繪圖語(yǔ)句 常用的繪圖語(yǔ)句 line(x1, y1, x2, y2); / 畫直線 (x1,y1)-(x2,y2),都是整形 circle(x, y, r); / 畫圓,圓心為(x,y),半徑為 r putpixel(x, y, c); / 畫點(diǎn)(x,y),顏色 c 還有很多,如畫橢圓、圓弧、矩形、多邊形,等等,請(qǐng)參考繪圖幫助文件(第一課的繪圖庫(kù)的下載里面有) 設(shè)置顏色 setlinecolor(c);/ 設(shè)置畫線顏色,如 setlinecolor(RED)設(shè)置畫線顏色為紅色 常用的顏色常量可以用: BLACK 黑 DARKGRAY 深灰 BLUE 藍(lán) LIGHTBLUE 亮藍(lán) GREEN 綠 LIGHTGREEN 亮綠 CYAN 青 LIGHTCYAN 亮青 RED 紅 LIGHTRED 亮紅 MAGENTA 紫 LIGHTMAGENTA 亮紫 BROWN 棕 YELLOW 黃 LIGHTGRAY 淺灰 WHITE 白 配出更多的顏色 顏色除了前面寫的 16 種以外,還可以自由配色。格式:RGB(r, g, b) r / g / b 分別表示紅色、綠色、藍(lán)色,范圍都是 0255。例如,RGB(255,0,0) 表示純紅色。 紅色和綠色配成黃色,因此 RGB(255, 255, 0) 表示黃色。 嫌調(diào)色麻煩可以用畫筆里面的調(diào)色試試,調(diào)好了以后直接將數(shù)值抄過來就行。 例如,畫兩條紅色濃度為 200 的直線,可以這么寫: setlinecolor(RGB(200, 0, 0); line(100, 100, 200, 100); line(100, 120, 200, 120); 用數(shù)字表示顏色 除了用 RGB(r,g,b)方式外,還可以用 16 進(jìn)制表示顏色,格式:0xbbggrr 例如,setlinecolor(0x0000ff) 和 setlinecolor(RGB(255, 0, 0) 是等效的。 延時(shí)語(yǔ)句 這個(gè)很簡(jiǎn)單,Sleep(n) 就可以表示 n 毫秒的延時(shí)。例如延時(shí) 3 秒,可以用 Sleep(3000); 作業(yè) 1. 簡(jiǎn)單看一下繪圖庫(kù)的幫助文件,了解更多的繪圖語(yǔ)句。 2. 繪制更豐富的圖形內(nèi)容,不低于 20 行。 3. 將延時(shí)語(yǔ)句適當(dāng)?shù)牟迦肷蟼€(gè)作業(yè)的代碼中,看看執(zhí)行效果。 注:繪圖語(yǔ)句不需要記住,用的時(shí)候翻翻手冊(cè)就行。 四 結(jié)合流程控制語(yǔ)句來繪圖 熟練使用循環(huán)、判斷語(yǔ)句 熟悉 for 語(yǔ)句 這步需要自學(xué),看看自己手邊的書,是怎樣講 for 語(yǔ)句的,簡(jiǎn)單看看就行。 范例 例如,畫 10 條直線的代碼: #include #include void main() initgraph(640, 480); for(int y=100; y200; y+=10) line(100, y, 300, y); getch(); closegraph(); 換一下循環(huán)的范圍和間隔,看看效果。 還可以用來畫漸變色,例如: #include #include void main() initgraph(640, 480); for(int y=0; y256; y+) setcolor(RGB(0,0,y); line(100, y, 300, y); getch(); closegraph(); 熟悉 if 語(yǔ)句 這步需要自學(xué),看看自己手邊的書,是怎樣講 if 語(yǔ)句的,簡(jiǎn)單看看就行。 配合 if 語(yǔ)句,實(shí)現(xiàn)紅色、藍(lán)色交替畫線: #include #include void main() initgraph(640, 480); for(int y=100; y200; y+=10) if ( y/10 % 2 = 1) / 判斷奇數(shù)行偶數(shù)行 setcolor(RGB(255,0,0); else setcolor(RGB(0,0,255); line(100, y, 300, y); getch(); closegraph(); 作業(yè) 1. 畫圍棋棋盤。 2. 畫中國(guó)象棋的棋盤 3. 畫國(guó)際象棋的棋盤,看手冊(cè)找到顏色填充語(yǔ)句,實(shí)現(xiàn)國(guó)際象棋棋盤的區(qū)塊填充。 4. 自學(xué) while 語(yǔ)句。 學(xué)到這里,已經(jīng)可以畫出很多東西了。把自己想象中的圖案繪制一下吧。 五 數(shù)學(xué)知識(shí)在繪圖中的運(yùn)用 理解數(shù)學(xué)的重要性 1. 最簡(jiǎn)單的,來個(gè)全屏的漸變色吧,是上一課的擴(kuò)展。就是需要將 0255 的顏色和 0479 的 y 軸對(duì)應(yīng)起來 c 表示顏色,范圍 0255 y 表示 y 軸,范圍 0479 于是: c / 255 = y / 479 c = y / 479 * 255 = y * 255 / 479 (先算乘法再算除法可以提高精度)看代碼: #include #include void main() initgraph(640, 480); int c; forint y=0; y480; y+) ( c = y * 255 / 479; setcolor(RGB(0,0,c); line(0, y, 639, y); getch(); closegraph(); 試試效果吧。 2. 畫一個(gè)圓形的漸變色 首先,我們要用到圓形的基本公式: x*x + y*y = r*r 讓弧度從 02*3.14,然后需要根據(jù)弧度和半徑算出(x,y),用 pi 表示圓周率用 r 表示半徑 用 a 表示弧度(小數(shù))用 c 表示顏色 于是: x=r*cos(a) y=r*sin(a) c=a*255/(2*pi) 看看代碼: #include #include #include #define PI 3.14 void main() initgraph(640, 480); int c; double a; int x, y, r = 200; fora = 0; a PI * 2; a += 0.0001) ( x=(int)(r * cos(a) + 320 + 0.5); y=(int)(r * sin(a) + 240 + 0.5); c=(int)(a * 255 / (2 * PI) + 0.5); setcolor(RGB(c, 0, 0); line(320, 240, x, y); getch(); closegraph(); 作業(yè) 這次沒什么作業(yè),只是理解一下數(shù)學(xué)的重要性而已。如果讀者還在念書,請(qǐng)重視數(shù)學(xué)。 六 實(shí)現(xiàn)簡(jiǎn)單動(dòng)畫 所謂動(dòng)畫,其實(shí)是連續(xù)顯示一系列圖形而已。 結(jié)合到程序上,我們需要以下幾個(gè)步驟: 1. 繪制圖像 2. 延時(shí) 3. 擦掉圖像 循環(huán)以上即可實(shí)現(xiàn)動(dòng)畫。 舉一個(gè)例子,我們實(shí)現(xiàn)一條直線從上往下移動(dòng): #include #include void main() initgraph(640, 480); for(int y=0; y480; y+) / 繪制綠色直線 setcolor(GREEN); line(0, y, 639, y); / 延時(shí) Sleep(10); / 繪制黑色直線(即擦掉之前畫的綠線) setcolor(BLACK); line(0, y, 639, y); closegraph(); 再看一個(gè)例子,實(shí)現(xiàn)一個(gè)圓從左往右跳動(dòng): #include #include void main() initgraph(640, 480); for(int x=100; x540; x+=20) / 繪制黃線、綠色填充的圓 setcolor(YELLOW); setfillcolor(GREEN); fillcircle(x, 100, 20); / 延時(shí) Sleep(500); / 繪制黑線、黑色填充的圓 setcolor(BLACK); setfillcolor(BLACK); fillcircle(x, 100, 20); closegraph(); 也就是說,移動(dòng)的間距小、延時(shí)短,動(dòng)畫就會(huì)越細(xì)膩。但當(dāng)畫面較復(fù)雜時(shí),會(huì)帶來畫面的閃爍(怎樣消除閃爍是以后的話題)。 作業(yè) 繪制一個(gè)沿 45 度移動(dòng)的球,碰到窗口邊界后反彈。 七 捕獲按鍵,實(shí)現(xiàn)動(dòng)畫的簡(jiǎn)單控制 最常用的一個(gè)捕獲按鍵的函數(shù):getch() 前幾課,都把這個(gè)函數(shù)當(dāng)做“按任意鍵繼續(xù)”來用,現(xiàn)在我們用變量保存這個(gè)按鍵: char c = getch(); 然后再做判斷即可。 不過程序執(zhí)行到 getch() 是會(huì)阻塞的,直到用戶有按鍵才能繼續(xù)執(zhí)行??捎螒蛑锌偛荒芤?yàn)榈却存I而停止游戲執(zhí)行吧?所以,要有一個(gè)函數(shù),判斷是否有用戶按鍵:kbhit() 這個(gè)函數(shù)返回當(dāng)前是否有用戶按鍵,如果有,再用 getch() 獲取即可,這樣是不會(huì)阻塞的。 即: char c; if (kbhit() c = getch(); 舉一個(gè)簡(jiǎn)單的例子,如果有按鍵,就輸出相關(guān)按鍵。否則,輸出“.”。每隔 100 毫秒輸出一次。按 ESC 退出。 注:ESC 的 ASCII 碼是 27。 完整代碼如下: #include #include #include void main() char c = 0; while(c != 27) if (kbhit() c = getch(); else c = .; printf(%c, c); Sleep(100); 結(jié)合上一課的簡(jiǎn)單動(dòng)畫,就可以做出來靠按鍵移動(dòng)的圖形了吧,看以下代碼,實(shí)現(xiàn) a s 控制圓的左右移動(dòng): / 繪制新的圖形 setcolor(YELLOW); setfillcolor(GREEN); fillcircle(x, 240, 20); / 延時(shí) Sleep(10); closegraph(); 作業(yè) 請(qǐng)繼續(xù)完成這個(gè)程序,實(shí)現(xiàn)以下功能: 1. 上下的控制; 2. 邊界檢測(cè); 3. 結(jié)合 kbhit 實(shí)現(xiàn)慣性移動(dòng)(即按一下方向鍵,圓就會(huì)一直向這個(gè)方向移動(dòng)) 注:上下左右等按鍵的控制,會(huì)返回 2 個(gè)字符。由于該系列教程面向初學(xué)者,因此有興趣的請(qǐng)查看 MSDN。 八 用函數(shù)簡(jiǎn)化相同圖案的制作 實(shí)際中有許多類似的圖案,如果一一單獨(dú)繪制,太麻煩。于是,我們需要一個(gè)公用的繪制過程,就是函數(shù)。 例如,我們需要畫 5 個(gè)三角形,位于不同的位置。我們可以將繪制單個(gè)三角形的過程寫成函數(shù),函數(shù)內(nèi)是一個(gè)獨(dú)立的程序段,這個(gè)繪制過程很簡(jiǎn)單。 然后,在需要繪制的時(shí)候,調(diào)用這個(gè)函數(shù)即可??梢酝ㄟ^參數(shù)來解決細(xì)微差異(圖案的坐標(biāo)、顏色等),例如: #include #include / 在坐標(biāo) (x,y) 處,用顏色 c 繪制三角形 void sanjiaoxing(int x, int y, int c) / 設(shè)置畫線顏色 setlinecolor(c); / 畫三角形的三條邊 line(x, y, x+50, y); line(x, y, x, y+50); line(x+50, y, x, y+50); void main() initgraph(640, 480); / 初始化圖形窗口 sanjiaoxing(100, 100, RED); sanjiaoxing(120, 160, BLUE); sanjiaoxing(140, 220, GREEN); sanjiaoxing(160, 120, BLUE); sanjiaoxing(160, 160, GREEN); sanjiaoxing(220, 140, GREEN); getch(); / 按任意鍵繼續(xù) closegraph(); / 關(guān)閉圖形窗口 再結(jié)合循環(huán)等控制條件,就能繪制更復(fù)雜漂亮的圖案了。試試運(yùn)行下面程序,理解一下函數(shù)的用處: #include #include void sanjiaoxing(int x, int y, int color) / 設(shè)置畫線顏色 setlinecolor(color); / 畫三角形的三條邊 line(x, y, x+10, y); line(x, y, x, y+10); line(x+10, y, x, y+10); void main() initgraph(640, 480); / 初始化圖形窗口 for(int x=0; x640; x+=10) forint y=0; y480; y+= 10) ( sanjiaoxing(x, y, RGB(x*255/640, y*255/480, 0); getch(); / 按任意鍵繼續(xù) closegraph(); / 關(guān)閉圖形窗口 運(yùn)行效果: 本節(jié)作業(yè): 1. 繪制 Windows 自帶游戲“掃雷”的初始界面。 2. 這個(gè)作業(yè)有點(diǎn)獨(dú)特,仔細(xì)看下面這個(gè)數(shù)學(xué)過程: 1. 隨機(jī)生成 3 個(gè)點(diǎn) P0、P1、P2; 2. 隨機(jī)生成 1 個(gè)點(diǎn) P; 3. 繪制點(diǎn) P; 4. 隨機(jī)生成 0, 2 內(nèi)的整數(shù) n; 5. 令 P = P 與 Pn 的中點(diǎn); 6. 重復(fù)執(zhí)行步驟 (3)(5) 三萬(wàn)次。 問題是:以上步驟執(zhí)行完以后,這三萬(wàn)個(gè)點(diǎn)在屏幕上會(huì)是個(gè)什么情況?有規(guī)律嗎?很難想出來吧,那就寫個(gè)程序把這個(gè)過程模擬一下,看看究竟是什么 九 繪圖中的位運(yùn)算 位運(yùn)算和繪圖有什么關(guān)系?先舉個(gè)例子來個(gè)感性認(rèn)識(shí):使用 XOR 運(yùn)算可以實(shí)現(xiàn)擦除圖形后不破壞背景,這在時(shí)鐘程序中繪制表針是很有用的。稍后我們會(huì)給出這樣的例子。 一、位運(yùn)算的運(yùn)算法則 位運(yùn)算主要分 4 種:NOT、AND、OR、XOR,位運(yùn)算的運(yùn)算對(duì)象是二進(jìn)制數(shù)(十進(jìn)制要轉(zhuǎn)換為二進(jìn)制,計(jì)算機(jī)會(huì)自動(dòng)轉(zhuǎn)換)。 運(yùn)算法則如下: 1. NOT 表示“取反”,將二進(jìn)制位的 1 變 0、0 變 1。 C 語(yǔ)言用符號(hào) 表示。 如: 二進(jìn)制: 1101 = 0010 用十進(jìn)制表示就是:13 = 2 2. AND 表示“并且”,只有兩數(shù)的對(duì)應(yīng)二進(jìn)制位都為 1,結(jié)果的二進(jìn)制位才為 1;否則,結(jié)果的二進(jìn)制位為 0。 C 語(yǔ)言用符號(hào) & 表示。 如: 二進(jìn)制:1101 & 0110 = 0100 用十進(jìn)制表示就是:13 & 6 = 4 3. OR 表示“或者”,兩數(shù)的對(duì)應(yīng)二進(jìn)制位只要有一個(gè)是 1,結(jié)果的二進(jìn)制位就是 1;否則,結(jié)果的二進(jìn)制位為 0。 C 語(yǔ)言用符號(hào) | 表示。 如: 二進(jìn)制:0101 | 0110 = 0111 用十進(jìn)制表示就是:5 | 6 = 7 4. XOR 表示“異或”,兩數(shù)的對(duì)應(yīng)二進(jìn)制位不同,結(jié)果的二進(jìn)制位為 1;相同,結(jié)果的二進(jìn)制位為 0。 C 語(yǔ)言用符號(hào) 表示。 如: 二進(jìn)制:0101 1110 = 1011 以上只是簡(jiǎn)單介紹一下,詳細(xì)的還是請(qǐng)大家看課本上的講解。 二、 位運(yùn)算的應(yīng)用 位運(yùn)算的應(yīng)用很多,例如 AND 和 OR 在獲取和設(shè)置標(biāo)志位時(shí)經(jīng)常使用。更多的,以后大家會(huì)逐漸遇到,暫時(shí)先記下有這么回事。 這里著重說一下 XOR 運(yùn)算,它有一個(gè)重要的特性:(a b) b = a 也就是說,a b 之后可能是某些其它數(shù)字,但是只要再 b 一下,就又成了 a。 一些簡(jiǎn)單的加密就用的 XOR 的這個(gè)特性。 至于繪圖,假如 a 是背景圖案,b 是將要繪制的圖案,只要用 XOR 方式繪圖,連續(xù)繪兩次,那么背景是不變的。 三、 演示我們來一個(gè)簡(jiǎn)單的繪圖 XOR 運(yùn)算演示: #include #include void main() initgraph(640, 480); / 初始化 640 x 480 的繪圖窗口 setlinestyle(PS_SOLID, 10); / 設(shè)置線寬為 10這樣效果明顯 setlinecolor(GREEN); 為綠色 / 設(shè)置畫線顏色, rectangle(100, 100, 200, 200); / 畫一個(gè)矩形,當(dāng)做背景圖案 setwritemode(R2_XORPEN); / 設(shè)置 XOR 繪圖模式 setcolor(RED); 線顏色為紅色 / 設(shè)置畫 line(50, 0, 200, 300); / 畫線 getch(); / 等待按任意鍵 line(50, 0, 200, 300); 式重復(fù)畫線會(huì)恢復(fù)背景圖案) / 畫線(XOR 方 getch(); / 等待按任意鍵 closegraph(); 圖窗口 / 關(guān)閉繪運(yùn)行一下,看到第一次畫線后,矩形與直線相交的部分,顏色變成了青色,青色就是白色和紅色 XOR 的值。當(dāng)再次以紅色畫線時(shí),青色部分消失了,還原為完整的白色矩形框。 四、 完整的范例 來一個(gè)相對(duì)完整的范例吧,就是鐘表程序,三個(gè)表針用的都是 XOR 方式繪制,請(qǐng)大家運(yùn)行體會(huì)一下 XOR 的作用: #include #include #include #define PI 3void Draw(int hour, int minute, int second) 五、 作業(yè) circle(320, 240, 2); circle(320, 240, 60); circle(320, 240, 160); outtextxy(296, 310, _T(BestAns); / 設(shè)置 XOR 繪圖模式 setwritemode(R2_XORPEN); / 設(shè)置 XOR 繪圖模式 / 繪制表針 SYSTEMTIME ti; / 定義變量保存當(dāng)前時(shí)間 whilekbhit() (! / 按任意鍵退出鐘表程序 GetLocalTime(&ti); / 獲取當(dāng)前時(shí)間 Draw(ti.wHour, ti.wMinute, ti.wSecond); / 畫表針 Sleep(1000); / 延時(shí) 1 Draw(ti.wHour, ti.wMinute, ti.wSecond); / 擦表針(擦表針和畫表針的過程是一樣的) closegraph(); / 關(guān)閉繪圖窗口 最后給出的繪制時(shí)鐘的例子,很不完善,有不少問題。請(qǐng)完善該程序。例如樣式上,表盤上沒有刻度,沒有數(shù)字,指針靠中心的一端應(yīng)該長(zhǎng)出來一點(diǎn)點(diǎn),表盤太簡(jiǎn)單。還有就是嘗試發(fā)現(xiàn)并改進(jìn)功能實(shí)現(xiàn)上的問題。 十 用鼠標(biāo)控制繪圖/游戲程序 捕獲鼠標(biāo)消息就像捕獲按鍵消息一樣簡(jiǎn)單。對(duì)于按鍵,通常我們會(huì)先檢查是否有按鍵,然后定義一個(gè)變量保存按鍵,再然后根據(jù)該按鍵的值,執(zhí)行相應(yīng)的程序。 對(duì)于鼠標(biāo),道理是一樣的。先寫個(gè)代碼對(duì)比一下: 獲取按鍵: 獲取鼠標(biāo): char c; MOUSEMSG m; if (kbhit() if (MouseHit() c = getch(); m = GetMouseMsg(); 很簡(jiǎn)單吧。由于鼠標(biāo)消息的內(nèi)容太多,不像按鍵那么簡(jiǎn)單,因此需要用一個(gè)結(jié)構(gòu)體來保存。通過該結(jié)構(gòu)體,我們可以獲取鼠標(biāo)的如下信息: struct MOUSEMSG UINT uMsg; / 當(dāng)前鼠標(biāo)消息 bool mkCtrl; / Ctrl 鍵是否按下 bool mkShift; / Shift 鍵是否按下 bool mkLButton; / 鼠標(biāo)左鍵是否按下 bool mkMButton; / 鼠標(biāo)中鍵是否按下 bool mkRButton; / 鼠標(biāo)右鍵是否按下 int x; / 當(dāng)前鼠標(biāo) x 坐標(biāo) int y; / 當(dāng)前鼠標(biāo) y 坐標(biāo) int wheel; / 鼠標(biāo)滾輪滾動(dòng)值 ; 其中,“當(dāng)前鼠標(biāo)消息”可能是以下值: WM_MOUSEMOVE 鼠標(biāo)移動(dòng)消息 WM_MOUSEWHEEL 鼠標(biāo)滾輪撥動(dòng)消息 WM_LBUTTONDOWN 左鍵按下消息 WM_LBUTTONUP 左鍵彈起消息 WM_LBUTTONDBLCLK 左鍵雙擊消息 WM_MBUTTONDOWN 中鍵按下消息 WM_MBUTTONUP 中鍵彈起消息 WM_MBUTTONDBLCLK 中鍵雙擊消息 WM_RBUTTONDOWN 右鍵按下消息 WM_RBUTTONUP 右鍵彈起消息 WM_RBUTTONDBLCLK 右鍵雙擊消息 例如,判斷獲取的消息是否是鼠標(biāo)左鍵按下,可以用: if (m.uMsg = WM_LBUTTONDOWN) . 下面舉一個(gè)綜合的例子(我偷點(diǎn)懶,直接粘貼的繪圖庫(kù)幫助里面的鼠標(biāo)范例),該程序會(huì)用紅色的點(diǎn)標(biāo)出鼠標(biāo)移動(dòng)的軌跡,按左鍵畫一個(gè)小方塊,按 Ctrl+左鍵畫一個(gè)大方塊,按右鍵退出: #include #include void main() / 初始化圖形窗口 initgraph(640, 480); MOUSEMSG m; / 定義鼠標(biāo)消息 while(true) / 獲取一條鼠標(biāo)消息 m = GetMouseMsg(); switch(m.uMsg) case WM_MOUSEMOVE: / 鼠標(biāo)移動(dòng)的時(shí)候畫紅色的小點(diǎn) putpixel(m.x, m.y, RED); break; case WM_LBUTTONDOWN: / 如果點(diǎn)左鍵的同時(shí)按下了 Ctrl 鍵 if (m.mkCtrl) / 畫一個(gè)大方塊 rectangle(m.x-10, m.y-10, m.x+10, m.y+10); else / 畫一個(gè)小方塊 rectangle(m.x-5, m.y-5, m.x+5, m.y+5); break; case WM_RBUTTONUP: return; / 按鼠標(biāo)右鍵退出程序 / 關(guān)閉圖形窗口 closegraph(); 本節(jié)作業(yè) 1. 畫一個(gè)填充的三角形,要用鼠標(biāo)點(diǎn)選三角形的三個(gè)頂點(diǎn)。提示:可以用 fillpoly 函數(shù)畫多邊形。 2. 寫一個(gè)“格子涂色”的游戲,要求:屏幕上有 16x8 的格子,屏幕底部有類似畫筆中的選色區(qū)(隨便放上一些常用的顏色),鼠標(biāo)點(diǎn)擊選擇區(qū)的顏色后,就作為當(dāng)前顏色,然后再點(diǎn)屏幕上的格子,就可以用剛才的顏色填涂相應(yīng)格子。 十一 隨機(jī)函數(shù)簡(jiǎn)介 游戲中,許多情況都是隨即發(fā)生的。還有一些圖案程序,例如屏保,也是隨即運(yùn)動(dòng)的。這就需要用隨機(jī)函數(shù)。 隨機(jī)函數(shù)很簡(jiǎn)單,只有一個(gè): rand() 該函數(shù)返回 032767 之間的一個(gè)整數(shù)。(不需要記住 32767 這個(gè)數(shù)字,大概知道這個(gè)范圍就行了) 該函數(shù)在頭文件 中,使用前記得引用。 簡(jiǎn)單測(cè)試 來寫個(gè)程序測(cè)試一下: #include #include void main() int r; for(int i=0; i10; i+) r = rand(); printf(%dn, r); 執(zhí)行后,可以看到輸出了 10 個(gè)隨機(jī)數(shù)字。 指定范圍的隨機(jī)函數(shù) 實(shí)際中,我們經(jīng)常要產(chǎn)生指定范圍的隨機(jī)函數(shù),通常我們用求余數(shù)的辦法。例如,產(chǎn)生 09 之間的隨機(jī)數(shù),只需要將任意產(chǎn)生的隨機(jī)數(shù)除以 10 求余數(shù)即可。求余數(shù)的運(yùn)算符號(hào)是 %,我們可以這樣做: r = rand() % 10; 修改前面的測(cè)試程序執(zhí)行后可以看到,產(chǎn)生的數(shù)字都是小于 10 的。 如果是 16 之間的怎樣求呢? r = rand() % 6 + 1; 無(wú)論產(chǎn)生什么樣范圍的隨機(jī)函數(shù),都是通過各種運(yùn)算將隨機(jī)數(shù)的范圍 0, 32767 修改為自己需要的范圍。 隨機(jī)種子 做了多次試驗(yàn),我們會(huì)發(fā)現(xiàn)一個(gè)問題:雖然產(chǎn)生的數(shù)字是隨機(jī)的,但每次產(chǎn)生的數(shù)字序列都一樣。為了解決這個(gè)問題,我們需要用“隨機(jī)種子”。 隨機(jī)函數(shù)的產(chǎn)生原理簡(jiǎn)單來說,就是:前一個(gè)隨機(jī)函數(shù)的值,決定下一個(gè)隨機(jī)函數(shù)的值。 根據(jù)這個(gè)原理我們可以知道:只要第一個(gè)隨機(jī)函數(shù)的值確定了,那么后面數(shù)字序列就是確定的。如果我們想的得到不同的數(shù)字序列,我們需要確定第一個(gè)隨機(jī)函數(shù)的值,對(duì)于設(shè)置第一個(gè)隨機(jī)函數(shù)的值,叫做設(shè)置“隨機(jī)種子”。易知,隨機(jī)種子設(shè)置一次即可。 設(shè)置隨機(jī)種子的函數(shù)如下: srand(種子); 通常,我們用當(dāng)前時(shí)間來做隨機(jī)種子: srand( (unsigned)time( NULL ) ); 因?yàn)槭褂?time 函數(shù),所以記得引用 。 繪圖中的應(yīng)用 來一個(gè)簡(jiǎn)單的程序,在屏幕上任意位置畫任意顏色的點(diǎn)(按任意鍵退出): #include #include #include #include void main() srand( (unsigned)time( NULL ) ); initgraph(640, 480); int x, y, c; while(!kbhit() x = rand() % 640; y = rand() % 480; c = RGB(rand() % 256, rand() % 256, rand() % 256); putpixel(x, y, c); closegraph(); 作業(yè) 1. 回顧一下第 6 課“實(shí)現(xiàn)簡(jiǎn)單動(dòng)畫”的作業(yè):繪制一個(gè)沿 45 度移動(dòng)的球,碰到窗口邊界后反彈。將這個(gè)球改為任意方向運(yùn)動(dòng),碰到邊界后任意反彈。 十二 數(shù)組 一維數(shù)組 數(shù)組可以實(shí)現(xiàn)批量操作。比如,我們產(chǎn)生 10 個(gè)隨機(jī)數(shù),產(chǎn)生后先保存起來,然后輸出最大的: int n10; int i; for (i=0; i=0; i-) printf(%dn, ni); / 找出最大的 int max = -1; for (i=0; i max) max = ni; printf(最大的數(shù)字是:%dn, max); 看明白這個(gè)程序后,我們繼續(xù)。下面,我們繪制一個(gè)從屏幕上邊任意位置往下落的白色點(diǎn): #include #include #include #include void main() srand( (unsigned)time(NULL) ); initgraph(640, 480); int x = rand() % 640; / 點(diǎn)的 x 坐標(biāo) int y = 0; / 點(diǎn)的 y 坐標(biāo) while(!kbhit() / 擦掉前一個(gè)點(diǎn) putpixel(x, y, BLACK); / 計(jì)算新坐標(biāo) y+=3; if (y = 480) break; / 繪制新點(diǎn) putpixel(x, y, WHITE); Sleep(10); closegraph(); 現(xiàn)在利用數(shù)組,來產(chǎn)生 100 個(gè)隨機(jī)下落的點(diǎn)。并且每個(gè)點(diǎn)落到底部后,就回到頂部重新往下落: #include #include #include #include void main() srand( (unsigned)time(NULL) ); initgraph(640, 480); / 定義點(diǎn)的坐標(biāo)數(shù)組 int x100; / 點(diǎn)的 x 坐標(biāo) int y100; / 點(diǎn)的 y 坐標(biāo) int i; / 初始化點(diǎn)的初始坐標(biāo) for (i=0; i100; i+) xi = rand() % 640; yi = rand() % 480; while(!kbhit() for(i=0; i= 480) yi = 0; / 繪制新點(diǎn) putpixel(xi, yi, WHITE); Sleep(10); closegraph(); 二維數(shù)組 理解了一維數(shù)組,再看二維數(shù)組甚至多維數(shù)組,就簡(jiǎn)單多了,看下面程序理解一下二維數(shù)組: 程序要求:屏幕上有 16x8 的方格,按隨機(jī)順序在將 1128 的數(shù)字寫到每個(gè)格子上。考慮:我們需要記錄這些格子,哪些寫過數(shù)字,哪些沒寫數(shù)字。 我們用一個(gè)二維數(shù)組來記錄: bool cell168; 寫過數(shù)字后,我們將相應(yīng)數(shù)組的值設(shè)置為 true,看程序: #include #include #include #include #include void main() int x, y; char num4; srand( (unsigned)time(NULL) ); initgraph(640, 480); / 畫格子 for (x=0; x=480; x+=30) for (y=0; y=240; y+=30) line(x, 0, x, 240); line(0, y, 4

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論