貪吃蛇實(shí)驗(yàn)報(bào)告_第1頁
貪吃蛇實(shí)驗(yàn)報(bào)告_第2頁
貪吃蛇實(shí)驗(yàn)報(bào)告_第3頁
貪吃蛇實(shí)驗(yàn)報(bào)告_第4頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、本文格式為word版,下載可任意編輯貪吃蛇實(shí)驗(yàn)報(bào)告 計(jì)算機(jī) 程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告 課 題 名 稱 貪吃蛇嬉戲 班 級(jí) 學(xué) 號(hào) 姓 名 指 導(dǎo) 教 師 設(shè) 計(jì) 時(shí) 間 至 設(shè) 計(jì) 地 點(diǎn) 常熟理工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院 名目 1 需求分析 . 1 2 系統(tǒng)分析和設(shè)計(jì) . 1 2.1 數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)和選擇的理由 . 1 2.2 系統(tǒng)模塊劃分和模塊結(jié)構(gòu) . 3 2.3 流程圖 . 4 2.4 數(shù)據(jù)類型、全局變量和函數(shù)說明 . 4 3 程序測(cè)試和運(yùn)行結(jié)果 . 4 4 課程報(bào)告小結(jié) . 5 4.1 分?jǐn)?shù)重疊顯示 . 5 4.2 速度太快 . 5 4.3 食物可能消失在蛇身上 . 5 附錄 a:程序源代

2、碼 . 6 1 需求分析 【闡述課程設(shè)計(jì)應(yīng)當(dāng)完成的功能】 使用鍵盤的上下左右,來掌握蛇的運(yùn)動(dòng)方向,esc 鍵退出,并顯示得分。 2 系統(tǒng)分析和設(shè)計(jì) 2.1 數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)和選擇的理由 本嬉戲中涉及的主要數(shù)據(jù)結(jié)構(gòu)是如何表示運(yùn)動(dòng)的蛇、食物狀態(tài)等問題。 2.1 1 .1 從嬉戲參考畫面中我們可以看到,貪吃蛇的身體是一節(jié)節(jié)的,由一個(gè)個(gè)大小相同的方塊組成,那么我們可以用一個(gè)(x,y)坐標(biāo)為左上角的、固定寬度的正方形來表示一節(jié)蛇身。為表示連續(xù)的多節(jié)身體,那么我們可以采納數(shù)組(或鏈表,或線性表)等數(shù)據(jù)結(jié)構(gòu)來表示。下面以數(shù)組方式為例: struct point int x, y; struct point n

3、odesmax_length; /蛇身數(shù)組,max_length 為最大蛇長(zhǎng) 貪吃蛇是在不斷的運(yùn)動(dòng)的,我們討論蛇的運(yùn)動(dòng)可以發(fā)覺這樣的特點(diǎn): 1. 蛇頭由鍵盤掌握,鍵盤不操作時(shí),保持原有方向運(yùn)動(dòng);(用 int direction;表示) 2. 運(yùn)動(dòng)時(shí),蛇身后面一節(jié)移動(dòng)到前面一節(jié)的位置。當(dāng)我們用nodes0表示蛇頭的時(shí)候,nodes1運(yùn)動(dòng)到 nodes0處;nodes2運(yùn)動(dòng)到nodes1處.。 3. 吃到一個(gè)食物以后,蛇身會(huì)增加一節(jié)。即該數(shù)組中的有效數(shù)據(jù)個(gè)數(shù)加一。(用 int length;表示) 依據(jù)上面的狀況,我們可以設(shè)計(jì)蛇的數(shù)據(jù)結(jié)構(gòu)如下: struct snake struct point

4、nodesmax_length; /蛇身數(shù)組,保存每節(jié)蛇身的坐標(biāo)。max_length 為最大蛇長(zhǎng) int length; /當(dāng)前蛇長(zhǎng) int direction; /蛇頭運(yùn)動(dòng)方向 int live; /蛇活的,還是已經(jīng)死了? 2.1 1 .2 關(guān)于食物,有兩個(gè)屬性: 1. 坐標(biāo)位置 2. 狀態(tài):存在,或被吃。 故我們用以下結(jié)構(gòu)表示: struct food struct point position; /食物的位置 int exist; /存在?還是被吃? 2.2 系統(tǒng)模塊劃分和模塊結(jié)構(gòu) void main() init(); /*初始化*/ l=1; while(l) /*循環(huán)嬉戲*/ s

