VC++實(shí)現(xiàn)貪吃蛇的實(shí)驗(yàn)報(bào)告_第1頁(yè)
VC++實(shí)現(xiàn)貪吃蛇的實(shí)驗(yàn)報(bào)告_第2頁(yè)
VC++實(shí)現(xiàn)貪吃蛇的實(shí)驗(yàn)報(bào)告_第3頁(yè)
VC++實(shí)現(xiàn)貪吃蛇的實(shí)驗(yàn)報(bào)告_第4頁(yè)
VC++實(shí)現(xiàn)貪吃蛇的實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩20頁(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)介

1、 題目:利用VC+實(shí)現(xiàn)貪吃蛇小游戲1、 題目:利用VC+實(shí)現(xiàn)貪吃蛇小游戲 利用VC+實(shí)現(xiàn)的貪吃蛇小游戲更加注重可視化。一條蛇在封閉的圍墻內(nèi),在圍墻內(nèi)會(huì)隨機(jī)出現(xiàn)一個(gè)食物,通過(guò)鍵盤上的W S A D四個(gè)鍵控制它向上,下,左,右四個(gè)方向移動(dòng)。當(dāng)蛇頭撞到食物時(shí)表示將食物吃掉,這時(shí)蛇身增長(zhǎng)一節(jié),得分加一。接著隨機(jī)生成食物,等待被蛇吃掉。如果在移動(dòng)過(guò)程中撞到墻壁或者自己的身體,則游戲結(jié)束。游戲過(guò)程中,可以在菜單中選擇暫?;蛘呓Y(jié)束游戲,對(duì)游戲進(jìn)行暫?;蛘咄顺?。2、 編程要點(diǎn)(或基本思路、算法分析與說(shuō)明):本次游戲設(shè)計(jì)包含兩大模塊,一個(gè)模塊是貪吃蛇游戲本身算法的設(shè)計(jì),完成了貪吃蛇的食物產(chǎn)生,獲取食物,蛇的移動(dòng)

2、等功能。另一個(gè)模塊是利用MFC完成貪吃蛇的可視化顯示,產(chǎn)生了一個(gè)對(duì)話框,在對(duì)話框可以控制游戲及游戲的顯示。 1.貪吃蛇游戲算法設(shè)計(jì)包括:果實(shí)出現(xiàn)的設(shè)計(jì)思路: (1)采用隨機(jī)數(shù)生成果實(shí)出現(xiàn)坐標(biāo) (2)判斷當(dāng)前生成的果實(shí)是否在貪吃蛇身體范圍內(nèi)。 (3)如果在,重新生成直到不在為止。如果不在,則把坐標(biāo)位置返回給調(diào)用對(duì)象。貪吃蛇更新的算法設(shè)計(jì) (1)接收玩家按下的方向鍵消息,并保存到方向變量中。 (2)定義一個(gè)時(shí)間定時(shí)器,用來(lái)控制蛇運(yùn)動(dòng)的速度。 (3)當(dāng)每次時(shí)間間隔到達(dá)時(shí),則根據(jù)方向變量來(lái)更新貪吃蛇curr(即貪吃蛇身體)向量。 (4)判斷curr向量的第一個(gè)元素中的坐標(biāo)數(shù)據(jù)是否碰到邊界或者蛇身,如果

3、有,則游戲結(jié)束。否則,進(jìn)行下一步。 (5)判斷curr向量的第一個(gè)元素中的坐標(biāo)數(shù)據(jù)是否與當(dāng)前果實(shí)重合,如果有,表示貪吃蛇已經(jīng)吃到果實(shí)。這時(shí)就向貪吃蛇curr向量添加一個(gè)元素,并重新生成一個(gè)果實(shí)。 (6)吃到食物后,得分會(huì)同步增加。2. 利用MFC完成貪吃蛇的可視化顯示: 首先初始對(duì)話框,完成游戲的整體框架的顯示。然后游戲玩家在菜單欄里選擇開(kāi)始,暫停,結(jié)束等,控制游戲狀態(tài)。游戲開(kāi)始后,玩家通過(guò)鍵盤上的消息控制蛇的運(yùn)動(dòng)。在函數(shù)DrawSnake(CDC *pDC,Snake snake),和DrawFood(CDC *pDC,SnakeFood f)完成對(duì)蛇和食物的重繪,從而顯示出蛇的運(yùn)動(dòng)和對(duì)食物

