c貪吃蛇課程設(shè)計孫迪宇_第1頁
c貪吃蛇課程設(shè)計孫迪宇_第2頁
c貪吃蛇課程設(shè)計孫迪宇_第3頁
c貪吃蛇課程設(shè)計孫迪宇_第4頁
c貪吃蛇課程設(shè)計孫迪宇_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、齊齊哈爾大學(xué)計控學(xué)院軟件工程專業(yè)綜合實(shí)踐報告選題名稱: 用C+實(shí)現(xiàn)貪吃蛇設(shè)計 題目類別: 數(shù)據(jù)結(jié)構(gòu) 姓 名: 孫迪宇 學(xué) 號: 2009023018 班 級: 軟件091 指導(dǎo)教師: 李長榮、吳迪 設(shè)計時間: 2010年12月 目錄第一章 應(yīng)用程序的介紹- 1 -1.1選題背景- 1 -1.2關(guān)于編譯軟件- 1 -1.3關(guān)于兼容性- 1 -第二章 概要設(shè)計- 2 -2.1程序結(jié)構(gòu)- 2 -2.2程序流程- 2 -第三章 游戲?qū)崿F(xiàn)- 3 -3.1游戲界面控制- 3 -3.2初始化食物- 3 -3.3游戲控制- 4 -3.4游戲設(shè)置- 4 - 第四章 結(jié)果與討論- 5 -4.1程序運(yùn)行- 5 -4

2、.2錯誤調(diào)試與分析- 5 -附錄- 6 - 第一章 課題介紹1.1.選題背景貪吃蛇是家喻戶曉的益智類小游戲,選擇這個題目一是為了將自己的所學(xué)知識加以運(yùn)用,二是一直以來貪吃蛇這個游戲就深深地吸引著我,它的制作方法對于以前的我而言都是很神秘的。我希望通過自己的所學(xué)知識把它剖析開來,真真正正的了解它的本質(zhì)和精髓。雖然我的編程能力不是很強(qiáng),但是我有信心,在這次學(xué)習(xí)中我將從實(shí)踐和實(shí)際的項(xiàng)目中提高自己的編程能力。因此我選定了這個題目。1.2關(guān)于編譯軟件本程序采用Microsoft Visual C+6.0的中文版本進(jìn)行編譯。VisualC+6.0是Microsoft公司推出的基于Windows操作系統(tǒng)的可

3、視化C+編程工具,盡管Microsoft公司推出了.NET平臺的集成開發(fā)環(huán)境,但由于其良好的界面和可操作性,加上支持標(biāo)準(zhǔn)C/C+規(guī)范,但仍有相當(dāng)多的編程人員使用VisualC+6.0進(jìn)行應(yīng)用系統(tǒng)的開發(fā)。1.3關(guān)于兼容性本程序經(jīng)過調(diào)試,可以在XP系統(tǒng)下編譯運(yùn)行,也可以在Vista下運(yùn)行,界面稍有不同,但不影響運(yùn)行結(jié)果。第二章 概要設(shè)計2.1程序結(jié)構(gòu)根據(jù)分析,貪吃蛇這個程序一共要實(shí)現(xiàn)如下幾個功能,包括游戲方面開始游戲、暫停游戲以及停止游戲,音樂音效的添加與控制,游戲幫助提示與英雄榜的顯示等等。具體的程序結(jié)構(gòu)如下面的圖1-1所示。圖2-1 貪吃蛇結(jié)構(gòu)圖2.2程序流程根據(jù)分析后的貪吃蛇結(jié)構(gòu)設(shè)計出相應(yīng)的

4、貪吃蛇流程。貪吃蛇的內(nèi)容主要包括: 游戲開始,隨機(jī)出現(xiàn)食物;按下ToolBar中的暫停按鈕或Space鍵可以實(shí)現(xiàn)暫停功能;按下幫助鍵或ToolBar中的“?”鍵可獲得游戲幫助說明;可播放背景音樂和音效并可通過菜單以及ToolBar控制其播放或停止等等。圖2-2 貪吃蛇流程圖第三章 游戲?qū)崿F(xiàn)3.1游戲界面控制貪吃蛇游戲的游戲界面包括背景圖片、蛇身體的繪制、蛇移動范圍的繪制等等。其中貪吃蛇的身體用什么方法繪制,才可以使得其在游戲過程中可以實(shí)現(xiàn)“吃”的功能是很重要的。因此在游戲界面的初始繪制時就必須考慮到游戲時可能遇到的問題。本程序采用點(diǎn)數(shù)組CArray<CPoint,CPoint> m