5、elect(); /*嬉戲速度和結(jié)束的選擇菜單*/ gameplay(); /*嬉戲主程序*/ close(); /*關(guān)閉嬉戲*/ 2.3 流程圖 2.4 數(shù)據(jù) 類型、全局變量和函數(shù)說明 2.4.1 數(shù)據(jù)類型 struct point /*一個(gè)存放點(diǎn)坐標(biāo)的結(jié)構(gòu)體*/ int x, y; /*被多個(gè)結(jié)構(gòu)體調(diào)用的基本參數(shù),所以統(tǒng)一 用 point 結(jié)構(gòu)體來表示*/ ; struct snake /*用來模擬蛇狀態(tài)的結(jié)構(gòu)體*/ struct point nodesmax_length; /*用來存放蛇每一節(jié)的位置*/ int length; /*蛇長(zhǎng)*/ int direction; /*蛇移動(dòng)的方

6、向*/ int live; /*蛇是否活著*/ snake; /*比較形象的把蛇抽象為一個(gè)數(shù)據(jù)類型*/ struct food /*用來模擬食物狀態(tài)的結(jié)構(gòu)體*/ struct point position; /*食物的位置*/ int exist; /*食物是否存在*/ food; 2.4.2 全局變量 score 得分 left,top,right,bottom 嬉戲區(qū)域范圍 lastx,lasty 用來保存最終一節(jié)蛇的位置 keycode 用來保存按下的鍵 2.4.3 函數(shù)說明 void init(void); 初始化程序,給一些初始值賦值 void gameplay(void); 嬉戲主

7、循環(huán) void close(void); 關(guān)閉嬉戲 void drawwall(void); 畫墻 void createfood(void); 制造一個(gè)食物 void drawfood(void); 畫出食物 void drawsnake(void); 畫出蛇 void drawscore(void); 畫出分?jǐn)?shù) int touchwall(void); 推斷 是否遇到墻 int touchself(void); 推斷是否遇到自己 void gameover(void); 嬉戲結(jié)束 void movesnake(void); 移動(dòng)蛇 int oppositedirection(int key

8、code); 推斷是否方向有誤 int foodeat(void); 推斷是否吃到食物 void expandsnake(void); 把蛇增長(zhǎng)一節(jié) 3 程序測(cè)試和運(yùn)行結(jié)果 -選擇速度開頭或退出 -嬉戲運(yùn)行中 -嬉戲結(jié)束 4 課程報(bào)告小結(jié) 【遇到的問題及解決方法分析等】 1 4.1 分?jǐn)?shù)重疊顯示 解決方法:每次都用一塊黑的矩形掩蓋 setfillstyle(1,16); bar(45,45,150,80); 2 4.2 速度太快 解決方法:循環(huán) delay for(d=0;d4;d+) delay(game_speed); 3 4.3 食物可能消失在蛇身上 解決方法:依次推斷,若重疊則重新生成

9、食物 void createfood() int i; label: food.position.x=left+10*(int)rand()%11); food.position.y=top+10*(int)rand()%11); for(i=0;i=snake.length-1;i+) if(snake.nodesi.x=food.position.xsnake.nodesi.y=food.position.y) goto label; 附錄 a:程序源代碼 /*writer: neolone(lb)*/ #include graphics.h #include stdlib.h #incl

10、ude time.h #include stdio.h #include dos.h #include conio.h #include bios.h #define true 1 #define false 0 #define up 0x4800 #define down 0x5000 #define left 0x4b00 #define right 0x4d00 #define esc 0x011b #define speed1 0x0231 #define speed2 0x0332 #define speed3 0x0433 #define quit 0x0b30 #define e

11、nter 0x1c0d #define max_length 100 /* max length of snake nodess */ #define game_speed 100 /* game speed */ /* data structure */ struct point int x, y; ; struct snake struct point nodesmax_length; int length; int direction; int live; snake; struct food struct point position; int exist; food; int sco

12、re=0,max,max1,max2,max3,left=200,top=200,right=300,bottom=300,lastx,lasty,keycode,keycode2,sp,l,sel,times=1; char text80; /* functions declaration */ void init(void); void gameplay(void); void close(void); void drawwall(void); void createfood(void); void drawfood(void); void drawsnake(void); void dr

13、awscore(void); int touchwall(void); int touchself(void); void gameover(void); void movesnake(void); int oppositedirection(int keycode); int foodeat(void); void expandsnake(void); void select(void); /*-*/ void main() init(); l=1; while(l) select(); gameplay(); close(); void init() int gdriver=vga ,gm

