版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1:創(chuàng)建新項(xiàng)目自己動(dòng)手建立項(xiàng)目試試,并輸入以下代碼:#include <stdio.h>void main() printf("Hello World!");然后,輸入以下代碼試試(無需理解代碼含義):#include <graphics.h>#include <conio.h>void main() initgraph(640, 480); line(200, 240, 440, 240); line(320, 120, 320, 3
2、60); getch(); closegraph();執(zhí)行后應(yīng)該可以看到屏幕正中央有一個(gè)十字2:簡(jiǎn)單繪圖,學(xué)習(xí)單步執(zhí)行#include <graphics.h> / 繪圖庫頭文件,繪圖語句需要#include <conio.h> / 控制臺(tái)輸入輸出頭文件,getch()語句需要void main() initgraph(640, 480); / 初始化640x480的繪圖屏幕 line(200, 240, 440, 240); / 畫線(200,240) - (440,2
3、40) 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í)行完成
4、作業(yè)后(務(wù)必完成),開始試著單步執(zhí)行剛才的程序,由于繪圖和多線程等因素的限制,請(qǐng)務(wù)必按照以下步驟嘗試(熟練了以后就不用了):1. 將VC取消最大化,并縮小窗口,能看到代碼就行。2. 按一下F10(單步執(zhí)行),會(huì)看到屏幕上出現(xiàn)一個(gè)黃色的小箭頭,指示將要執(zhí)行的代碼。3. 當(dāng)箭頭指向initgraph語句時(shí),按F10,能看到窗口發(fā)生了變化。4. 將新的繪圖窗口和VC并排放,相互不要有覆蓋。這步很重要,否則繪圖內(nèi)容將會(huì)被VC窗口覆蓋。5. F10執(zhí)行g(shù)etch后,記得激活繪圖窗口,并按任意鍵,否則程序不會(huì)繼續(xù)執(zhí)行。6. closegraph后,直接按F5執(zhí)行全部剩余程序,結(jié)束。單步執(zhí)行很重要,可以讓你
5、知道程序執(zhí)行到哪里是什么效果,哪條語句執(zhí)行出了問題等等。3:熟悉更多的繪圖語句常用的繪圖語句line(x1, y1, x2, y2); / 畫直線 (x1,y1)-(x2,y2),都是整形circle(x, y, r); / 畫圓,圓心為(x,y),半徑為rputpixel(x, y, c); / 畫點(diǎn)(x,y),顏色c還有很多,如畫橢圓、圓弧、矩形、多邊形,等等,請(qǐng)參考繪圖幫助文件(目錄頁的繪圖庫的下載里面有)設(shè)置顏色setcolor(c); / 設(shè)置繪圖顏色,如setcolor(RED)設(shè)置為紅色等常用的顏色常量可以用:BLACK 黑 DARKGRAY 深灰 BLUE 藍(lán) LIG
6、HTBLUE 亮藍(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)色麻煩可
7、以用畫筆里面的調(diào)色試試,調(diào)好了以后直接將數(shù)值抄過來就行。例如,畫兩條紅色濃度為200的直線,可以寫:setcolor(RGB(200,0,0);line(100,100, 200,100);line(100,120, 200,120);用數(shù)字表示顏色除了用RGB(r,g,b)方式外,還可以用16進(jìn)制表示顏色,格式:0xrrggbb例如,setcolor(0xff0000) 和 setcolor(RGB(255,0,0) 是等效的。延時(shí)語句這個(gè)很簡(jiǎn)單 Sleep(n) 就可以表示 n 毫秒的延時(shí)。例如延時(shí)3秒,可以用 Sleep(3000);作業(yè)1. 簡(jiǎn)單看一下繪圖庫的幫助文件,了解更多的繪圖語
8、句。2. 繪制更豐富的圖形內(nèi)容,不低于20行。3. 將延時(shí)語句適當(dāng)?shù)牟迦肷蟼€(gè)作業(yè)的代碼中,看看執(zhí)行效果。注:繪圖語句不需要記住,用的時(shí)候翻翻手冊(cè)就行。-4:結(jié)合流程控制語句來繪圖范例例如,畫10條直線的代碼:#include <graphics.h>#include <conio.h>void main() initgraph(640, 480); for(int y=100; y<200; y+=10)
9、60; line(100, y, 300, y); getch(); closegraph();換一下循環(huán)的范圍和間隔,看看效果。還可以用來畫漸變色,例如:#include <graphics.h>#include <conio.h>void main() initgraph(640, 480); for(int y=0; y<256; y+)
10、60; setcolor(RGB(0,0,y); line(100, y, 300, y); getch(); closegraph();熟悉if語句這步需要自學(xué),看看自己手邊的書,是怎樣講if語句的,簡(jiǎn)單看看就行。配合if語句,實(shí)現(xiàn)紅色、藍(lán)色交替畫線:#include <graphics.h>#includ
11、e <conio.h>void main() initgraph(640, 480); for(int y=100; y<200; y+=10) if ( y/10 % 2 = 1) / 判斷奇數(shù)行偶數(shù)行
12、160; setcolor(RGB(255,0,0); else setcolor(RGB(0,0,255); line(100, y, 300, y);
13、 getch(); closegraph();作業(yè)1. 畫圍棋棋盤。2. 畫中國象棋的棋盤3. 畫國際象棋的棋盤,看手冊(cè)找到顏色填充語句,實(shí)現(xiàn)過期象棋棋盤的區(qū)塊填充。4. 自學(xué)while語句。學(xué)到這里,已經(jīng)可以畫出很多東西了。把自己想象中的圖案繪制一下吧。5:數(shù)學(xué)知識(shí)在繪圖中的運(yùn)用1. 最簡(jiǎn)單的,來個(gè)全屏的漸變色吧,是上一課的擴(kuò)展。就是需要將0255的顏色和0479的y軸對(duì)應(yīng)起來c 表示顏色,范圍0255y 表示y軸,范圍0479于是:c / 255 = y / 479c = y / 479 * 255 = y
14、 * 255 / 479 (先算乘法再算除法可以提高精度)看代碼:#include <graphics.h>#include <conio.h>void main() initgraph(640, 480); int c; for(int y=0; y<480; y+) c = y * 255 / 479; setcolor(RGB(0,0,c);
15、60; 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 <graphics.h>#include <c
16、onio.h>#include <math.h>void main() initgraph(640, 480); int c; double a; int x, y, r=200; for(a=0; a<PI*2; a+=0.0001) x=(int)(r*cos(a) + 320 + 0.5); y=(in
17、t)(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();6:實(shí)現(xiàn)簡(jiǎn)單動(dòng)畫所謂動(dòng)畫,其實(shí)是連續(xù)顯示一系列圖形而已。結(jié)合到程序上,我們需要以下幾個(gè)步驟:1. 繪制圖像2. 延時(shí)3
18、. 擦掉圖像循環(huán)以上即可實(shí)現(xiàn)動(dòng)畫。舉一個(gè)例子,我們實(shí)現(xiàn)一條直線從上往下移動(dòng):#include <graphics.h>#include <conio.h>void main() initgraph(640, 480); for(int y=0; y<480; y+) / 繪制綠色直線 setcolor(GREEN); line
19、(0, y, 639, y); / 延時(shí) Sleep(10); / 繪制黑色直線(即擦掉之前畫的綠線) setcolor(BLACK); line(0, y, 639, y); closegraph();再看一個(gè)例子,實(shí)現(xiàn)一個(gè)圓從左往右跳動(dòng):#include <grap
20、hics.h>#include <conio.h>void main() initgraph(640, 480); for(int x=100; x<540; x+=20) / 繪制黃線、綠色填充的圓 setcolor(YELLOW); setfillstyle(GREEN);
21、fillellipse(x, 100, 20, 20); / 演示 Sleep(500); / 繪制黑線、黑色填充的圓 setcolor(BLACK); setfillstyle(BLACK); fillellipse(x, 100, 20, 20);
22、; closegraph();也就是說,移動(dòng)的間距小、延時(shí)短,動(dòng)畫就會(huì)越細(xì)膩。但當(dāng)畫面較復(fù)雜時(shí),會(huì)帶來畫面的閃爍(怎樣消除閃爍是以后的話題)。7:捕獲按鍵,實(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()
23、 獲取即可,這樣是不會(huì)阻塞的。即:char c;if (kbhit() c = getch();舉一個(gè)簡(jiǎn)單的例子,如果有按鍵,就輸出相關(guān)按鍵。否則,輸出“.”。每隔 100 毫秒輸出一次。按 ESC 退出。注:ESC 的 ASCII 碼是 27。完整代碼如下:#include <graphics.h>#include <stdio.h>#include <conio.h>void main() char c = 0; while(c != 27)
24、0; if (kbhit() c = getch(); else c = '.' printf("%c", c); Sleep(100); 結(jié)合上一課的簡(jiǎn)單動(dòng)畫,就可以做
25、出來靠按鍵移動(dòng)的圖形了吧,看以下代碼,實(shí)現(xiàn) a s 控制圓的左右移動(dòng):#include <graphics.h>#include <conio.h>void main() initgraph(640, 480); int x = 320; / 畫初始圖形 setcolor(YELLOW); setfillstyle(GREEN); fillellipse(x, 240, 20, 20); c
26、har c; while(c != 27) / 獲取按鍵 c = getch(); / 先擦掉上次顯示的舊圖形 setcolor(BLACK); setfillstyle(BLACK); fillellipse(x, 24
27、0, 20, 20); / 根據(jù)輸入,計(jì)算新的坐標(biāo) switch(c) case 'a': x-=2; break; case 'd': x+=2; break;
28、0; case 27: break; / 繪制新的圖形 setcolor(YELLOW); setfillstyle(GREEN); fillellipse(x, 240, 20, 20); / 延時(shí) Sleep(10)
29、; 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。8:用函數(shù)簡(jiǎn)化相同圖案的制作實(shí)際中有許多類似的圖案,如果一一單獨(dú)繪制,太麻煩。于是,我們需要一個(gè)公用的繪制過程,就是函數(shù)。例如,我們需要畫5個(gè)三角形,位于不同的位置。我們可以將繪制單個(gè)三角形的過程寫成函數(shù),函數(shù)內(nèi)是一個(gè)獨(dú)立的程序段,這個(gè)繪制過程很簡(jiǎn)單。然后,在需
30、要繪制的時(shí)候,調(diào)用這個(gè)函數(shù)即可。可以通過參數(shù)來解決細(xì)微差異(圖案的坐標(biāo)、顏色等),例如:#include <graphics.h>#include <conio.h>/ 在坐標(biāo) (x,y) 處,用顏色 c 繪制三角形void sanjiaoxing(int x, int y, int c) / 設(shè)置畫線顏色 setcolor(c); / 畫三角形的三條邊 line(x, y, x+
31、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); sanj
32、iaoxing(140, 220, GREEN); sanjiaoxing(160, 120, BLUE); sanjiaoxing(160, 160, GREEN); sanjiaoxing(220, 140, GREEN); getch(); / 按任意鍵繼續(xù) closegraph(); / 關(guān)閉圖形窗口再結(jié)合循環(huán)等控制條件,就能繪制更復(fù)雜漂亮的圖案了。
33、試試運(yùn)行下面程序,理解一下函數(shù)的用處:#include <graphics.h>#include <conio.h>void sanjiaoxing(int x, int y, int color) / 設(shè)置畫線顏色 setcolor(color); / 畫三角形的三條邊 line(x, y, x+10, y); line(x, y,
34、 x, y+10); line(x+10, y, x, y+10);void main() initgraph(640, 480); / 初始化圖形窗口 for(int x=0; x<640; x+=10) for(int y=0; y<480; y+= 10) &
35、#160; sanjiaoxing(x, y, RGB(x*255/640, y*255/480, 0); getch(); / 按任意鍵繼續(xù) closegraph(); / 關(guān)閉圖形窗口運(yùn)行效果:本節(jié)作業(yè):1. 繪制 Windows 自帶游戲“掃雷”的初始界面。9:繪圖中的位運(yùn)算位運(yùn)算和繪圖有什么關(guān)系?先舉個(gè)例子來個(gè)感性認(rèn)識(shí):使用XOR運(yùn)算可以實(shí)現(xiàn)擦除圖形后不破壞背景,這在時(shí)鐘程序中繪制表針是很有用的。稍后我們會(huì)給出這樣的例子。一、位運(yùn)算的運(yùn)算法則位
36、運(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語言用符號(hào) 表示。如:二進(jìn)制: 1101 = 0010用十進(jìn)制表示就是:13 = 22. AND表示“并且”,只有兩數(shù)的對(duì)應(yīng)二進(jìn)制位都為1,結(jié)果的二進(jìn)制位才為1;否則,結(jié)果的二進(jìn)制位為0。C語言用符號(hào) & 表示。如:二進(jìn)制:1101 & 0110 = 0100用十進(jìn)制表示就是:13 & 6 = 43. OR表示“或者”,兩數(shù)的對(duì)應(yīng)二進(jìn)制位只要有一個(gè)是1,結(jié)果的二進(jìn)制位就是1;否則,結(jié)果的二
37、進(jìn)制位為0。C語言用符號(hào) | 表示。如:二進(jìn)制:0101 | 0110 = 0111用十進(jìn)制表示就是:5 | 6 = 74. XOR表示“異或”,兩數(shù)的對(duì)應(yīng)二進(jìn)制位不同,結(jié)果的二進(jìn)制位為1;相同,結(jié)果的二進(jìn)制位為0。C語言用符號(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
38、 一下,就又成了 a。一些簡(jiǎn)單的加密就用的 XOR 的這個(gè)特性。至于繪圖,假如 a 是背景圖案,b 是將要繪制的圖案,只要用 XOR 方式繪圖,連續(xù)繪兩次,那么背景是不變的。三、演示我們來一個(gè)簡(jiǎn)單的繪圖 XOR 運(yùn)算演示:#include <graphics.h>#include <conio.h>void main() initgraph(640, 480); / 初始化 640 x 480 的繪圖窗口 setlinestyle(PS_S
39、OLID, NULL, 10); / 設(shè)置線寬為 10,這樣效果明顯 rectangle(100,100,200,200); / 畫一個(gè)矩形,當(dāng)做背景圖案 setwritemode(R2_XORPEN); / 設(shè)置 XOR 繪圖模式 setcolor(RED); / 設(shè)置畫線顏色 line(50,0, 200,300); &
40、#160; / 畫線 getch(); / 等待按任意鍵 line(50,0, 200,300); / 畫線(XOR 方式重復(fù)畫線會(huì)恢復(fù)背景圖案) getch(); / 等待按任意鍵 closegraph();
41、60; / 關(guān)閉繪圖窗口運(yùn)行一下,看到第一次畫線后,矩形與直線相交的部分,顏色變成了青色,青色就是白色和紅色 XOR 的值。當(dāng)再次以紅色畫線時(shí),青色部分消失了,還原為完整的白色矩形框。四、完整的范例來一個(gè)相對(duì)完整的范例吧,就是鐘表程序,三個(gè)表針用的都是 XOR 方式繪制,請(qǐng)大家運(yùn)行體會(huì)一下 XOR 的作用:#include <graphics.h>#include <conio.h>(1)· 回復(fù)· 1樓· 2010-05-23 09:57· 舉報(bào) |·· Best
42、Ans· 吧主9#include <math.h>void Draw(int hour, int minute, int second) double a_hour, a_min, a_sec; / 時(shí)、分、秒針的弧度值 int x_hour, y_hour, x_min, y_min, x_sec, y_sec; / 時(shí)、分、秒針的末端位置 / 計(jì)算時(shí)、分、
43、秒針的弧度值 a_sec = second * 2 * PI / 60; a_min = minute * 2 * PI / 60 + a_sec / 60; a_hour= hour * 2 * PI / 12 + a_min / 12; / 計(jì)算時(shí)、分、秒針的末端位置 x_sec = 320 + (int)(120 * sin(a_sec);
44、 y_sec = 240 - (int)(120 * cos(a_sec); x_min = 320 + (int)(100 * sin(a_min); y_min = 240 - (int)(100 * cos(a_min); x_hour= 320 + (int)(70 * sin(a_hour); y_hour= 240 - (int)(70 * cos(a_ho
45、ur); / 畫時(shí)針 setlinestyle(PS_SOLID, NULL, 10); setcolor(WHITE); line(320, 240, x_hour, y_hour); / 畫分針 setlinestyle(PS_SOLID, NULL, 6);
46、 setcolor(LIGHTGRAY); line(320, 240, x_min, y_min); / 畫秒針 setlinestyle(PS_SOLID, NULL, 2); setcolor(RED); line(320, 240, x_sec, y_sec);void main() initgraph
47、(640, 480); / 初始化 640 x 480 的繪圖窗口 / 繪制一個(gè)簡(jiǎn)單的表盤 circle(320, 240, 2); circle(320, 240, 60); circle(320, 240, 160); outtextxy(296, 300, "BestAns");
48、60; / 設(shè)置 XOR 繪圖模式 setwritemode(R2_XORPEN); / 設(shè)置 XOR 繪圖模式 / 繪制表針 SYSTEMTIME ti; / 定義變量保存當(dāng)前時(shí)間 while(!kbhit() / 按任意鍵退出鐘表程序 &
49、#160; GetLocalTime(&ti); / 獲取當(dāng)前時(shí)間 Draw(ti.wHour, ti.wMinute, ti.wSecond); / 畫表針
50、 Sleep(1000); / 延時(shí) 1 秒 Draw(ti.wHour, ti.wMinute, ti.wSecond); / 擦表針(擦表針和畫表針的過程是一樣的) closegraph();
51、60; / 關(guān)閉繪圖窗口五、作業(yè)最后給出的繪制時(shí)鐘的例子,很不完善,有不少問題。請(qǐng)完善該程序。例如樣式上,表盤上沒有刻度,沒有數(shù)字,指針靠中心的一端應(yīng)該長(zhǎng)出來一點(diǎn)點(diǎn),表盤太簡(jiǎn)單。還有就是嘗試發(fā)現(xiàn)并改進(jìn)功能實(shí)現(xiàn)上的問題。10:用鼠標(biāo)控制繪圖/游戲程序捕獲鼠標(biāo)消息就像捕獲按鍵消息一樣簡(jiǎn)單。對(duì)于按鍵,通常我們會(huì)先檢查是否有按鍵,然后定義一個(gè)變量保存按鍵,再然后根據(jù)該按鍵的值,執(zhí)行相應(yīng)的程序。對(duì)于鼠標(biāo),道理是一樣的。先寫個(gè)代碼對(duì)比一下:獲取按鍵: &
52、#160; 獲取鼠標(biāo):char c; MOUSEMSG m;if (kbhit() if (MouseHit() c = getch
53、(); 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; &
54、#160; / Ctrl 鍵是否按下 bool mkShift; / Shift 鍵是否按下 bool mkLButton; / 鼠標(biāo)左鍵是否按下 bool mkMButton; / 鼠標(biāo)中鍵是否按下 bool mkRButton; / 鼠標(biāo)右鍵是否按下 int x;
55、0; / 當(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
56、; 鼠標(biāo)移動(dòng)消息WM_MOUSEWHEEL 鼠標(biāo)滾輪撥動(dòng)消息WM_LBUTTONDOWN 左鍵按下消息WM_LBUTTONUP 左鍵彈起消息WM_LBUTTONDBLCLK 左鍵雙擊消息WM_MBUTTONDOWN 中鍵按下消息WM_MBUTTONUP 中鍵彈起消息WM_MBUTTONDBLCLK 中鍵雙擊消息WM_RBUTTONDOWN
57、0; 右鍵按下消息WM_RBUTTONUP 右鍵彈起消息WM_RBUTTONDBLCLK 右鍵雙擊消息例如,判斷獲取的消息是否是鼠標(biāo)左鍵按下,可以用:if (m.uMsg = WM_LBUTTONDOWN) .下面舉一個(gè)綜合的例子(我偷點(diǎn)懶,直接粘貼的繪圖庫幫助里面的鼠標(biāo)范例),該程序會(huì)用紅色的點(diǎn)標(biāo)出鼠標(biāo)移動(dòng)的軌跡,按左鍵畫一個(gè)小方塊,按Ctrl+左鍵畫一個(gè)大方塊,按右鍵退出:#include <graphics.h>#include <time.h>#include <conio.h>
58、void main() / 初始化圖形窗口 initgraph(640, 480);(1)· 回復(fù)· 1樓· 2010-05-23 09:59· 舉報(bào) |·· BestAns· 吧主9 MOUSEMSG m; / 定義鼠標(biāo)消息 wh
59、ile(true) / 獲取一條鼠標(biāo)消息 m = GetMouseMsg(); switch(m.uMsg)
60、0; case WM_MOUSEMOVE: / 鼠標(biāo)移動(dòng)的時(shí)候畫紅色的小點(diǎn) putpixel(m.x, m.y, RED);
61、0; break; case WM_LBUTTONDOWN: / 如果點(diǎn)左鍵的同時(shí)按
62、下了 Ctrl 鍵 if (m.mkCtrl) / 畫一個(gè)大方塊
63、0; rectangle(m.x-10, m.y-10, m.x+10, m.y+10); else
64、0; / 畫一個(gè)小方塊 rectangle(m.x-5, m.y-5, m.x+5, m.y+5); bre
65、ak; case WM_RBUTTONUP: return; / 按鼠標(biāo)右鍵退出程序
66、; / 關(guān)閉圖形窗口 closegraph();本節(jié)作業(yè)1. 畫一個(gè)填充的三角形,要用鼠標(biāo)點(diǎn)選三角形的三個(gè)頂點(diǎn)。提示:可以用 fillpoly 函數(shù)畫多邊形。2. 寫一個(gè)“涂格子(也叫點(diǎn)燈)”的游戲。詳細(xì)規(guī)則可以試玩網(wǎng)上的各種版本。3. 如果有精力,嘗試寫一個(gè)掃雷吧(這個(gè)有點(diǎn)難度,能實(shí)現(xiàn)多少就實(shí)現(xiàn)多少,無法實(shí)現(xiàn)的功能先放下)。11:隨機(jī)函數(shù)隨機(jī)函數(shù)簡(jiǎn)介游戲中,許多情況都是隨即發(fā)生的。還有一些圖案程序,例如屏保,也是隨即運(yùn)動(dòng)的。這就需要用隨機(jī)函數(shù)。隨機(jī)函數(shù)很簡(jiǎn)單,只有一個(gè):rand()該
67、函數(shù)返回 032767 之間的一個(gè)整數(shù)。(不需要記住 32767 這個(gè)數(shù)字,大概知道這個(gè)范圍就行了)該函數(shù)在頭文件 <stdlib.h> 中,使用前記得引用。簡(jiǎn)單測(cè)試來寫個(gè)程序測(cè)試一下:#include <stdio.h>#include <stdlib.h>void main() int r; for(int i=0; i<10; i+)
68、; 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í)
69、行后可以看到,產(chǎn)生的數(shù)字都是小于 10 的。如果是 16 之間的怎樣求呢? r = rand() % 6 + 1;無論產(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ù)字序列,我們需
70、要確定第一個(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ù),所以記得引用 <time.h>。繪圖中的應(yīng)用來一個(gè)簡(jiǎn)單的程序,在屏幕上任意位置畫任意顏色的點(diǎn)(按任意鍵退出):#include <graphics.h>#include <stdlib.h>#include <conio.h>#include <time.h>void
71、 main() srand( (unsigned)time( NULL ) ); initgraph(640, 480); int x, y, c; while(!kbhit() x = rand() % 640;
72、 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è):繪制一
73、個(gè)沿 45 度移動(dòng)的球,碰到窗口邊界后反彈。將這個(gè)球改為任意方向運(yùn)動(dòng),碰到邊界后任意反彈。12:數(shù)組一維數(shù)組數(shù)組可以實(shí)現(xiàn)批量操作。比如,我們產(chǎn)生 10 個(gè)隨機(jī)數(shù),產(chǎn)生后先保存起來,然后輸出最大的: int n10; int i; for (i=0; i<10; i+) ni = rand() % 1000;
74、; / 按生成的順序,逆序輸出 for (i=9; i>=0; i-) printf("%dn", ni); / 找出最大的 int max = -1; for (i=0; i<10; i+) &
75、#160; if (ni > max) max = ni; printf("最大的數(shù)字是:%dn", max);看明白這個(gè)程序后,我們繼續(xù)。下面,我們繪制一個(gè)從屏幕上邊任意位置往下落的白色點(diǎn):#include <graphics.h>#include <stdlib
76、.h>#include <conio.h>#include <time.h>void main() srand( (unsigned)time(NULL) ); initgraph(640, 480); int x = rand() % 640; / 點(diǎn)的 x 坐標(biāo) int y = 0;
77、60; / 點(diǎn)的 y 坐標(biāo) while(!kbhit() / 擦掉前一個(gè)點(diǎn) putpixel(x, y, BLACK); / 計(jì)算新坐標(biāo)
78、60; y+=3; if (y >= 480) break; / 繪制新點(diǎn) putpixel(x, y, WHITE); Sleep(10);
79、0; closegraph();現(xiàn)在利用數(shù)組,來產(chǎn)生 100 個(gè)隨機(jī)下落的點(diǎn)。并且每個(gè)點(diǎn)落到底部后,就回到頂部重新往下落:#include <graphics.h>#include <stdlib.h>#include <conio.h>#include <time.h>void main() srand( (unsigned)time(NULL) ); initgr
80、aph(640, 480); / 定義點(diǎn)的坐標(biāo)數(shù)組 int x100; / 點(diǎn)的 x 坐標(biāo) int y100; / 點(diǎn)的 y 坐標(biāo) &
81、#160; int i; / 初始化點(diǎn)的初始坐標(biāo) for (i=0; i<100; i+) xi = rand() % 640;(0)· 回復(fù)· 1樓· 2010-05-28 11:12· 舉報(bào) |·· BestAns· 吧主9
82、0; yi = rand() % 480; while(!kbhit() for(i=0; i<100; i+)
83、0; / 擦掉前一個(gè)點(diǎn) putpixel(xi, yi, BLACK); / 計(jì)算新坐標(biāo) yi+=3;
84、60; if (yi >= 480) yi = 0; / 繪制新點(diǎn) putpixel(xi, yi, WHITE);
85、; 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è)置為 tru
86、e,看程序:#include <graphics.h>#include <stdlib.h>#include <conio.h>#include <stdio.h>#include <time.h>void main() int x, y; char num4; srand( (unsigned)time(NULL) ); initgraph(6
87、40, 480); / 畫格子 for (x=0; x<=480; x+=30) for (y=0; y<=240; y+=30) line(x, 0, x, 240); line(0, y, 480, y); / 定義二維數(shù)組 bool cell168; / 初始化二維數(shù)組 fo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年餐飲供貨與服務(wù)合同(適用于酒店)
- 2024年股權(quán)退出機(jī)制轉(zhuǎn)讓合同3篇
- 2023-2024學(xué)年山東省聊城市高一(上)期末語文試卷
- 2024水電安裝工程承包協(xié)議書
- 2024新版?zhèn)€人房產(chǎn)抵押協(xié)議規(guī)則指南版B版
- 2024年版權(quán)授權(quán)與分成協(xié)議
- 2024年軟件定制開發(fā)與技術(shù)支持服務(wù)合同
- 2024年精準(zhǔn)醫(yī)療體檢服務(wù)合同
- 2024年蔬菜種植與農(nóng)業(yè)科技創(chuàng)新承包協(xié)議3篇
- 疫苗接種服務(wù)的總結(jié)與未來計(jì)劃
- 招標(biāo)代理成果文件質(zhì)量保證措施
- 石油英語詞匯
- 《夜宿山寺》-完整版課件
- 滬教牛津版八年級(jí)上冊(cè)初二英語期末測(cè)試卷(5套)
- 北京市海淀區(qū)2020-2021學(xué)年度第一學(xué)期期末初三物理檢測(cè)試卷及答案
- 《潔凈工程項(xiàng)目定額》(征求意見稿)
- 家庭室內(nèi)裝飾裝修工程保修單
- 小學(xué)語文課堂提問有效性策略研究方案
- 物業(yè)上門維修收費(fèi)標(biāo)準(zhǔn)
- ATS技術(shù)交流(新型發(fā)動(dòng)機(jī)智能恒溫節(jié)能冷卻系統(tǒng))100318
- 手術(shù)區(qū)皮膚的消毒和鋪巾ppt課件
評(píng)論
0/150
提交評(píng)論