5、_ysBody來存儲貪吃蛇,點(diǎn)數(shù)組的功能很強(qiáng)大,可以添加點(diǎn),同時可以獲得蛇的長度,對于而后進(jìn)行游戲中控制蛇的顏色以及音效的播放等都有很大的幫助。3.2初始化食物確定用點(diǎn)數(shù)組存儲貪吃蛇以后,貪吃蛇的食物如何達(dá)到隨機(jī)出現(xiàn),并且能夠按照網(wǎng)格式與蛇頭無偏差相接就是一個亟待解決的問題。隨機(jī)出現(xiàn)應(yīng)采用rand()函數(shù)來實(shí)現(xiàn),而食物與蛇頭無偏差相接則利用坐標(biāo)來解決。設(shè)置兩個整型變量m_ysX,m_ysY作為食物出現(xiàn)的點(diǎn)的坐標(biāo),令m_ysX= rand()%30, ,m_ysY= rand()%40即可。使隨機(jī)出現(xiàn)的點(diǎn)能夠整除最小網(wǎng)格,也就是使食物與蛇頭無偏差相接。再由食物坐標(biāo)(m_ysX,m_ysY)與蛇頭

6、坐標(biāo)是否相同判斷蛇是否“吃”到了食物,設(shè)置判斷標(biāo)簽ysTag,如果吃到了,ysTag為1,則再出現(xiàn)下一個食物,反之,如果沒吃到,則不出現(xiàn)食物直到標(biāo)簽為1為止。最后,再將(m_ysX,m_ysY)賦給m_ysFood作為食物坐標(biāo),以便在其他函數(shù)中調(diào)用。3.3游戲控制開始游戲后的重點(diǎn)是如何用鍵盤來控制蛇的移動并傳遞到OnTimer(UINT nIDEvent)函數(shù)中去以及判斷蛇是否死亡。首先說明鍵盤與蛇的響應(yīng),設(shè)置一個方向控制變量m_ysDirect,再添加OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函數(shù)來實(shí)現(xiàn)鍵盤消息的傳遞,按下不同的鍵盤按鍵,

7、m_ysDirect會相應(yīng)的改變,再利用switch語句在OnTimer(UINT nIDEvent)函數(shù)中對坐標(biāo)進(jìn)行相應(yīng)改變即可。其次來解釋一下如何判斷蛇的死亡,由于蛇的身體是由點(diǎn)坐標(biāo)數(shù)組構(gòu)成的,因此判斷蛇是否死亡其本質(zhì)就是判斷蛇頭的坐標(biāo)是否與游戲邊框相同或者蛇頭坐標(biāo)是否與蛇自己的身體相同。該過程也在OnTimer(UINT nIDEvent)函數(shù)中寫入即可,設(shè)置一個判斷死亡變量ysTag1,當(dāng)按下向下鍵時,蛇縱坐標(biāo)不斷自加,如果ysTag1為1,則說明蛇已經(jīng)死亡,應(yīng)當(dāng)彈出對話框提示死亡,輸出得分(如圖3-4),同時還可以根據(jù)玩家的得分?jǐn)?shù)相應(yīng)的改變對話框中的話語(XP系統(tǒng)下)。我們看到蛇身體