14、ode=vgahi ; snake.nodes0.x=250; snake.nodes0.y=250; snake.nodes1.x=250; snake.nodes1.y=260; snake.length=2; snake.live=1; snake.direction=up; score=0; food.exist=0; initgraph (gdriver,gmode,c:tc20bgi); randomize();/*sui ji shu fa sheng qi*/ drawwall(); void close() file *fp; closegraph(); if(fp=fope

15、n(data.txt,w)=null) /* 關(guān)閉時(shí)保存最高分*/ exit(0); else fprintf(fp,%d,%d,%d,max1,max2,max3); fclose(fp); printf(pess any key to continue); void gameplay() int keycode,d; getch(); while(true) drawscore(); drawwall(); if (touchwall() | touchself() gameover(); return; if (!food.exist) createfood(); food.exist=

16、1; drawfood(); drawsnake(); for(d=0;dsp;d+) delay(game_speed); if (bioskey(1) != 0) keycode = bioskey(0); switch(keycode) case esc: gameover(); return; default: lastx=snake.nodessnake.length-1.x; lasty=snake.nodessnake.length-1.y; if (!oppositedirection(keycode) snake.direction = keycode; movesnake(

17、); if (foodeat() food.exist = false; score += 10; expandsnake(); void drawwall() rectangle(left,top,right+10,bottom+10); void createfood() int i; label: food.position.x=left+10*(int)rand()%11); food.position.y=top+10*(int)rand()%11); for(i=0;i=snake.length-1;i+) if(snake.nodesi.x=food.position.xsnak

18、e.nodesi.y=food.position.y) goto label; void drawfood() setfillstyle(1,2); bar(food.position.x,food.position.y,food.position.x+10,food.position.y+10); void drawsnake() int j; setfillstyle(1,4); for(j=0;j=snake.length-1;j+) bar(snake.nodesj.x,snake.nodesj.y,snake.nodesj.x+10,snake.nodesj.y+10); void

19、drawscore(void) setfillstyle(1,16); bar(45,45,150,80); setcolor(white); sprintf(text,writer:neolone); outtextxy(170,50,text); sprintf(text,score:%5d,score); outtextxy(50,50,text); int touchwall() int x1=snake.nodes0.x; int y1=snake.nodes0.y; if(x1left|x1right|y1top|y1bottom) return true; else return

20、 false; int touchself() int i; for (i=3;isnake.length-1;i+) if(snake.nodes0.x=snake.nodesi.xsnake.nodes0.y=snake.nodesi.y) return true; return false; void gameover() file *fp; int x2,y2; x2=180; y2=250; setcolor(white); sprintf(text,game over !your score is %d,%d,score,sel); outtextxy(x2,y2,text); d

21、elay(1000); getch(); switch(sel%4) case 1: if(scoremax1) max1=score; break; case 2: if(scoremax2) max2=score; break; case 3: if(scoremax3) max3=score; break; default : break; void movesnake() int k; setfillstyle(1,16); lastx=snake.nodessnake.length-1.x; lasty=snake.nodessnake.length-1.y; bar(snake.n

22、odessnake.length-1.x,snake.nodessnake.length-1.y,snake.nodessnake.length-1.x+10,snake.nodessnake.length-1.y+10); for(k=snake.length-2;k=0;k-) snake.nodesk+1.x=snake.nodesk.x; snake.nodesk+1.y=snake.nodesk.y; if(snake.direction=up) snake.nodes0.y-=10; else if(snake.direction=down) snake.nodes0.y+=10;

23、 else if(snake.direction=left) snake.nodes0.x-=10; else if(snake.direction=right) snake.nodes0.x+=10; else ; int oppositedirection(int keycode) if(keycode=upsnake.direction=down) return 1; else if(keycode=downsnake.direction=up) return 1; else if(keycode=leftsnake.direction=right) return 1; else if(

24、keycode=rightsnake.direction=left) return 1; else return 0; int foodeat() if(snake.nodes0.x=food.position.xsnake.nodes0.y=food.position.y) return 1; else return 0; void expandsnake() if(keycode=up) lastx-=10; else if(keycode=down) lastx+=10; else if(keycode=left) lasty-=10; else if(keycode=right) la

25、sty+=10; else ; snake.nodessnake.length.x=lastx; snake.nodessnake.length.y=lasty; snake.length+; void select() setfillstyle(1,7); /*實(shí)現(xiàn)選擇速度的可視化菜單*/ bar(420,220,490,310); setfillstyle(1,9); bar(430,230,480,240); setfillstyle(1,5); setcolor(white); sprintf(text,speed1); outtextxy(430,230,text); bar(430

26、,250,480,260); sprintf(text,speed2); outtextxy(430,250,text); bar(430,270,480,280); sprintf(text,speed3); outtextxy(430,270,text); bar(430,290,480,300); sprintf(text, quit ); outtextxy(430,290,text); sel=1; t=1; while(t) delay(10); if (bioskey(1) != 0) keycode = bioskey(0); switch(keycode) case up:

27、sel-;break; case down: sel+;break; case enter: t=0;break; default : break; switch(sel%4) case 0: setfillstyle(1,9); bar(430,290,480,300); setcolor(white); setfillstyle(1,5); bar(430,230,480,240); sprintf(text,speed1); outtextxy(430,230,text); bar(430,250,480,260); sprintf(text,speed2); outtextxy(430

28、,250,text); bar(430,270,480,280); sprintf(text,speed3); outtextxy(430,270,text); sprintf(text, quit ); outtextxy(430,290,text); break; case 1: setfillstyle(1,9); bar(430,230,480,240); setfillstyle(1,5); setcolor(white); sprintf(text,speed1); outtextxy(430,230,text); bar(430,250,480,260); sprintf(tex

29、t,speed2); outtextxy(430,250,text); bar(430,270,480,280); sprintf(text,speed3); outtextxy(430,270,text); bar(430,290,480,300); sprintf(text, quit ); outtextxy(430,290,text); break; case 2: setfillstyle(1,9); bar(430,250,480,260); setfillstyle(1,5); bar(430,230,480,240); setcolor(white); sprintf(text,speed1); outtextxy(430,230,text); sprintf(text,speed2); outtextxy(430,250,text); bar(430,270,480,280); sprintf(text,speed3); outtextxy(430,270,text);

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論