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

下載本文檔

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

文檔簡(jiǎn)介

..可修編-.z..--.可修編-《計(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需求分析12系統(tǒng)分析和設(shè)計(jì)12.1數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)和選擇的理由12.2系統(tǒng)模塊劃分和模塊結(jié)構(gòu)22.3流程圖32.4數(shù)據(jù)類型、全局變量和函數(shù)說(shuō)明33程序測(cè)試和運(yùn)行結(jié)果44課程報(bào)告小結(jié)54.1分?jǐn)?shù)重疊顯示54.2速度太快54.3食物可能出現(xiàn)在蛇身上5附錄A:程序源代碼6-.z.1需求分析【闡述課程設(shè)計(jì)應(yīng)該完成的功能】使用鍵盤的上下左右,來(lái)控制蛇的運(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)等問(wèn)題。2.1.1從游戲參考畫面中我們可以看到,貪吃蛇的身體是一節(jié)節(jié)的,由一個(gè)個(gè)大小相同的方塊組成,則我們可以用一個(gè)(*,y)坐標(biāo)為左上角的、固定寬度的正方形來(lái)表示一節(jié)蛇身。為表示連續(xù)的多節(jié)身體,則我們可以采用數(shù)組(或鏈表,或線性表)等數(shù)據(jù)結(jié)構(gòu)來(lái)表示。下面以數(shù)組方式為例:

structPoint{

int*,y;

}

structPointnodes[MA*_LENGTH];

//蛇身數(shù)組,MA*_LENGTH為最大蛇長(zhǎng)貪吃蛇是在不斷的運(yùn)動(dòng)的,我們研究蛇的運(yùn)動(dòng)可以發(fā)現(xiàn)這樣的特點(diǎn):

1.蛇頭由鍵盤控制,鍵盤不操作時(shí),保持原有方向運(yùn)動(dòng);(用intdirection;表示)

2.運(yùn)動(dòng)時(shí),蛇身后面一節(jié)移動(dòng)到前面一節(jié)的位置。當(dāng)我們用nodes[0]表示蛇頭的時(shí)候,nodes[1]運(yùn)動(dòng)到nodes[0]處;nodes[2]運(yùn)動(dòng)到nodes[1]處...。

3.吃到一個(gè)食物以后,蛇身會(huì)增加一節(jié)。即該數(shù)組中的有效數(shù)據(jù)個(gè)數(shù)加一。(用intlength;表示)

根據(jù)上面的情況,我們可以設(shè)計(jì)蛇的數(shù)據(jù)結(jié)構(gòu)如下:

structSnake{

structPointnodes[MA*_LENGTH];

//蛇身數(shù)組,保存每節(jié)蛇身的坐標(biāo)。MA*_LENGTH為最大蛇長(zhǎng)

intlength;

//當(dāng)前蛇長(zhǎng)

intdirection;//蛇頭運(yùn)動(dòng)方向

intlive;

//蛇活的,還是已經(jīng)死了?

}

2.1.2關(guān)于食物,有兩個(gè)屬性:

1.坐標(biāo)位置

2.狀態(tài):存在,或被吃。故我們用以下結(jié)構(gòu)表示:

structFood{

structPointposition;

//食物的位置

inte*ist;

//2.2系統(tǒng)模塊劃分和模塊結(jié)構(gòu)voidmain(){ init();/*初始化*/ l=1; while(l)/*循環(huán)游戲*/ { select();/*游戲速度和結(jié)束的選擇菜單*/ gamePlay();/*游戲主程序*/ } close();/*關(guān)閉游戲*/}2.3流程圖2.4數(shù)據(jù)類型、全局變量和函數(shù)說(shuō)明數(shù)據(jù)類型structPoint{/*一個(gè)存放點(diǎn)坐標(biāo)的結(jié)構(gòu)體*/ int*,y;/*被多個(gè)結(jié)構(gòu)體調(diào)用的基本參數(shù),所以統(tǒng)一用point結(jié)構(gòu)體來(lái)表示*/};structSnake{/*用來(lái)模擬蛇狀態(tài)的結(jié)構(gòu)體*/ structPointnodes[MA*_LENGTH];/*用來(lái)存放蛇每一節(jié)的位置*/ intlength;/*蛇長(zhǎng)*/ intdirection;/*蛇移動(dòng)的方向*/ intlive; /*蛇是否活著*/}snake;/*比較形象的把蛇抽象為一個(gè)數(shù)據(jù)類型*/structFood{/*用來(lái)模擬食物狀態(tài)的結(jié)構(gòu)體*/ structPointposition;/*食物的位置*/ inte*ist;/*食物是否存在*/}food;全局變量Score\\得分left,top,right,bottom\\游戲區(qū)域*圍last*,lasty \\用來(lái)保存最后一節(jié)蛇的位置keyCode \\用來(lái)保存按下的鍵函數(shù)說(shuō)明voidinit(void); \\初始化程序,給一些初始值賦值voidgamePlay(void); \\游戲主循環(huán)voidclose(void);\\關(guān)閉游戲voiddrawWall(void);\\畫墻voidcreateFood(void);\\創(chuàng)造一個(gè)食物voiddrawFood(void); \\畫出食物voiddrawSnake(void); \\畫出蛇voiddrawScore(void); \\畫出分?jǐn)?shù)inttouchWall(void);\\判斷是否碰到墻inttouchSelf(void); \\判斷是否碰到自己voidgameOver(void); \\游戲結(jié)束voidmoveSnake(void);\\移動(dòng)蛇intoppositeDirection(intkeyCode);\\判斷是否方向有誤intfoodEat(void); \\判斷是否吃到食物voide*pandSnake(void);\\把蛇增長(zhǎng)一節(jié)3程序測(cè)試和運(yùn)行結(jié)果選擇速度開(kāi)始或退出游戲運(yùn)行中游戲結(jié)束4課程報(bào)告小結(jié)【遇到的問(wèn)題及解決方法分析等】4.1分?jǐn)?shù)重疊顯示解決方法:每次都用一塊黑的矩形覆蓋setfillstyle(1,16); bar(45,45,150,80);4.2速度太快解決方法:循環(huán)delayfor(d=0;d<4;d++)delay(GAME_SPEED);4.3食物可能出現(xiàn)在蛇身上解決方法:依次判斷,若重疊則重新生成食物voidcreateFood(){ inti;label:food.position.*=left+10*((int)rand()%11);food.position.y=top+10*((int)rand()%11); for(i=0;i<=snake.length-1;i++){if(snake.nodes[i].*==food.position.*&&snake.nodes[i].y==food.position.y) gotolabel; }附錄A:程序源代碼/*writer:neolone(LB)*/#include<graphics.h>#include<stdlib.h>#include<time.h>#include<stdio.h>#include<dos.h>#include<conio.h>#include<bios.h>#defineTRUE1#defineFALSE0#defineUP0*4800#defineDOWN0*5000#defineLEFT0*4B00#defineRIGHT0*4D00#defineESC0*011B#defineSPEED10*0231#defineSPEED20*0332#defineSPEED30*0433#defineQUIT0*0B30#defineENTER0*1C0D#defineMA*_LENGTH100 /*ma*lengthofsnakenodess*/#defineGAME_SPEED100/*gamespeed*//*datastructure*/structPoint{ int*,y;};structSnake{ structPointnodes[MA*_LENGTH]; intlength; intdirection; intlive;}snake;structFood{ structPointposition; inte*ist;}food;intscore=0,ma*,ma*1,ma*2,ma*3,left=200,top=200,right=300,bottom=300,last*,lasty,keyCode,keyCode2,sp,l,sel,times=1;charte*t[80];/*functionsdeclaration*/voidinit(void);voidgamePlay(void);voidclose(void);voiddrawWall(void);voidcreateFood(void);voiddrawFood(void);voiddrawSnake(void);voiddrawScore(void);inttouchWall(void);inttouchSelf(void);voidgameOver(void);voidmoveSnake(void);intoppositeDirection(intkeyCode);intfoodEat(void);voide*pandSnake(void);voidselect(void);/**/voidmain(){ init(); l=1; while(l) { select(); gamePlay(); } close();}voidinit(){intgdriver=VGA,gmode=VGAHI;snake.nodes[0].*=250;snake.nodes[0].y=250;snake.nodes[1].*=250;snake.nodes[1].y=260;snake.length=2; snake.live=1; snake.direction=UP; score=0;food.e*ist=0;initgraph(&gdriver,&gmode,"C:\\tc20\\BGI");randomize();/*suijishufashengqi*/ drawWall();}voidclose(){ FILE*fp; closegraph(); if((fp=fopen("data.t*t","w"))==NULL)/*關(guān)閉時(shí)保存最高分*/ { e*it(0); } else { fprintf(fp,"%d,%d,%d",ma*1,ma*2,ma*3); fclose(fp); } printf("pessanykeytocontinue");}voidgamePlay(){ intkeyCode,d; getch(); while(TRUE){ drawScore(); drawWall(); if(touchWall()||touchSelf()){ gameOver(); return; } if(!food.e*ist)createFood(); food.e*ist=1; drawFood(); drawSnake(); for(d=0;d<sp;d++) delay(GAME_SPEED); if(bioskey(1)!=0){ keyCode=bioskey(0); switch(keyCode){ caseESC: gameOver(); return; default:last*=snake.nodes[snake.length-1].*;lasty=snake.nodes[snake.length-1].y; if(!oppositeDirection(keyCode)){ snake.direction=keyCode; } } } moveSnake(); if(foodEat()){ food.e*ist=FALSE; score+=10; e*pandSnake(); } }}voiddrawWall(){rectangle(left,top,right+10,bottom+10);}voidcreateFood(){ inti;label:food.position.*=left+10*((int)rand()%11);food.position.y=top+10*((int)rand()%11); for(i=0;i<=snake.length-1;i++){ if(snake.nodes[i].*==food.position.*&&snake.nodes[i].y==food.position.y) gotolabel; }}voiddrawFood(){setfillstyle(1,2);bar(food.position.*,food.position.y,food.position.*+10,food.position.y+10);}voiddrawSnake(){intj;setfillstyle(1,4);for(j=0;j<=snake.length-1;j++){bar(snake.nodes[j].*,snake.nodes[j].y,snake.nodes[j].*+10,snake.nodes[j].y+10);}}voiddrawScore(void){setfillstyle(1,16);bar(45,45,150,80);setcolor(WHITE);sprintf(te*t,"writer:neolone");outte*t*y(170,50,te*t);sprintf(te*t,"score:%5d",score);outte*t*y(50,50,te*t);}inttouchWall(){int*1=snake.nodes[0].*;inty1=snake.nodes[0].y;if(*1<left||*1>right||y1<top||y1>bottom)returnTRUE;elsereturnFALSE;}inttouchSelf(){inti;for(i=3;i<snake.length-1;i++){if(snake.nodes[0].*==snake.nodes[i].*&&snake.nodes[0].y==snake.nodes[i].y)returnTRUE;}returnFALSE;}voidgameOver(){ FILE*fp;int*2,y2; *2=180; y2=250; setcolor(WHITE); sprintf(te*t,"Gameover!!yourscoreis%d,%d",score,sel); outte*t*y(*2,y2,te*t); delay(1000); getch(); switch(sel%4) { case1: if(score>ma*1) { ma*1=score; } break; case2: if(score>ma*2) { ma*2=score; } break; case3: if(score>ma*3) { ma*3=score; } break; default: { break; } }}voidmoveSnake(){intk;setfillstyle(1,16);last*=snake.nodes[snake.length-1].*;lasty=snake.nodes[snake.length-1].y;bar(snake.nodes[snake.length-1].*,snake.nodes[snake.length-1].y,snake.nodes[snake.length-1].*+10,snake.nodes[snake.length-1].y+10);for(k=snake.length-2;k>=0;k--){ snake.nodes[k+1].*=snake.nodes[k].*; snake.nodes[k+1].y=snake.nodes[k].y;} if(snake.direction==UP)snake.nodes[0].y-=10;elseif(snake.direction==DOWN)snake.nodes[0].y+=10;elseif(snake.direction==LEFT)snake.nodes[0].*-=10;elseif(snake.direction==RIGHT)snake.nodes[0].*+=10;else ;}intoppositeDirection(intkeyCode){if(keyCode==UP&&snake.direction==DOWN){return1;}elseif(keyCode==DOWN&&snake.direction==UP){return1;}elseif(keyCode==LEFT&&snake.direction==RIGHT){return1;}elseif(keyCode==RIGHT&&snake.direction==LEFT){return1;}elsereturn0;}intfoodEat(){if(snake.nodes[0].*==food.position.*&&snake.nodes[0].y==food.position.y)return1;elsereturn0;}voide*pandSnake(){if(keyCode==UP){last*-=10;}elseif(keyCode==DOWN){last*+=10;}elseif(keyCode==LEFT){lasty-=10;}elseif(keyCode==RIGHT){lasty+=10;}else;snake.nodes[snake.length].*=last*;snake.nodes[snake.length].y=lasty;snake.length++;}voidselect(){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(te*t,"speed1");outte*t*y(430,230,te*t);bar(430,250,480,260);sprintf(te*t,"speed2");outte*t*y(430,250,te*t);bar(430,270,480,280);sprintf(te*t,"speed3");outte*t*y(430,270,te*t);bar(430,290,480,300);sprintf(te*t,"quit");outte*t*y(430,290,te*t);sel=1;t=1;while(t){delay(10);if(bioskey(1)!=0){ keyCode=bioskey(0); switch(keyCode){ caseUP: sel--;break; caseDOWN: sel++;break; caseENTER: t=0;break;default:break; }switch(sel%4){ case0:setfillstyle(1,9);bar(430,290,480,300);setcolor(WHITE); setfillstyle(1,5); bar(430,230,480,240);sprintf(te*t,"speed1");outte*t*y(430,230,te*t);bar(430,250,480,260);sprintf(te*t,"speed2");outte*t*y(430,250,te*t);bar(430,270,480,280);sprintf(te*t,"speed3");outte*t*y(430,270,te*t);sprintf(te*t,"quit");outte*t*y(430,290,te*t); break; case1:setfillstyle(1,9);bar(430,230,480,240); setfillstyle(1,5); setcolor(WHITE); sprintf(te*t,"speed1"); outte*t*y(430,230,te*t); bar(430,250,480,260); sprintf(te*t,"speed2"); outte*t*y(430,250,te*t); bar(430,270,480,280); sprintf(te*t,"speed3"); outte*t*y(430,270,te*t); bar(430,290,480,300); sprintf(te*t,"quit"); outte*t*y(430,290,te*t); break; case2:setfillstyle(1,9); bar(430,250,480,260); setfillstyle(1,5); bar(430,230,480,240); setcolor(WHITE); sprintf(te*t,"speed1"); outte*t*y(430,230,te*t); sprintf(te*t,"speed2"); outte*t*y(430,250,te*t); bar(430,270,480,280); sprintf(t

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論