4、的獲取。在OnPaint()函數(shù)中完成得分和游戲操作提示的顯示。本次游戲設(shè)計(jì)的主要功能函數(shù)如下:OnGameStart()(游戲開(kāi)始函數(shù)), OnGamePauseStart()(游戲暫停函數(shù))OnGameExit()(游戲退出函數(shù)),OnPaint()(游戲界面的顯示函數(shù)),AddSnake(Snake *snake)(增加蛇身長(zhǎng)度函數(shù)),DrawFood(CDC *pDC, SnakeFood f)(畫(huà)食物函數(shù)),DrawSnake(CDC *pDC,Snake snake)(畫(huà)蛇函數(shù)),MoveSnake(Snake *snake)(蛇的移動(dòng)函數(shù)),InitSnake(Snake *sn

5、ake)(初始化蛇函數(shù)),UnDrawSnake(Snake snake)(更新蛇函數(shù)),GameOver()(游戲結(jié)束函數(shù))三、實(shí)現(xiàn)過(guò)程:(1) 流程圖載入游戲并初始化 否判斷游戲是否開(kāi)始 是移動(dòng)蛇(初始化向右運(yùn)動(dòng)) 定時(shí)器啟動(dòng)根據(jù)鍵盤控制蛇移動(dòng)方向判斷蛇是否吃到食物否 是否游戲結(jié)束判斷蛇頭坐標(biāo)和自身或者墻是否重合隨機(jī)生成下一個(gè)食物,并記錄得分 是 (2) 主要功能程序代碼:typedef struct SnakeNode /定義蛇結(jié)點(diǎn) int x; /蛇每個(gè)節(jié)點(diǎn)的橫縱坐標(biāo) int y;SnakeNode; typedef struct Snake /定義蛇的身體SnakeNode data

6、100; /用數(shù)組來(lái)表示蛇身體的每一節(jié)int curr; /移動(dòng)指向蛇的每一節(jié)并統(tǒng)計(jì)蛇的長(zhǎng)度Snake;typedef struct food /定義食物結(jié)構(gòu)體int x; /食物的橫坐標(biāo)int y; /食物的縱坐標(biāo)SnakeFood;Snake snake;SnakeFood food;int x, y; /定義橫縱坐標(biāo)int direct; /定義方向變量int nGameState; /定義游戲的狀態(tài)int score; /定義分?jǐn)?shù)變量int speed; /定義速度變量int d; /該變量用于控制蛇身不能后退void InitSnake(Snake *snake); /初始化蛇voi

7、d MoveSnake(Snake *snake); /蛇的移動(dòng)void AddSnake(Snake *snake); /增加蛇的身體長(zhǎng)度void DrawSnake(CDC *pDC , Snake snake); /繪制蛇void UnDrawSnake(Snake snake); /繪制蛇的顯示框void DrawFood(CDC *pDC, SnakeFood f); /繪制食物 int GameOver(); /游戲結(jié)束/完成與對(duì)話框的數(shù)據(jù)交互 void CSnakeDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExcha

8、nge(pDX);/AFX_DATA_MAP(CSnakeDlg)/ NOTE: the ClassWizard will add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CSnakeDlg, CDialog)/AFX_MSG_MAP(CSnakeDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND(IDM_HELP_ABOUT, OnHelpAbout)ON_WM_TIMER()ON_COMMAND(IDM_GAME_START, OnGameSt

9、art)ON_WM_KEYDOWN()ON_COMMAND(IDM_GAME_PAUSE_START, OnGamePauseStart)ON_COMMAND(IDM_GAME_EXIT, OnGameExit)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CSnakeDlg message handlersvoid CSnakeDlg:OnGameStart() /游戲開(kāi)始函數(shù)/ TODO: Add your command handler code hereSetTimer(1,speed,NULL); /SetTimer一種API函數(shù),定時(shí)器InitSnake(&snak

10、e);nGameState=1; /游戲開(kāi)始時(shí)為1void CSnakeDlg:OnGamePauseStart() /游戲暫停函數(shù)/ TODO: Add your command handler code hereCDC *pDC =GetDC();if(nGameState=0)if(!GameOver()SetTimer(1,speed,NULL);nGameState=1;elseif(!GameOver()KillTimer(1);nGameState=0; pDC-TextOut(70,130,Pause!);void CSnakeDlg:OnGameExit() /游戲退出函數(shù)/

11、 TODO: Add your command handler code hereAfxGetMainWnd()-SendMessage(WM_CLOSE);/處理鍵盤按鍵消息void CSnakeDlg:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultswitch(nChar) case D:if(direct!=2&d!=2) direct=0;break;case S: if(direct!=3&d!=3)direc

12、t=1;break;case A:if(direct!=0&d!=0)direct=2;break;case W:if(direct!=1&d!=1)direct=3;break;if(nChar=VK_SPACE)if(nGameState=0)if(!GameOver()SetTimer(1,speed,NULL);nGameState=1;elseif(!GameOver()KillTimer(1);nGameState=0;CDialog:OnKeyDown(nChar, nRepCnt, nFlags);void CSnakeDlg:OnPaint() /游戲界面的顯示函數(shù)if (I

13、sIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON); /獲取系統(tǒng)分辨率 int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect); /獲取窗口客戶區(qū)的大小int x = (rect.

14、Width() - cxIcon + 1)/2 ;int y = (rect.Height() - cyIcon + 1)/2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();CDC *pDC = GetDC();pDC-SetBkColor(RGB(50,230,100); /設(shè)置游戲提示字體背景顏色pDC-TextOut(220,30,得分:0);pDC-TextOut(260,80,上:W);pDC-TextOut(300,110,下:S);pDC-TextOut(340,140,左:A);pDC-TextO

15、ut(380,170,右:D);pDC-TextOut(420,210,空格暫停);/pDC-Rectangle(10,10,210,320);UnDrawSnake(pDC,snake);DrawSnake(pDC,snake);void AddSnake(Snake *snake) /增加蛇身長(zhǎng)度函數(shù)(在MoveSnake()函數(shù)中調(diào)用)int t=1,tx,ty,xx,yy;if(snake-currcurr+; /控制長(zhǎng)度蛇身長(zhǎng)度小于100xx=snake-data0.x; /xx,yy記錄蛇頭坐標(biāo)yy=snake-data0.y;dotx=snake-datat.x; /tx,ty記

16、錄蛇身第一節(jié)坐標(biāo)ty=snake-datat.y;snake-datat.x=xx; /蛇頭坐標(biāo)賦給蛇身第一節(jié)snake-datat.y=yy;xx=tx; /將蛇身第一節(jié)坐標(biāo)賦給新的蛇頭yy=ty;t+; /蛇增加一節(jié)while(tcurr);void DrawFood(CDC *pDC, SnakeFood f) /繪制食物函數(shù)CString ss;pDC-SetBkColor(RGB(50,230,100);ss.Format(得分:%d,score);pDC-TextOut(220,30,ss);pDC-Rectangle(f.x*10+11,f.y*10+11,f.x*10+18,f

17、.y*10+18);void DrawSnake(CDC *pDC,Snake snake) /繪制蛇函數(shù)int t;t=snake.curr-1;pDC-SelectStockObject(BLACK_BRUSH);pDC-SelectStockObject(BLACK_PEN);pDC-Rectangle(snake.datat.x*10+11,snake.datat.y*10+11,snake.datat.x*10+18,snake.datat.y*10+18);t-;pDC-SelectStockObject(HOLLOW_BRUSH);while(t=0)pDC-Rectangle(

18、snake.datat.x*10+11,snake.datat.y*10+11,snake.datat.x*10+18,snake.datat.y*10+18);t-;int GameOver() /游戲結(jié)束函數(shù)int t;if(x19|y30)return 1;t = snake.curr-2;while(t)if(snake.datat.x=x&snake.datat.y=y)return 1;t-;return 0; void InitSnake(Snake *snake) /初始化蛇函數(shù)int t;direct=0; /初始方向置為0nGameState=0; /初始化時(shí)狀態(tài)變?yōu)?sc

19、ore=0; speed=200;/刷新運(yùn)動(dòng)的時(shí)間間隔(數(shù)值越大,移動(dòng)速度越慢,數(shù)值越小,移動(dòng)速度越快)d=0; /控制蛇身不能后退snake-curr=2; /初始蛇深長(zhǎng)度(2節(jié)) x=4; /蛇的橫坐標(biāo)(初始值)y=4; /蛇的縱坐標(biāo)snake-data0.x=x; /蛇頭橫坐標(biāo)snake-data0.y=y; /蛇頭縱坐標(biāo)food.x=rand()%20; /隨機(jī)產(chǎn)生食物food.y=rand()%30;switch(direct)case 0: x+=1;break; /右case 1: y+=1;break; /上case 2: x-=1;break; /左case 3: y-=1;

20、break; /下snake-data1.x=x; /蛇身第一節(jié)坐標(biāo)(上一步中x坐標(biāo)加1了)snake-data1.y=y; /蛇身第一節(jié)坐標(biāo)(上一步中y坐標(biāo)不變)t=snake-curr-1; /此時(shí)t=1while(t) /當(dāng)蛇身長(zhǎng)度不為0時(shí) if(snake-datat.x=food.x&snake-datat.y=food.y) food.x=rand()%20;food.y=rand()%31;t-; /從最后一節(jié)依次往前判斷蛇身食物的關(guān)系 void MoveSnake(Snake *snake) /移動(dòng)蛇函數(shù)int t, xx, yy;int tx, ty;switch(direc

21、t)case 0: x+=1;break; /右case 1: y+=1;break;case 2: x-=1;break;case 3: y-=1;break;if(GameOver()return;xx=x;yy=y;if(xx=food.x&yy=food.y)t=snake-curr-1;food.y=rand()%31; /隨機(jī)生成數(shù)函數(shù)隨機(jī)產(chǎn)生函數(shù)food.x=rand()%20;while(t)if(snake-datat.x=food.x&snake-datat.y=food.y)food.y=rand()%31;food.x=rand()%20;t=snake-curr-1;t-;score+=1;if(score%10)=0)speed-=20;AddSnake(snake);t=snake-curr-1;dotx=snake-datat.x;ty=snake-datat.y;snake-datat.x=xx;snake-datat.y=yy;xx=tx;yy=ty;t-;while(t=0);void UnDrawSnake(CDC *pDC, Snake snake) /繪

溫馨提示

  • 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)論