8、的顏色發(fā)生了變化,不再是初始狀態(tài)的綠色,而是變?yōu)榱怂{(lán)色,這是在OnDraw(CDC* pDC)函數(shù)中設(shè)置的,設(shè)置變量獲取蛇身長度,隨著長度的增加,蛇的顏色發(fā)生相應(yīng)改變,最終會變?yōu)楸硎疚kU的紅色。并且伴隨著貪吃蛇掛掉,播放不同的音樂,如果高于70分,則放帶有掌聲鼓勵的高分音樂的IDR_YS_HIGHSCORE,反之,則播放蛇被撞死的電子音樂IDR_YS_LOWSCORE。播放音樂的函數(shù)用包含在頭文件mmsystem.h中的PlaySound函數(shù)。此外,游戲開始還需要計時、計分以及暫停等功能。這些功能都比較簡單,游戲時間和分?jǐn)?shù)分別用兩個變量m_ysTime和m_ysScore來記錄,應(yīng)用pDC-&

9、gt;TextOut函數(shù)來輸出即可。至于暫停和繼續(xù)的功能實(shí)現(xiàn),只需要暫停和恢復(fù)計時器就可以了,實(shí)現(xiàn)暫停功能即KillTimer(1)并同時令控制暫停變量為m_yspausectrl為0即可。3.4游戲設(shè)置這里的游戲設(shè)置主要是指游戲的等級以及音效音樂的播放控制。關(guān)于這三個量,我們已經(jīng)予以了定義,只需要在按下相應(yīng)鍵盤或鼠標(biāo)消息的時候,將變量值進(jìn)行改變,再利用這些值控制相應(yīng)功能的運(yùn)行。第四章 結(jié)果與討論4.1程序運(yùn)行程序開始運(yùn)行后會進(jìn)入游戲界面,但是不會立即進(jìn)行游戲,單擊菜單的“開始”才會開始游戲。在游戲開始前,玩家可以根據(jù)自己的喜好,通過菜單或者工具欄設(shè)置游戲等級等。在游戲過程中,按下Space鍵

10、就會暫停游戲,再按下Space鍵則會繼續(xù)游戲。圖4-1所顯示的是XP系統(tǒng)下菜單的樣式,以及單擊菜單開始。開始游戲了,小蛇越來越長,顏色也有所不同了。顏色的改變預(yù)示著游戲的難度加大了,并且,不同的最終得分會產(chǎn)生不同的死亡評語。在前面顯示了貪吃蛇死亡的樣子,其中因?yàn)樵摼钟螒虻梅直容^低,因此得到的評語是“你才得了這么兩分!”,而如果得分較高,就會得到更好的評語,最好的評語是“牛!”。如果不太會玩貪吃蛇這款游戲,那么可以單擊菜單“幫助游戲說明”,尋求幫助。4.2錯誤調(diào)試與分析本程序由于經(jīng)常調(diào)用Invalidate()函數(shù)重繪窗口,因此在游戲過程中頻閃的非常嚴(yán)重。查閱了很多資料,雙緩沖技術(shù)可以解決這個問

11、題,但是如果采用雙緩沖技術(shù),暫時還不能克服背景的問題,因?yàn)樵陔p緩沖技術(shù)的應(yīng)用中,背景是被強(qiáng)制默認(rèn)為顏色,而不是圖片。我嘗試改變了一下,但是沒有成功,所以這個問題還沒有解決。希望老師多多給予意見。附錄Main.#include <vcl.h>#pragma hdrstopUSERES("Snake.res");USERC("Snake_Res.rc");USEUNIT("UnitSnake.cpp");USEFORM("UnitTest.cpp", FormMain);USEFORM("Unit

12、EnterName.cpp", FormEnterName);USEFORM("UnitAbout.cpp", FormAbout);WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) try Application->Initialize(); Application->CreateForm(_classid(TFormMain), &FormMain); Application->Run(); catch (Exception &exception) Application->

13、;ShowException(&exception); return 0;1.#include <vcl.h>#pragma hdrstop#include "UnitAbout.h"#pragma package(smart_init)#pragma resource "*.dfm"TFormAbout *FormAbout;_fastcall TFormAbout:TFormAbout(TComponent* Owner) : TForm(Owner) LabelProg->Font->Size = 12; Label

14、Home->Font->Color = clBlue; LabelHome->Font->Style = LabelHome->Font->Style<<fsUnderline; BnOKDefProc = BnOK->WindowProc; BnOK->WindowProc = BnOkWndProc; LabelHomeDefProc = LabelHome->WindowProc; LabelHome->WindowProc = LabelHomeWndProc;void _fastcall TFormAbout:L

