版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、課程名稱 可視化編程(VC) 學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 專業(yè)軟件工程專業(yè) 班 級 姓 名 指導(dǎo)教師 2012 2013學(xué)年 第2學(xué)期 目錄 1、 課程設(shè)計(jì)要求2 2、 系統(tǒng)功能實(shí)現(xiàn)與操作 2 3、系統(tǒng)設(shè)計(jì)概述 2 3.1添加結(jié)構(gòu)體說明2 3.2模塊說明3 3.3主要功能函數(shù)代碼及注釋 3 4、調(diào)試過程11 4.1添加功能說明11 4.2錯(cuò)誤及解決方案11 5、程序運(yùn)行結(jié)果12 附:主要類 Cview的成員函數(shù)代碼 15 1、課程設(shè)計(jì)要求 題目: 基于MFC的貪吃蛇游戲設(shè)計(jì)與實(shí)現(xiàn)。 要求: 1. 游戲界面設(shè)計(jì) 2. 食物的初始化 3. 游戲開始以及具體實(shí)現(xiàn) 2、系統(tǒng)功能實(shí)現(xiàn)與操作 本系統(tǒng)運(yùn)用AP
2、I函數(shù)的相關(guān)功能進(jìn)行界面設(shè)計(jì)和功能實(shí)現(xiàn)。通過Rectangle ()函數(shù)繪制操作區(qū)域及障礙物。通過連續(xù)的小矩形實(shí)現(xiàn)蛇身的繪制。通過 srand0函數(shù)和 rand()函數(shù)生成隨機(jī)數(shù),完成生成食物功能的實(shí)現(xiàn)。綜合運(yùn)用多種if條件判斷和 for循環(huán)的嵌套使用的算法完成各種條件判斷。 該系統(tǒng)功能簡單,操作簡易。打開程序后,點(diǎn)擊菜單欄的游戲按鈕,點(diǎn)擊 開始游戲,系統(tǒng)彈出對話框,提示還有3秒開始。游戲開始后,貪吃蛇開始移動, 通過操作鍵盤上的上下左右方向鍵控制蛇的移動,躲避障礙物并吃掉食物。當(dāng)吃 掉的食物累計(jì)到達(dá)一定數(shù)量后,蛇行速度加快。直至撞到邊界或障礙物或撞到自 身,游戲結(jié)束。此時(shí)彈出對話框,提示所得
3、分?jǐn)?shù)。游戲中途可通過暫停和繼續(xù)按 鈕執(zhí)行相應(yīng)操作。 3、系統(tǒng)設(shè)計(jì)概述 3.1添加結(jié)構(gòu)體說明 struct Sn ake int x,y; int len; int direct; S nake50; struct Food int x; int y; int food; Food; Snake結(jié)構(gòu)體數(shù)組用于存放貪吃蛇的相關(guān)數(shù)據(jù),其中 x,y存放當(dāng)前節(jié)點(diǎn)矩 形左上角的坐標(biāo),(Snake0為蛇頭),len存放當(dāng)前蛇身的長度,direct存放蛇的 行進(jìn)方向,可在14取值。 Food結(jié)構(gòu)體用于存放食物的位置信息。其中 x, y存放食物小矩形左上角左 標(biāo),food存放食物存在的布爾判斷值。 3.2模塊說
4、明 系統(tǒng)代碼部分主要分為三個(gè)模塊,界面控制模塊、初始化模塊和功能模塊。 界面控制模塊包括函數(shù):OnStart(),OnPause() OnContinue(),OnExit() 初始化模塊包括函數(shù):OnlnitialUpdate(),OnDraw(), oninit() 功能模塊包括函數(shù):OnKeyDown(),OnTimer() 3.3主要功能函數(shù)代碼及注釋 OnStart() void CSn akeView: On Start() / TODO: Add your comma nd han dler code here SetTimer(1,3000,NULL); AfxMessageB
5、ox(還有 3 秒開始 !); 點(diǎn)擊開始游戲觸發(fā),設(shè)置定時(shí)器控制三秒后開始游戲。 OnPause() void CSn akeView:O nPause() / TODO: Add your comma nd han dler code here KillTimer(1); AfxMessageBox(不要讓人家等太久); 關(guān)閉定時(shí)器,暫停游戲 OnContinue() void CSn akeView: OnContin ue() / TODO: Add your comma nd han dler code here SetTimer(1,10,NULL); 重啟定時(shí)器,恢復(fù)游戲 OnEx
6、it() void CSn akeView:O nExit() / TODO: Add your comma nd han dler code here AfxMessageBox(歡迎下次再來!); exit(0); 彈出對話框提示退出。 OnlnitialUpdate() void CSn akeView: Onln itialUpdate() CView:O nln itialUpdate(); / TODO: Add your specialized code here an d/or call the base class Sn ake0.x=10; Sn ake0.y=10; Sn
7、 ake1.x=10; Sn ake1.y=10; Sn ake2.x=10; Sn ake2.y=10; Sn ake0.direct=2; Sn ake0.le n=3; Food.food=1;初始化蛇的長度和位置 用這個(gè)函數(shù)進(jìn)行蛇的初始化工作。初始化貪吃蛇起初有3個(gè)節(jié)點(diǎn),長度為3, 起始坐標(biāo)存入數(shù)組,食物為1無0有。 OnDraw() void CSn akeView: On Draw(CDC* pDC) CSn akeDoc* pDoc = GetDocume nt(); ASSERT_VALID(pDoc); / TODO: add draw code for n ative da
8、ta here CBrush backBrush(RGB(111,111,111); CBrush* pOldBrush = pDC-SelectObject( CRect rect; pDC-GetClipBox( pDC-PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),PATCOPY); pDC-SelectObject(pOldBrush); pDC-Recta ngle(9,9,401,401); CBrush zaBrush(RGB(111,111,111); pDC-SelectObject(zaBrush); for
9、(i nt m=0;mRecta ngle(150,(100+m*10),160,(110+m*10); for(i nt n=0 ;* 10; n+) pDC-Recta ngle(250+n*10),200,(260+n*10),210); onini t(); 窗口創(chuàng)建時(shí)架構(gòu)調(diào)用的函數(shù),通過此函數(shù)完成界面初始化。創(chuàng)建灰色畫刷選 入設(shè)備環(huán)境,通過繪圖函數(shù)繪制用戶區(qū)。用兩個(gè) for循環(huán)逐次繪制矩形的算法繪 制出場景中的障礙物。 oninit() void CSn akeView:o nin it() CDC *pDC=GetDC(); CBrush DrawBrush=(RGB(255,0,
10、0); CBrush *Drawbrush=pDC-SelectObject( for(i nt i=0;iRecta ngle(S nakei.x*10,S nakei.y*10,(S nakei.x+1)*10,(S nakei.y+1) *10); pDC-SelectObject(DrawBrush); /利用 for循環(huán)繪制起始的蛇身 該函數(shù)為自己添加的成員函數(shù),用于繪制開始時(shí)的蛇身(長度為3)。 OnKeyDown() void CSn akeView: On KeyDow n( UINT nChar, UINT nRepC nt, UINT n Flags) / TODO: Ad
11、d your message han dler code here an d/or call default switch( nChar) case VK_UP:if(S nake0.direct!=2) Sn ake0.direct=1;break; case VK_DOWN:if(S nake0.direct!=1) Sn ake0.direct=2;break; case VK_LEFT:if(S nake0.direct!=4) Sn ake0.direct=3;break; case VK_RIGHT:if(S nake0.direct!=3) Sn ake0.direct=4;br
12、eak; _ 通過鍵盤設(shè)置轉(zhuǎn)頭方向 CView:O nKeyDow n(n Char, nRepC nt,n Flags); CView:O nKeyDow n(n Char, nRepC nt,n Flags); 該函數(shù)為鍵盤消息的接收函數(shù)。從鍵盤得到的上下左右的不同按鍵,會根據(jù) switch判斷語句的case改變Snaka direct的值,從而改變蛇的行進(jìn)方向。 OnTimer() void CSn akeView: On Timer(UINT nIDEve nt) / TODO: Add your message han dler code here an d/or call defa
13、ult CDC *pDC=GetDC(); CStri ng soure; int j=0; if(Sn ake0.le n=3)SetTimer(1,170,NULL); if(Sn ake0.le n=9)SetTimer(1,130,NULL); if(Sn ake0.le n=14)SetTimer(1,95,NULL); if(Sn ake0.le n=18)SetTimer(1,60,NULL); 根據(jù)蛇的長度進(jìn)行速度的設(shè)定 soure.Format(得分:%d!,(S nake0.le n-3)*10); / 設(shè)置每個(gè)食物 100 分 撞墻判斷 if(S nake0.direct
14、=3)用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1); AfxMessageBox(soure); 分四種情況撞障礙判斷,k為循環(huán)控制標(biāo)識 if(Sn ake0.direct=3) for(i nt k=0;k20;k+) if(Sn ake0.x*10=160用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(l); AfxMessageBox(soure); if(Sn ake0.x*10=350用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1); AfxMessageBox(soure); / if(Sn ake0.direct=2) for(i nt k=0;k10;k+) if(Sn
15、ake0.x*10=(250+k*10)用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1); AfxMessageBox(soure); if(Sn ake0.x*10=150用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1); AfxMessageBox(soure); / if(Sn ake0.direct=1) for(i nt k=0;k10;k+) if(Sn ake0.x*10=(250+k*10)用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1); AfxMessageBox(soure); if(Sn ake0.x*10=150用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1)
16、; AfxMessageBox(soure); / if(Sn ake0.direct=4) for(i nt k=0;k3) for(i nt sn=Sn ake0.le n-1;s n 0;s n-) if(Sn ake0.x*10=S nakes n.x*10 KillTimer(1); AfxMessageBox(soure); /對尾節(jié)點(diǎn)用白筆涂掉 if(j!=1) pDC-SelectStockObject(WHITE_PEN); pDC-Recta ngle(S nakeS nakeO.le n-1.x*10,S nakeS nakeO.le n-1.y*10,(S nak eS
17、 nake0.le n-1.x+1)*10,(S nakeS nake0.le n-1.y+1)*10); for(i nt i=S nake0.le n-1;i0;i-) Sn akei.x=S nakei-1.x; Sn akei.y=S nakei-1.y; 行走方向判斷 if(Sn ake0.direct=1)S nake0.y-; if(Sn ake0.direct=2)S nake0.y+; if(Sn ake0.direct=3)S nake0.x-; if(Sn ake0.direct=4)S nake0.x+; pDC-SelectStockObject(BLACK_PEN)
18、; CBrush DrawBrush=(RGB(255,0,0); CBrush *Drawbrush=pDC-SelectObject( if(j!=1) pDC-Recta ngle(S nake0.x*10,S nake0.y*10,(S nake0.x+1)*10,(S nake0.y+1)*1 0); pDC-SelectObject(DrawBrush); 判斷吃食物的條件 if(Sn ake0.x*10=Food.x*10 Food.food=1; Sn akeS nake0.le n-1.x=S nakeS nake0.le n-2.x; Sn akeS nake0.le n-
19、1.y=S nakeS nake0.le n-2.y; 生成食物 in t o=1;控制生成食物成功時(shí)跳出循環(huán) if(Food.food=1) sran d( un sig ned)time(NULL); do Food.x=ra nd()%40; Food.y=ra nd()%40; if(Food.x!=0p20;p+) if(Food.x*10!=15 0 if(o!=1) for(i nt q=0;qRecta ngle(Food.x*10,Food.y*10,(Food.x+1)*10,(Food.y+1)*10); Food.food=0; CView:O nTimer( nIDE
20、ve nt); 主要功能函數(shù),響應(yīng)于定時(shí)器消息,用于實(shí)時(shí)改變游戲界面,是游戲功能實(shí) 現(xiàn)的主要函數(shù)。下面依次解釋其中功能模塊: 1、用四個(gè)if判斷語句對蛇身長度進(jìn)行判斷,然后設(shè)置定時(shí)器間隔控制蛇行速度。 2、對撞墻進(jìn)行判斷,當(dāng)蛇頭的坐標(biāo)企圖越過系統(tǒng)邊界并且其行進(jìn)方向是沖著墻 的方向時(shí),判定撞墻,關(guān)閉定時(shí)器并且置程序結(jié)束標(biāo)志j=1 o 3、撞障礙物判斷,同撞墻判斷,對蛇的行進(jìn)方向分上下左右四種情況進(jìn)行判斷, 然后判斷蛇頭坐標(biāo)是否企圖越過障礙物。若撞屆則同樣置程序結(jié)束標(biāo)志j=1 o 4、撞蛇身判斷,此算法是if嵌套for循環(huán)嵌套if判斷,對蛇頭的坐標(biāo)和舍身每 一點(diǎn)的坐標(biāo)進(jìn)行一次比較,看是否有蛇頭的坐
21、標(biāo)與蛇身坐標(biāo)重合。 若有則判定自 撞,置程序結(jié)束標(biāo)志j=1 o 5、蛇行進(jìn)的實(shí)現(xiàn)。蛇行進(jìn)主要的算法是,每一次 Timer消息,將蛇的蛇頭的下 一位置添加一個(gè)矩形,并且將蛇尾的小矩形用與背景相同顏色的矩形填充掉,完 成刪除。通過一個(gè)for循環(huán)來實(shí)現(xiàn)。 6行走方向判斷,通過對 Snake.direct進(jìn)行判斷,控制蛇頭坐標(biāo)在 x,y方向上 自加或自減,完成方向的設(shè)定。 7、判斷吃食物的條件,若蛇頭坐標(biāo)與食物坐標(biāo)重合,則吃食物。置食物標(biāo)識為 1表示沒有食物。 8、生成食物方法。通過rand()函數(shù)產(chǎn)生隨機(jī)數(shù),通過計(jì)算得到相應(yīng)食物的坐標(biāo)。 對該坐標(biāo)的可行性進(jìn)行判斷,若坐標(biāo)在操作區(qū)外或在障礙物中,則舍棄
22、,循環(huán)執(zhí) 行這一步知道得到可行坐標(biāo),繪制食物矩形 4、調(diào)試過程 4.1添加功能說明 在此軟件完成后,僅能實(shí)現(xiàn)定速度的無障礙的貪吃蛇游戲。經(jīng)過改進(jìn),添加 了初始化的相應(yīng)代碼,修改了 Timer()函數(shù)的相關(guān)功能代碼,實(shí)現(xiàn)了速度根據(jù)食 物個(gè)數(shù)可變,添加了障礙物。 4.2錯(cuò)誤及解決方案 在編寫程序的過程中遇到了諸多錯(cuò)誤, 除書寫錯(cuò)誤外,其他錯(cuò)誤通過探討和 查閱資料的方式得到解決。具體問題有以下幾個(gè): 之前對MFC圖形的相關(guān)類了解的比較少,仔細(xì)看書后學(xué)習(xí)了CDC類的相關(guān) 知識,了解了在NFC編程中圖形函數(shù)的使用方法。 在遍寫程序之前,不清楚在單文檔 MFC程序中,架構(gòu)對各個(gè)類的功能函數(shù)的 調(diào)用次序,所
23、以不知道應(yīng)該將初始化的相關(guān)內(nèi)容寫在哪一個(gè)函數(shù)中,經(jīng)查閱資料 得知,OnlnitialUpdate是視圖窗口完全建立后第一個(gè)被框架調(diào)用的函數(shù)??蚣茉?第一次調(diào)用 On Draw前會調(diào)用Onln itialUpdate,因此Onln itialUpdate是設(shè)置滾動 視圖的邏輯尺寸和映射模式的最合適的地方。在時(shí)間上,兩者先后順序不同,構(gòu) 造函數(shù)生成本類的對象,但沒有產(chǎn)生窗口,On Create后窗口產(chǎn)生,然后才是視圖 的OnlnitialUpDate,般在這里對視圖的顯示做初始化。 在運(yùn)行程序后,出現(xiàn) BUG,當(dāng)蛇行至靠近障礙物或墻壁那一列時(shí)就判定了撞 墻,導(dǎo)致蛇沒有辦法沿著游戲區(qū)域的邊界行走,吃
24、不到邊上的食物。仔細(xì)研究代 碼后,在撞界判斷中對蛇頭坐標(biāo)的基礎(chǔ)上加入了對蛇行方向的判斷,解決了這一 問題。 在撞界結(jié)束游戲后,蛇仍然會向前走一步,走到邊界的外面。仔細(xì)研究代碼后 沒有發(fā)現(xiàn)錯(cuò)誤,和同學(xué)探討后發(fā)現(xiàn),在OnTimer()函數(shù)中,撞界后則彈出對話框, 終止計(jì)時(shí)器,但程序還會將此函數(shù)執(zhí)行完,所以蛇還會向前走一步。于是在撞界 判斷中加入了程序結(jié)束標(biāo)志,在撞界后立即結(jié)束程序不再執(zhí)行任何語句。 解決了 這一問題。 在添加了障礙物之后食物生成在“墻”里。于是在生成隨機(jī)數(shù)的判定中,加入 了對生成坐標(biāo)在墻內(nèi)的判斷,解決了這一問題。 在程序完成后,我還想完成脫機(jī)運(yùn)行的功能,即在沒有VC的計(jì)算機(jī)上也能夠
25、 運(yùn)行這個(gè)程序。上網(wǎng)查閱了相關(guān)資料,了解到:在編寫MFC程序時(shí),對基類的 連接有靜態(tài)和動態(tài)兩種。當(dāng)選擇靜態(tài)連接時(shí),系統(tǒng)會在編譯組建時(shí)將用到的類圭寸 裝在程序中,就能夠離開編程環(huán)境運(yùn)行了。也就是MFC的EXE可執(zhí)行文件分為 Debug版和Release版。于是這個(gè)問題也得到了解決。 最終,在不懈的努力下,程序終于得以完美運(yùn)行了 5、程序運(yùn)行結(jié)果 n , y 無歷邀-sna 附:主要類Cview的成員函數(shù)代碼 / sn akeView.cpp : impleme ntati on of the CSn akeView class / #i nclude stdafx.h #in clude sn
26、ake.h #in clude sn akeDoc.h #in clude sn akeView.h #ifdef _DEBUG #defi ne new DEBUG_NEW #un def THIS_FILE static char THIS_FILE = _FILE_; #en dif struct Sn ake int x,y; int len; int direct; Sn ake50; struct Food int兀 int y; int food; Food; / / CSn akeView IMPLEMENT_DYNCREATE(CS nakeView, CView) BEGI
27、N_MESSAGE_MAP(CS nakeView, CView) AFX_MSG_MAP(CS nakeView) ON_WM_KEYDOWN() ON_WM_TIMER() ON_COMMAND(ID_START, On Start) ON_COMMAND(ID_PAUSE, On Pause) ON_COMMAND(ID_EXIT, On Exit) ON_COMMAND(ID_CONTINUE, OnContin ue) AFX_MSG_MAP / Stan dard prin ti ng comma nds ON_COMMAND(ID_FILE_PRINT, CView:O nFil
28、ePri nt) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:O nF ilePri nt) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:O nFilePri ntPreview) END_MESSAGE_MAP() / / CSn akeView con structio n/destructio n CSn akeView:CS nakeView() / TODO: add con struct ion code here CSn akeView:CS nakeView() BOOL CSn akeView:PreCre
29、ateWi ndow(CREATESTRUCT / / CSn akeView draw ing void CSn akeView: On Draw(CDC* pDC) CSn akeDoc* pDoc = GetDocume nt(); ASSERT_VALID(pDoc); / TODO: add draw code for n ative data here CBrush backBrush(RGB(111,111,111); CBrush* pOldBrush = pDC-SelectObject( CRect rect; pDC-GetClipBox( pDC-PatBlt(rect
30、.left, rect.top, rect.Width(), rect.Height(),PATCOPY); pDC-SelectObject(pOldBrush); pDC-Recta ngle(9,9,401,401); CBrush zaBrush(RGB(111,111,111); pDC-SelectObject(zaBrush); /繪制障礙物 for(i nt m=0;mRecta ngle(150,(100+m*10),160,(110+m*10); for(i nt n=0 ;* 10; n+) pDC-Recta ngle(250+n*10),200,(260+n*10),
31、210); onin it(); / / CSn akeView printing BOOL CSn akeView:O nPreparePri nti ng(CPri ntlnfo* pI nfo) / default preparati on return DoPreparePri nti ng(pl nfo); void CSn akeView:O nBegi nPrintin g(CDC* /*pDC*/, CPrintlnfo* /*pI nfo*/) / TODO: add extra in itializati on before printing void CSn akeVie
32、w:O nEn dPri ntin g(CDC* /*pDC*/, CPrintlnfo* /*pI nfo*/) / TODO: add clea nup after printing / / CSn akeView diag no sties #ifdef _DEBUG void CSn akeView:AssertValid() const CView:AssertValid(); void CSn akeView:Dump(CDumpC on text CSn akeDoc* CSn akeView:GetDocume nt() / non-debug vers ion is inli
33、ne ASSERT(m_pDocume nt-lsKi ndOf(RUNTIME_CLASS(CS nakeDoc); return (CS nakeDoc*)m_pDocume nt; #endif /_DEBUG / / CSn akeView message han dlers void CSn akeView:O nKeyDow n(UINT n Char, UINT n RepC nt, UINT n Flags) / TODO: Add your message han dler code here an d/or call default switch( nChar) case
34、VK_UP:if(S nake0.direct!=2) Sn ake0.direct=1;break; case VK_DOWN:if(S nake0.direct!=1) Sn ake0.direct=2;break; case VK_LEFT:if(S nake0.direct!=4) Sn ake0.direct=3;break; case VK_RIGHT:if(S nake0.direct!=3) Sn ake0.direct=4;break; /通過鍵盤設(shè)置轉(zhuǎn)頭方向 CView:O nKeyDow n(n Char, nRepC nt, nF lags); CView:O nKey
35、Dow n(n Char, nRepC nt, nF lags); void CSn akeView:O nTimer(UINT nIDEve nt) / TODO: Add your message han dler code here an d/or call default CDC *pDC=GetDC(); CStri ng soure; int j=0; if(Sn ake0.le n=3)SetTimer(1,170,NULL); if(Sn ake0.le n=9)SetTimer(1,130,NULL); if(Sn ake0.le n=14)SetTimer(1,95,NUL
36、L); if(Sn ake0.le n=18)SetTimer(1,60,NULL); /根據(jù)蛇的長度進(jìn)行速度的設(shè)定 soure.Format(”得分:d!,(Snake0.len-3)*10); / 設(shè)置每個(gè)食物 100 分 /撞墻判斷 if(S nake0.direct=3)/用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1); AfxMessageBox(soure); 分四種情況撞障礙判斷,k為循環(huán)控制標(biāo)識 if(Sn ake0.direct=3) for(int k=0;k20;k+) if(Sn ake0.x*10=160/用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1); Af
37、xMessageBox(soure); if(Sn ake0.x*10=350/用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1); AfxMessageBox(soure); / if(Sn ake0.direct=2) for(i nt k=0;k10;k+) if(Sn ake0.x*10=(250+k*10)用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(l); AfxMessageBox(soure); if(Sn ake0.x*10=150用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1); AfxMessageBox(soure); / if(Sn ake0.direct=1) f
38、or(i nt k=0;k10;k+) if(Sn ake0.x*10=(250+k*10)用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1); AfxMessageBox(soure); if(Sn ake0.x*10=150用來控制直接結(jié)束當(dāng)前函數(shù) KillTimer(1); AfxMessageBox(soure); / if(Sn ake0.direct=4) for(int k=0;k3) for(i nt sn=Sn ake0.le n-1;s n 0;s n-) if(Sn ake0.x*10=S nakes n.x*10 KillTimer(1); AfxMessageBox(
39、soure); /對尾節(jié)點(diǎn)用白筆涂掉 if(j!=1) pDC-SelectStockObject(WHITE_PEN); pDC-Recta ngle(S nakeS nake0.le n-1.x*10,S nakeS nake0.le n-1.y*10,(S nakeS nake0.l en-1.x+1)*10,(S nakeS nake0.le n-1.y+1)*10); for(i nt i=S nake0.le n-1;i0;i-) Sn akei.x=S nakei-1. x; Sn akei.y=S nakei-1.y; 行走方向判斷 if(Sn ake0.direct=1)S
40、nake0.y-; if(Sn ake0.direct=2)S nake0.y+; if(Sn ake0.direct=3)S nakeO.x-; if(Sn ake0.direct=4)S nakeO.x+; pDC-SelectStockObject(BLACK_PEN); CBrush DrawBrush=(RGB(255,0,0); CBrush *Drawbrush=pDC-SelectObject ( if(j!=1) pDC-Recta ngle(S nake0.x*10,S nake0.y*10,(S nake0.x+1)*10,(S nake0.y+1)*10); pDC-SelectObject(DrawBrush); /判斷吃食物的條件 if(Sn ake0.x*10=Food.x*10 Food
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)借款合同的格式和條款
- 城中村房產(chǎn)交易合同格式
- 經(jīng)典喪葬服務(wù)合同示范文本
- 陶瓷杯供應(yīng)協(xié)議
- 簡約室內(nèi)門購銷合同
- 電機(jī)及控制系統(tǒng)升級購銷合同
- 水泥購銷簡化合同
- 權(quán)威認(rèn)證企業(yè)品牌服務(wù)合同
- 2024年新型建筑材料研發(fā)生產(chǎn)投資合同
- 2024年四川省建筑安全員《A證》考試題庫及答案
- 私立民辦高中學(xué)校項(xiàng)目投資計(jì)劃書
- 2024屆貴陽市八年級物理第一學(xué)期期末檢測試題含解析
- 新教材部編版道德與法治五年級上冊第四單元測試題及答案
- 農(nóng)村原民辦代課教師教齡補(bǔ)助申請表
- 高邊坡專項(xiàng)施工方案樣本
- 2023年污水站設(shè)備維修 污水處理廠設(shè)備維護(hù)方案(五篇)
- 實(shí)用牛津樹授課PPT27. ORT-PreK-L27-The-Dream-200602105041-200815212000
- 秦始皇英文介紹ppt
- 研究十二生肖的文獻(xiàn)
- 妊娠劇吐的護(hù)理查房【產(chǎn)科】-課件
- 2022貴州省專業(yè)技術(shù)人員繼續(xù)教育公需科目考試題庫課件二
評論
0/150
提交評論