VC++實現(xiàn)貪吃蛇的實驗報告_第1頁
VC++實現(xiàn)貪吃蛇的實驗報告_第2頁
VC++實現(xiàn)貪吃蛇的實驗報告_第3頁
VC++實現(xiàn)貪吃蛇的實驗報告_第4頁
VC++實現(xiàn)貪吃蛇的實驗報告_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

4、從而顯示出蛇的運動和對食物的獲取。在OnPaint()函數(shù)中完成得分和游戲操作提示的顯示。本次游戲設(shè)計的主要功能函數(shù)如下:OnGameStart()(游戲開始函數(shù)), OnGamePauseStart()(游戲暫停函數(shù))OnGameExit()(游戲退出函數(shù)),OnPaint()(游戲界面的顯示函數(shù)),AddSnake(Snake *snake)(增加蛇身長度函數(shù)),DrawFood(CDC *pDC, SnakeFood f)(畫食物函數(shù)),DrawSnake(CDC *pDC,Snake snake)(畫蛇函數(shù)),MoveSnake(Snake *snake)(蛇的移動函數(shù)),InitSn

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

6、nakeNode data100; /用數(shù)組來表示蛇身體的每一節(jié)int curr; /移動指向蛇的每一節(jié)并統(tǒ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 *sna

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

8、g:DoDataExchange(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_ST

9、ART, OnGameStart)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() /游戲開始函數(shù)/ TODO: Add your command handler code hereSetTimer(1,speed,NULL); /SetTimer一種API函數(shù),定時器In

10、itSnake(&snake);nGameState=1; /游戲開始時為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:OnGameEx

11、it() /游戲退出函數(shù)/ 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!

12、=3&d!=3)direct=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() /游

13、戲界面的顯示函數(shù)if (IsIconic()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ū)的大小i

14、nt x = (rect.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,左

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

16、at.x; /tx,ty記錄蛇身第一節(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+1

17、1,f.x*10+18,f.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)p

18、DC-Rectangle(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;

19、 /初始化時狀態(tài)變?yōu)?score=0; speed=200;/刷新運動的時間間隔(數(shù)值越大,移動速度越慢,數(shù)值越小,移動速度越快)d=0; /控制蛇身不能后退snake-curr=2; /初始蛇深長度(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; /隨機產(chǎn)生食物food.y=rand()%30;switch(direct)case 0: x+=1;break; /右case 1: y+=1;break; /上case 2: x-=1;break; /左

20、case 3: y-=1;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; /此時t=1while(t) /當(dāng)蛇身長度不為0時 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) /移動蛇函數(shù)int t, xx, yy;int tx, ty

21、;switch(direct)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; /隨機生成數(shù)函數(shù)隨機產(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 sn

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論