15、abelHomeClick(TObject *Sender) ShellExecute(Handle,"open",LabelHome->Caption.c_str(),0,"",SW_SHOWNORMAL);void _fastcall TFormAbout:LabelHomeWndProc(Messages:TMessage &Message) if(Message.Msg=CM_MOUSEENTER) LabelHome->Font->Color = clRed; else if(Message.Msg=CM_MOUSEL

16、EAVE) LabelHome->Font->Color = clBlue; LabelHomeDefProc(Message);void _fastcall TFormAbout:BnOkWndProc(Messages:TMessage &Message) if(Message.Msg=CM_MOUSEENTER) BnOK->Font->Color = clRed; else if(Message.Msg=CM_MOUSELEAVE) BnOK->Font->Color = clWindowText; BnOKDefProc(Message);

17、2.#include "UnitSnake.h"TSnakeBuf:TWall TSnakeBuf:Wall0=-1;TSnakeBuf:TWall TSnakeBuf:Wall1=5,10,23,10,-1;TSnakeBuf:TWall TSnakeBuf:Wall2=10,5,10,16,18,5,18,16,-1;TSnakeBuf:TWall TSnakeBuf:Wall3=10,5,10,16,18,5,18,16, 5,10,23,10,-1;TSnakeBuf:TWall TSnakeBuf:Wall4= 5,6,23, 6,5,14,23,14,-1;TS

18、nakeBuf:TWall TSnakeBuf:Wall5= 5,6,23, 6,5,14,23,14,14, 7,14,13,-1;TSnakeBuf:TWall TSnakeBuf:Wall6=10,0,10,16,18,5,18,20,-1;TSnakeBuf:TWall TSnakeBuf:Wall7= 0,6,23, 6,5,14,27,14,-1;TSnakeBuf:TWall TSnakeBuf:Wall8= 6,5, 6,20,20,5,20,20,13, 0,13,16,-1;TSnakeBuf:TWall TSnakeBuf:Wall9= 0,6,15, 6,21,0,21

19、, 9,12,14,27,14,6,12,6,20,-1;TSnakeBuf:TWall *TSnakeBuf:Walls=TSnakeBuf:Wall0,TSnakeBuf:Wall1,TSnakeBuf:Wall2,TSnakeBuf:Wall3,TSnakeBuf:Wall4,TSnakeBuf:Wall5,TSnakeBuf:Wall6,TSnakeBuf:Wall7,TSnakeBuf:Wall8,TSnakeBuf:Wall9;TSnakeBuf:TBmpPos TSnakeBuf:BmpPos = / Wall Bean Super Head Horz Vert CrnUL Cr

