版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 C語言大型程序設(shè)計之打地鼠游戲設(shè)計實驗報告目 錄1、游戲設(shè)計目的32、游戲設(shè)計內(nèi)容33、游戲設(shè)計背景知識44、功能分析45、設(shè)計結(jié)果分析56、程序代碼61、 游戲設(shè)計目的1、 熟悉C語言運行環(huán)境Turbo C 2.02、 會簡單的程序調(diào)試3、 熟悉C語言各種類型數(shù)據(jù)的輸入輸出,以及各種函數(shù)的 使用方法4、 掌握順序結(jié)構(gòu)程序設(shè)計2、 游戲設(shè)計內(nèi)容按照經(jīng)典打地鼠游戲制作方案,用C語言編寫程序,主要包括以下幾個部分:1、 游戲開始界面 1.1 初始化游戲 1.2 歡迎界面 1.3 等級選擇 1.4 操縱方式選擇2、游戲過程界面 2.1 畫方格 2.2 計時 2.3 地鼠和錘子畫面設(shè)計 2.4 鼠標
2、操控 2.5 鍵盤操縱 2.6 記錄打中的個數(shù)3、 游戲結(jié)束界面 3.1 判斷成功與失敗 3.2 判斷是否重新開始3、 游戲設(shè)計背景知識打地鼠作為娛樂性質(zhì)的游戲項目,可以鍛煉玩家的反應(yīng)能力,其次,本游戲可通過敲擊鍵盤來控制錘子打地鼠,還能鍛煉玩家對鍵盤的熟悉程度。打地鼠游戲設(shè)計牽涉到圖像處理函數(shù)、聲音處理函數(shù)、動畫處理函數(shù)以及鼠標控制等各方面知識,許多函數(shù)的使用方法可借鑒掃雷游戲的處理方法,通過對現(xiàn)有打地鼠游戲的改造,形成特有的TC下的打地鼠游戲。4、 功能分析總體游戲過程分析:1、 在游戲開始時,先顯示一個歡迎界面,簡單說明游戲規(guī)則,點擊任意鍵開始;2、 選擇游戲等級(等級一:3行3列;等級
3、二:4行4列;等級三:5行5列),選擇使用鍵盤或鼠標操作;3、 游戲開始時,每場游戲時有時間限制,鍵盤玩的時間比鼠標玩的時間稍長,背景界面出現(xiàn)后按任意鍵計時自動開始,屏幕中央位置會顯示一個游戲區(qū),方格表示地鼠顯示區(qū)域,若用鍵盤操縱,在每個方格中還會顯示不同的字母,地鼠在不同方格中閃現(xiàn),用鼠標表示鐵錘;4、 若玩家選擇鍵盤操作,則通過鍵盤輸入各方塊中的字母來控制打地鼠;5、 若玩家選擇鼠標操作,則通過鼠標的運動來擊打地鼠;6、 游戲開始后,按空格鍵表示暫停,按ESC鍵跳出游戲,且按下ESC鍵表示退出游戲后只能手動重新開始;7、 地鼠被打中時,會響起一聲提示音,表示準確打中,屏幕上也會顯示此時打中
4、地鼠的積累數(shù);8、 時間截止時,若打中地鼠總數(shù)達到五十,則判斷勝利,否則為失??;9、 選擇是否繼續(xù)游戲,選擇是,則回到選擇等級界面,選擇否,則退出游戲。5、 設(shè)計結(jié)果分析 預(yù)期要求基本達到,圖像繪制較為美麗,功能都已經(jīng)實現(xiàn),時間控制方面因電腦隨機處理方面產(chǎn)生一些無法計算的因素使得游戲時間控制精確度不夠,鼠標圖形閃爍較為嚴重。6、 程序代碼/*-main.c文件-*/#include#include#include#include#include#include#includepicture.c#includekey.cint grade;/*等級*/int operation;/*操作方式*/
5、int kick=0;/*擊中地鼠個數(shù)*/long count=0;/*控制游戲時間*/int mouseflag=0;/*標記鼠標分辨頻率*/int changeflag=0;/*標記地鼠頻率*/int keyboardflag=0;/*標記地鼠頻率*/void interrupt Timer()/*控制時間*/ count+; if(count%600=0) changeflag=1; if(count%1000=0) keyboardflag=1; if(count%500=0) mouseflag=1; outportb(0x20,0x20);void InstallTime()/*調(diào)
6、用電腦時間中斷*/ disable();/*修改定時器分頻值,使定時器中斷時間變?yōu)?.5ms每次,安裝計時函數(shù)*/ outportb(0x43,0x36); outportb(0x40,596&0x00ff); outportb(0x40,(596&0xff00)8); setvect(0x1c,Timer); enable();void initgr()/*界面初始化*/ int graphdriver=VGA,graphmode=VGAHI; int errorcode; initgraph(&graphdriver,&graphmode,f:tc);void getmouse(int *
7、x,int *y,int *key)/*獲取鼠標函數(shù)*/ union REGS inregs,outregs; inregs.x.ax=3; /*獲取鼠標位置和狀態(tài)也可以用3*/ int86(0x33,&inregs,&outregs); /*中斷調(diào)用*/ *x=outregs.x.cx; /*cx寄存器中存的是橫坐標*/ *y=outregs.x.dx; /*dx寄存器中存的是列坐標*/ *key=outregs.x.bx; /*bx寄存器是按鍵狀態(tài)*/void visbilemouse()/*初始化鼠標函數(shù)*/ union REGS inregs,outregs; inregs.x.ax=
8、0x01; /*顯示鼠標*/ int86(0x33,&inregs,&outregs);void mouse(int *x,int *y,int *z)/*畫鼠標函數(shù)*/ int a=0,b=0,c=0,a_old=0,b_old=0; int *b_ball;/*存儲背景圖片*/ int *m_ball; b_ball=malloc(imagesize(a,b,a+18,b+18); m_ball=malloc(imagesize(0,0,18,18); getimage(a,b,a+18,b+18,b_ball); /*第一次將一個空矩形存入到內(nèi)存中*/ getimage(36,0,54,
9、18,m_ball); getmouse(&a,&b,&c); /*a,為橫坐標,b,為列坐標,c為按鍵狀態(tài)*/ if(a120) a=120; /*保證鼠標不出界*/ if(bgetmaxx()-155) a=getmaxx()-155; if(bgetmaxy()-27) b=getmaxy()-27; if(a!=a_old | b!=b_old) getimage(a,b,a+18,b+18,b_ball); putimage(a,b,m_ball,0); a_old=a;b_old=b; *x=a;*y=b;*z=c; /*返回按鍵后鼠標的位置*/ putimage(a,b,b_ba
10、ll,0); /*將鼠標擦掉*/ free(m_ball); free(b_ball);main() int row=0,col=0;/*行、列*/ int mx,my,mz;/*存儲鼠標位置*/ int *s_hole;/*存儲地鼠洞圖像*/ int *s_ball;/*存儲地鼠圖像*/ int *k4;/*存儲擊中個數(shù)*/ int *tim;/*顯示剩余時間*/ int t=71;/*控制時間顯示*/ int b;/*是否重來*/ initgr();/*界面初始化*/ InstallTime();/*時間控制*/ cleardevice(); setbkcolor(BLACK); Welc
11、ome(); Game_Rules(); again: grade=Choose_Grade(); operation=Choose_Operation(); Hole_Draw(grade,operation); s_hole=malloc(imagesize(0,0,51,80); s_ball=malloc(imagesize(0,0,50,60); tim=malloc(imagesize(0,0,8,8); getimage(320-grade*38+1,320-grade*48+2,320-grade*38+52,320-grade*48-78,s_hole); getimage(
12、530,50,538,58,tim);/*存入黑色方塊*/ grade+=2; setcolor(RED);/*表示剩余時間*/ rectangle(530,70,540,450); setfillstyle(SOLID_FILL,LIGHTRED); floodfill(535,180,RED); susliks(15,270);/*畫地鼠*/ mouse_draw(36,0);/*畫鼠標圖形*/ mouse_draw(36,450); getimage(15,270,65,210,s_ball); setcolor(GREEN); settextstyle(SMALL_FONT,0,5);
13、 sprintf(k,%d,kick); outtextxy(36,250,k); while(count=100000) break; while(1); if(operation=2)/*鼠標操作*/ row=320-grade*38+78*(rand()%grade); col=320-grade*48+98*(rand()%grade); putimage(row,col-60,s_ball,COPY_PUT); visbilemouse();/*鼠標顯示*/ do if(bioskey(1) getkey(0,0,kick); mouse(&mx,&my,&mz); if(mz=1
14、& rowmx & mxrow+50 & col-60my & my=80000) break; while(1); if(kick=50) win();/*判斷輸贏*/ if(kick50) lose(); b=back(); free(s_ball); free(s_hole); free(tim); if(b=1) /*是否重來*/ kick=0; count=0; t=71; goto again; else closegraph(); exit(0);/*-main.c文件-*/*-key.c文件-*/#include#define A 0x1e61#define B 0x3062#
15、define C 0x2e63#define D 0x2064#define E 0x1265#define F 0x2166#define G 0x2267#define H 0x2368#define I 0x1769#define J 0x246a#define K 0x256b#define L 0x266c#define M 0x326d#define N 0x316e#define O 0x186f#define P 0x1970#define Q 0x1071#define R 0x1372#define S 0x1f73#define T 0x1474#define U 0x1
16、675#define V 0x2f76#define W 0x1177#define X 0x2d78#define Y 0x1579#define ONE 0x231#define TWO 0x332#define THREE 0x433#define BLANK 0x3920#define ESC 0x011bint getkey(int row,int col,int kick) /*獲取按鍵信息,返回有效的操作值*/ int key=bioskey(0); switch(key) case A: if(row=206&col=176 | row=168&col=128 | row=13
17、0&col=80) kick+; kick_music(); break; case B: if(row=206&col=274 | row=168&col=226 | row=130&col=178) kick+; kick_music(); break; case C: if(row=206&col=372 | row=168&col=324 | row=130&col=276) kick+; kick_music(); break; case D: if(row=284&col=176 | row=168&col=422 | row=130&col=374) kick+; kick_mu
18、sic(); break; case E: if(row=284&col=274 | row=246&col=128 | row=130&col=472) kick+; kick_music(); break; case F: if(row=284&col=372 | row=246&col=266 | row=208&col=80) kick+; kick_music(); break; case G: if(row=362&col=176 | row=246&col=324 | row=208&col=178) kick+; kick_music(); break; case H: if(
19、row=362&col=274 | row=246&col=422 | row=208&col=276) kick+; kick_music(); break; case I: if(row=362&col=372 | row=324&col=128 | row=208&col=374) kick+; kick_music(); break; case J: if(row=324&col=266 | row=208&col=472) kick+; kick_music(); break; case K: if(row=324&col=324 | row=286&col=80) kick+; k
20、ick_music(); break; case L: if(row=324&col=422 | row=286&col=178) kick+; kick_music(); break; case M: if(row=402&col=128 | row=286&col=276) kick+; kick_music(); break; case N: if(row=402&col=266 | row=286&col=374) kick+; kick_music(); break; case O: if(row=402&col=324 | row=286&col=472) kick+; kick_
21、music(); break; case P: if(row=402&col=422 | row=364&col=80) kick+; kick_music(); break; case Q: if(row=364&col=178) kick+; kick_music(); break; case R: if(row=364&col=276) kick+; kick_music(); break; case S: if(row=364&col=374) kick+; kick_music(); break; case T: if(row=364&col=472) kick+; kick_mus
22、ic(); break; case U: if(row=442&col=80) kick+; kick_music(); break; case V: if(row=442&col=178) kick+; kick_music(); break; case W: if(row=442&col=276) kick+; kick_music(); break; case X: if(row=442&col=374) kick+; kick_music(); break; case Y: if(row=442&col=472) kick+; kick_music(); break; case ONE
23、: return 1; case TWO: return 2; case THREE: return 3; case BLANK: getch(); break; case ESC: outtextxy(10,20,EXIT); getch(); exit(0); break; return kick;/*-key.c文件-*/*-picture.c文件-*/void Welcome()/*開機界面*/ int i,j,k; /*(i,j)在圖像正中心定位*/ int im; int fr=440,1,440,1,440,1,392,392,1,392,392,1,330,330,330,1,
24、330,330,330,1,262,262,262,262,262,262,1, /*設(shè)置背景音樂*/ 296,296,296,296,296,330,330,330,330,296,296,296,296,262,262,262,262,262,220,220,220,220,262,262,1,220,220,220,220,220,1; int tim=1,6,1,6,1,6,1,1,6,1,1,6,1,1,2,1,1,1,2,1,1,1,1,1,1,1,6, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1; i
25、=320; j=200; setcolor(WHITE); line(i-300,j-100,i+300,j-100); /*畫框*/ line(i+300,j-100,i+300,j+100); line(i+300,j+100,i-300,j+100); line(i-300,j+100,i-300,j-100); circle(i,j,10); /*字母A*/ arc(i,j,0,180,20); line(i+20,j,i+20,j+40); line(i+20,j+40,i+10,j+40); line(i+10,j+40,i+10,j+20); line(i+10,j+20,i-1
26、0,j+20); line(i-10,j+20,i-10,j+40); line(i-10,j+40,i-20,j+40); line(i-20,j+40,i-20,j); line(i+40,j,i+60,j); /*畫右橫線*/ line(i+60,j,i+60,j+10); line(i+60,j+10,i+40,j+10); line(i+40,j+10,i+40,j); line(i-40,j,i-60,j); /*畫左橫線*/ line(i-60,j,i-60,j+10); line(i-60,j+10,i-40,j+10); line(i-40,j+10,i-40,j); lin
27、e(i-80,j,i-80,j+10); /*字母c*/ line(i-80,j+30,i-80,j+40); arc(i-80,j+20,90,270,20); arc(i-80,j+20,90,270,10); circle(i-130,j+20,10); /*字母a*/ arc(i-130,j+20,0,270,20); line(i-110,j+20,i-110,j+40); line(i-110,j+40,i-120,j+40); arc(i-125,j+40,0,180,5); arc(i-180,j+20,0,90,10); /*字母h*/ arc(i-180,j+20,0,90
28、,20); line(i-160,j+20,i-160,j+40); line(i-160,j+40,i-170,j+40); line(i-170,j+40,i-170,j+20); line(i-180,j,i-180,j-20); line(i-180,j-20,i-190,j-20); line(i-190,j-20,i-190,j+40); line(i-190,j+40,i-180,j+40); line(i-180,j+40,i-180,j+10); line(i-200,j+10,i-200,j-20); /*字母W*/ line(i-200,j-20,i-210,j-20);
29、 line(i-210,j-20,i-210,j+10); line(i-220,j+10,i-220,j-20); line(i-220,j-20,i-230,j-20); line(i-230,j-20,i-230,j+10); line(i-240,j+10,i-240,j-20); line(i-240,j-20,i-250,j-20); line(i-250,j-20,i-250,j+10); arc(i-215,j+10,180,360,5); arc(i-235,j+10,180,360,5); arc(i-225,j+10,180,360,25); line(i+80,j,i+
30、80,j+40); /*字母M*/ line(i+80,j+40,i+90,j+40); line(i+90,j+40,i+90,j); line(i+100,j,i+100,j+40); line(i+100,j+40,i+110,j+40); line(i+110,j+40,i+110,j); line(i+120,j,i+120,j+40); line(i+120,j+40,i+130,j+40); line(i+130,j+40,i+130,j); arc(i+95,j,0,180,5); arc(i+115,j,0,180,5); arc(i+105,j,0,180,25); cir
31、cle(i+160,j+20,10); /*字母o*/ circle(i+160,j+20,20); line(i+190,j-20,i+190,j+40); /*字母l*/ line(i+190,j+40,i+200,j+40); line(i+200,j+40,i+200,j-20); line(i+200,j-20,i+190,j-20); arc(i+230,j+10,0,180,10); /*字母e*/ arc(i+230,j+20,0,270,20); arc(i+230,j+20,180,270,10); line(i+220,j+10,i+240,j+10); line(i+2
32、20,j+20,i+250,j+20); line(i+230,j+30,i+230,j+40); setcolor(WHITE); /*字母填色*/ setfillstyle(SOLID_FILL,WHITE); floodfill(i,j-15,WHITE); floodfill(i+50,j+5,WHITE); floodfill(i-50,j+5,WHITE); floodfill(i-95,j+20,WHITE); floodfill(i-145,j+20,WHITE); floodfill(i-110,j+20,WHITE); floodfill(i-185,j,WHITE); f
33、loodfill(i-225,j,WHITE); floodfill(i+105,j,WHITE); floodfill(i+175,j+20,WHITE); floodfill(i+195,j,WHITE); floodfill(i+215,j+15,WHITE); setcolor(BROWN); /*框填色*/ setfillstyle(HATCH_FILL,BROWN); floodfill(i,j,WHITE); floodfill(i,j-30,WHITE); floodfill(i+230,j+5,WHITE); for(k=-5;k=6;k+) /*點綴下邊界花邊*/ setc
34、olor(RED); arc(i+k*50-20,j+100,270,90,13); arc(i+k*50-30,j+90,0,180,13); arc(i+k*50-40,j+100,90,270,13); arc(i+k*50-30,j+110,180,360,13); setcolor(LIGHTRED); setfillstyle(SOLID_FILL,LIGHTRED); floodfill(i+k*50-25,j+100,RED); setcolor(YELLOW); circle(i+k*50-30,j+100,10); setfillstyle(LINE_FILL,YELLOW
35、); floodfill(i+k*50-30,j+100,YELLOW); for(k=-6;k=5;k+) /*點綴上邊界花邊*/ setcolor(RED); arc(i+k*50+40,j-100,270,90,13); arc(i+k*50+30,j-110,0,180,13); arc(i+k*50+20,j-100,90,270,13); arc(i+k*50+30,j-90,180,360,13); setcolor(LIGHTRED); setfillstyle(SOLID_FILL,LIGHTRED); floodfill(i+k*50+25,j-100,RED); setc
36、olor(YELLOW); circle(i+k*50+30,j-100,10); setfillstyle(LINE_FILL,YELLOW); floodfill(i+k*50+30,j-100,YELLOW); for(im=0;im26;im+) sound(frim); delay(timim*1000000); nosound(); for(im=27;im57;im+) sound(frim); delay(timim*1000000); nosound(); getch(); cleardevice();void Game_Rules()/*游戲規(guī)則界面*/ int igr,j
37、gr; /*(igr,jgr)在圖像中心定位*/ igr=640; jgr=480; setbkcolor(BLACK); setviewport(igr/2-250,jgr/2-200,igr/2+250,jgr/2+200,1);/*開圖視口*/ setfillstyle(XHATCH_FILL,BROWN); floodfill(igr/2,jgr/2,WHITE); setcolor(LIGHTRED); settextstyle(GOTHIC_FONT,0,7); outtextxy(igr/2-280,jgr/2-200,GAME RULES); /*標題*/ setviewpor
38、t(igr/2-230,jgr/2-100,igr/2+230,jgr/2+180,0); /*又開一窗口*/ setcolor(YELLOW); setfillstyle(SOLID_FILL,BROWN); /*畫一矩形框*/ rectangle(0,20,460,280); floodfill(10,30,YELLOW); setcolor(RED); circle(40,50,5); /*第一條規(guī)則*/ setfillstyle(SOLID_FILL,RED); floodfill(40,50,RED); setcolor(LIGHTRED); arc(40,50,230,30,4);
39、 setcolor(WHITE); settextstyle(SANS_SERIF_FONT,0,1); outtextxy(60,40,choose the keyboard or the mouse); setcolor(RED); circle(40,90,5); /*第二條規(guī)則*/ setfillstyle(SOLID_FILL,RED); floodfill(40,90,RED); setcolor(LIGHTRED); arc(40,90,230,30,4); setcolor(WHITE); settextstyle(SANS_SERIF_FONT,0,1); outtextxy
40、(60,80,click the letter with the keyboard); setcolor(RED); circle(40,130,5); /*第三條規(guī)則*/ setfillstyle(SOLID_FILL,RED); floodfill(40,130,RED); setcolor(LIGHTRED); arc(40,130,230,30,4); setcolor(WHITE); settextstyle(SANS_SERIF_FONT,0,1); outtextxy(60,120,click the left button with the mouse); setcolor(R
41、ED); circle(40,170,5); /*第四條規(guī)則*/ setfillstyle(SOLID_FILL,RED); floodfill(40,170,RED); setcolor(LIGHTRED); arc(40,170,230,30,4); setcolor(WHITE); settextstyle(SANS_SERIF_FONT,0,1); outtextxy(60,160,the time limitation is one minute); setcolor(RED); circle(40,210,5); /*第五條規(guī)則*/ setfillstyle(SOLID_FILL,RED); floodfill(40,210,RED); setcolor(LIGHTRED); arc(40,210,230,30,4); setcolor(WHITE); settextstyle(SANS_SERIF_FONT,0,1); outtextxy(60,200,you will win if you score
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030建筑腳手架行業(yè)市場供需狀況分析投資評估發(fā)展前景研究報告
- 2025-2030建筑材料行業(yè)市場供需分析及投資評估規(guī)劃發(fā)展策略研究
- 2025-2030建筑材料研發(fā)市場廣泛分析及新產(chǎn)品開發(fā)與市場細分研究
- 2026年中國科學技術(shù)大學基礎(chǔ)教育集團公開招聘備考題庫技術(shù)教師備考題庫及完整答案詳解1套
- 2025-2030建筑材料供應(yīng)鏈行業(yè)市場供需結(jié)構(gòu)及投資潛力發(fā)展布局研究報告
- 2026年慈溪市掌起鎮(zhèn)衛(wèi)生院公開招聘公共衛(wèi)生員備考題庫及完整答案詳解一套
- 2026年東北地區(qū)專場招聘事業(yè)編制教師15名備考題庫及完整答案詳解1套
- 2026年中國甘肅國際經(jīng)濟技術(shù)合作有限公司關(guān)于公開招聘各類專業(yè)技術(shù)人員的備考題庫及一套參考答案詳解
- 2026年寧波中遠海運物流有限公司招聘備考題庫含答案詳解
- 游戲公司運營風險控制預(yù)案
- 山東省臨沂市2024-2025學年高二數(shù)學上學期期中試題
- DZ∕T 0248-2014 巖石地球化學測量技術(shù)規(guī)程(正式版)
- JTJ-T-257-1996塑料排水板質(zhì)量檢驗標準-PDF解密
- 殘疾人法律維權(quán)知識講座
- 瀝青維護工程投標方案技術(shù)標
- 水電站建筑物課程設(shè)計
- 兒童行為量表(CBCL)(可打印)
- 硒功能與作用-課件
- 《英語教師職業(yè)技能訓練簡明教程》全冊配套優(yōu)質(zhì)教學課件
- DB53∕T 1034-2021 公路隧道隱蔽工程無損檢測技術(shù)規(guī)程
評論
0/150
提交評論