20、nUR CrnDL CrnDR TailU TailD TailL TailR Stage 4,1,4,2,5,2,5,1,4,0,5,0,0,1,1,1,0,2,1,2,3,1,2,2,2,1,3,2,5,2, 0,0,1,0,3,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,3,0,;TSnakeBuf:TSnakeBuf() _Snake = 0; _iBeanNo = 0; _iStageBeans = 200; _iScore = 0; _bGameOver = false; _bEndStage = false; memset(_Uni

21、ts,0,sizeof(_Units); memset(_DispBuf,0,sizeof(_DispBuf);TSnakeBuf:TSnakeBuf() ClearSnake();void TSnakeBuf:ClearSnake(void) if(_Snake) TSnakeNode *toDel; _Snake->Prev->Next=0; while(_Snake) toDel=_Snake; _Snake=_Snake->Next; delete toDel; _Snake=0; void TSnakeBuf:InitSnake(void) ClearSnake()

22、; _Snake = new TSnakeNode; TSnakeNode *nd = new TSnakeNode; _Snake->x = UnitX/2; _Snake->y = UnitY-2; _Snake->Next = nd; _Snake->Prev = nd; nd->x = UnitX/2; nd->y = UnitY-1; nd->Next = _Snake; nd->Prev = _Snake;void TSnakeBuf:StepMove(int d) if(_Snake)&&(d)&&(

23、!_bGameOver)&&(!_bEndStage) TSnakeNode NewPos = *_Snake; switch(d) case sdUp : NewPos.y-; break; /up case sdDown : NewPos.y+; break; /down case sdLeft : NewPos.x-; break; /left case sdRight: NewPos.x+; break; /right default : return; /do nothing if(NewPos.x<0)|(NewPos.y<0)|(NewPos.x>

24、;=UnitX)|(NewPos.y>=UnitY) _bGameOver = true; return; if(GetDispBuf(NewPos.x,NewPos.y)=sbnWall) _bGameOver = true; return; if(GetDispBuf(NewPos.x,NewPos.y)>=sbnHead)&&(GetDispBuf(NewPos.x,NewPos.y)<sbnStage) _bGameOver = true; return; bool bEat = GetUnit(NewPos.x,NewPos.y)=sbnBean |

25、 GetUnit(NewPos.x,NewPos.y)=sbnStage; SetUnit(NewPos.x,NewPos.y,sbnNone); if(bEat) TSnakeNode *NewNode = new TSnakeNode; NewNode->x = NewPos.x; NewNode->y = NewPos.y; NewNode->Next = _Snake; NewNode->Prev = _Snake->Prev; _Snake->Prev->Next = NewNode; _Snake->Prev=NewNode; _Sn

26、ake = NewNode; _iScore += ssEat; else _Snake = _Snake->Prev; _Snake->x = NewPos.x; _Snake->y = NewPos.y; DrawSnake(); if(bEat) if(!GenBean() _bEndStage = true; _iScore += ssStage; int TSnakeBuf:GetDispBuf(int x, int y) if(x>=0) && (x<UnitX) && (y>=0) && (y&l

27、t;UnitY) return _DispBufyx; return 0;int TSnakeBuf:GetUnit(int x, int y) if(x>=0) && (x<UnitX) && (y>=0) && (y<UnitY) return _Unitsyx; return 0;void TSnakeBuf:SetUnit(int x, int y, int n) if(x>=0) && (x<UnitX) && (y>=0) && (y<Un

28、itY) _Unitsyx = n;void TSnakeBuf:DrawSnake(void) memcpy(_DispBuf,_Units,sizeof(_Units); if(_Snake) TSnakeNode *lpNode = _Snake->Next; _DispBuf_Snake->y_Snake->x=sbnHead; while(lpNode)&&(lpNode!=_Snake) if(lpNode->Next=_Snake) if(lpNode->y=lpNode->Prev->y) _DispBuflpNode-

29、>ylpNode->x = (lpNode->x<lpNode->Prev->x?sbnTailL:sbnTailR); else _DispBuflpNode->ylpNode->x = (lpNode->y<lpNode->Prev->y?sbnTailU:sbnTailD); else if(lpNode->y=lpNode->Prev->y) if(lpNode->y>lpNode->Next->y) _DispBuflpNode->ylpNode->x=(lp

30、Node->x<lpNode->Prev->x)?sbnCornDL:sbnCornDR; else if(lpNode->y<lpNode->Next->y) _DispBuflpNode->ylpNode->x=(lpNode->x<lpNode->Prev->x)?sbnCornUL:sbnCornUR; else _DispBuflpNode->ylpNode->x=sbnHorz; else if(lpNode->x<lpNode->Next->x) _DispBu

31、flpNode->ylpNode->x=(lpNode->y<lpNode->Prev->y)?sbnCornUL:sbnCornDL; else if(lpNode->x>lpNode->Next->x) _DispBuflpNode->ylpNode->x=(lpNode->y<lpNode->Prev->y)?sbnCornUR:sbnCornDR; else _DispBuflpNode->ylpNode->x=sbnVert; lpNode = lpNode->Next;

32、 void TSnakeBuf:InitStage(int StgNum) _iBeanNo = 0; _bGameOver = false; _bEndStage = false; memset(_Units,0,sizeof(_Units); memset(_DispBuf,0,sizeof(_DispBuf); GenWalls(StgNum); InitSnake(); DrawSnake(); GenBean();void TSnakeBuf:ClearScore(void) _iScore = 0;bool TSnakeBuf:GenBean(void) if(+_iBeanNo&

33、lt;=_iStageBeans) int x = random(UnitX); int y = random(UnitY); while(GetDispBuf(x,y) x = random(UnitX); y = random(UnitY); SetUnit(x,y,_iBeanNo=_iStageBeans?sbnStage:sbnBean); return true; return false;void TSnakeBuf:GenWalls(int StgNum) int StNo=StgNum%StageCount; TWall *lpWall = WallsStNo; for(in

34、t i=0; lpWalli.x1>=0; i+) if(lpWalli.x1=lpWalli.x2) for(int y=lpWalli.y1; y<=lpWalli.y2; y+) SetUnit(lpWalli.x1,y,sbnWall); else for(int x=lpWalli.x1; x<=lpWalli.x2; x+) SetUnit(x,lpWalli.y1,sbnWall); bool TSnakeBuf:fGetRunning(void) return (_Snake)&&(!_bGameOver)&&(!_bEndSt

35、age);_fastcall TSnakeTimer:TSnakeTimer():TThread(false) dwTimeToWait = 300; hTimer = NULL; OnTimer = NULL; iSkipUserEvent = 0; FreeOnTerminate = true;void _fastcall TSnakeTimer:DestroyTimer(void) OnTimer = NULL; Terminate(); SetEvent(hTimer);void _fastcall TSnakeTimer:SyOnStart(void) dwWaitTime = dw

36、TimeToWait; iSkipUserEvent = 0; hTimer = CreateEvent(NULL, true, false, NULL);void _fastcall TSnakeTimer:SyOnExit(void) CloseHandle(hTimer);void _fastcall TSnakeTimer:SyOnTimer(void) if(OnTimer)&&(!iSkipUserEvent) try OnTimer(this); catch(Exception &e) /ignore user's error if(iSkipUs

37、erEvent>0) iSkipUserEvent-; ResetEvent(hTimer);void _fastcall TSnakeTimer:Execute(void) Synchronize(SyOnStart); while(!Terminated) WaitForSingleObject(hTimer,dwWaitTime); if(!Terminated) Synchronize(SyOnTimer); Synchronize(SyOnExit);void _fastcall TSnakeTimer:fSetInterval(DWORD dwIntv) dwWaitTime

38、 = dwTimeToWait = dwIntv; iSkipUserEvent = 1; TriggerTimer();void _fastcall TSnakeTimer:TriggerTimer(int iWait) if(hTimer) if(iWait>0) iSkipUserEvent = iWait+1; SetEvent(hTimer); 3.#include <vcl.h>#pragma hdrstop#include "UnitEnterName.h"#pragma package(smart_init)#pragma resource

39、 "*.dfm"TFormEnterName *FormEnterName;_fastcall TFormEnterName:TFormEnterName(TComponent* Owner) : TForm(Owner) EditName->Clear();4.#include <vcl.h>#pragma hdrstop#include "UnitTest.h"#include "UnitAbout.h"#include "UnitEnterName.h"#include <stdio.

40、h>#pragma package(smart_init)#pragma resource "*.dfm"TFormMain *FormMain;_fastcall TFormMain:TFormMain(TComponent* Owner) : TForm(Owner) randomize(); LoadParams(); StageNo = 0; Paused = false; DrMove = TSnakeBuf:sdUp; int dx = ScrollBoxSnake->Width - PaintBoxSnake->Width; int dy =

41、 ScrollBoxSnake->Height - PaintBoxSnake->Height; ScrollBoxSnake->Width = dx + TSnakeBuf:UnitX*16; ScrollBoxSnake->Height = dy + TSnakeBuf:UnitY*16; ScrollBoxSnake->DoubleBuffered = true; MiBlocks->Checked=SnakeParams.BmpSet; LabelHS->Caption=SnakeParams.HighScore; LabelStage->

42、;Caption=StageNo+1; LabelScore->Caption=SnakeBuf.Score; LabelHome->Font->Color = clBlue; LabelHomeDefProc = LabelHome->WindowProc; LabelHome->WindowProc = LabelHomeWndProc; RunBmp = new Graphics:TBitmap; RunBmp->LoadFromResourceName(0,"BMP_SNAKE"); RunBmp->PixelFormat

43、= pfDevice; PausedBmp = new Graphics:TBitmap; PausedBmp->LoadFromResourceName(0,"BMP_PAUSED"); PausedBmp->PixelFormat = pfDevice; PausedBmp->Transparent = true; OverBmp = new Graphics:TBitmap; OverBmp->LoadFromResourceName(0,"BMP_GMOVER"); OverBmp->PixelFormat = pf

44、Device; OverBmp->Transparent = true; MaskBmp = new Graphics:TBitmap; MaskBmp->Assign(RunBmp); MaskBmp->Mask(MaskBmp->Canvas->PixelsMaskBmp->Width-1MaskBmp->Height-1); SnakeTimer = new TSnakeTimer; SnakeTimer->Interval = 300; SnakeTimer->OnTimer = SnakeTimerTimer;_fastcall

45、TFormMain:TFormMain() SnakeTimer->DestroyTimer(); delete MaskBmp; delete OverBmp; delete PausedBmp; delete RunBmp;void _fastcall TFormMain:LabelHomeWndProc(Messages:TMessage &Message) if(Message.Msg=CM_MOUSEENTER) LabelHome->Font->Color = clRed; LabelHome->Font->Style = LabelHome-

46、>Font->Style<<fsUnderline; else if(Message.Msg=CM_MOUSELEAVE) LabelHome->Font->Color = clBlue; LabelHome->Font->Style = LabelHome->Font->Style>>fsUnderline; LabelHomeDefProc(Message);void _fastcall TFormMain:LabelHomeClick(TObject *Sender) ShellExecute(Handle,&quo

47、t;open","void _fastcall TFormMain:PaintBoxSnakePaint(TObject *Sender) TPaintBox *pb = (TPaintBox*)Sender; TCanvas *lpCanvas = pb->Canvas; TRect rc(pb->Left,pb->Top,pb->Left+pb->Width,pb->Top+pb->Height); lpCanvas->Brush->Style = bsSolid; lpCanvas->Brush->Co

48、lor = clWhite; lpCanvas->FillRect(rc); int u, x0,y0,x1,y1; TSnakeBuf:TSnakeNode *lpPoint; for(int y=0; y<TSnakeBuf:UnitY; y+) x1=0; y1=y*16; for(int x=0; x<TSnakeBuf:UnitX; x+) u=SnakeBuf.GetDispBuf(x,y); if(u>0) u-; x0=TSnakeBuf:BmpPosSnakeParams.BmpSet.Posu.x*16; y0=TSnakeBuf:BmpPosSna

49、keParams.BmpSet.Posu.y*16; :BitBlt(lpCanvas->Handle,x1,y1,16,16, RunBmp->Canvas->Handle,x0,y0, SRCINVERT); :BitBlt(lpCanvas->Handle,x1,y1,16,16, MaskBmp->Canvas->Handle,x0,y0, SRCAND ); :BitBlt(lpCanvas->Handle,x1,y1,16,16, RunBmp->Canvas->Handle,x0,y0, SRCINVERT); x1+=16;

50、 if(Paused) int w=PausedBmp->Width,h=PausedBmp->Height; int x=(pb->Width-w)/2,y=(pb->Height-h)/2; lpCanvas->Draw(x,y,PausedBmp); else if(SnakeBuf.GameOver) int w=OverBmp->Width,h=OverBmp->Height; int x=(pb->Width-w)/2,y=(pb->Height-h)/2; lpCanvas->Draw(x,y,OverBmp); voi

51、d _fastcall TFormMain:SnakeTimerTimer(TObject *Sender) if(!SnakeBuf.GameOver)&&(StageNo<TSnakeBuf:StageCount)&&(!Paused) bool bCheckScore = false; SnakeBuf.StepMove(DrMove); if(SnakeBuf.GameOver) LabelScore->Caption=SnakeBuf.Score; PaintBoxSnake->Invalidate(); bCheckScore = true; /Application->MessageBox("Game Over!","Game Over",MB_OK|MB_ICONSTOP); if(SnakeBuf.EndStage) StageNo+; StageNo%=TSnakeBuf:StageCount;

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論