




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、齊齊哈爾大學(xué)計(jì)控學(xué)院軟件工程專業(yè)綜合實(shí)踐報(bào)告選題名稱: 用C+實(shí)現(xiàn)貪吃蛇設(shè)計(jì) 題目類別: 數(shù)據(jù)結(jié)構(gòu) 姓 名: 孫迪宇 學(xué) 號(hào): 2009023018 班 級(jí): 軟件091 指導(dǎo)教師: 李長榮、吳迪 設(shè)計(jì)時(shí)間: 2010年12月 目錄第一章 應(yīng)用程序的介紹- 1 -1.1選題背景- 1 -1.2關(guān)于編譯軟件- 1 -1.3關(guān)于兼容性- 1 -第二章 概要設(shè)計(jì)- 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錯(cuò)誤調(diào)試與分析- 5 -附錄- 6 - 第一章 課題介紹1.1.選題背景貪吃蛇是家喻戶曉的益智類小游戲,選擇這個(gè)題目一是為了將自己的所學(xué)知識(shí)加以運(yùn)用,二是一直以來貪吃蛇這個(gè)游戲就深深地吸引著我,它的制作方法對(duì)于以前的我而言都是很神秘的。我希望通過自己的所學(xué)知識(shí)把它剖析開來,真真正正的了解它的本質(zhì)和精髓。雖然我的編程能力不是很強(qiáng),但是我有信心,在這次學(xué)習(xí)中我將從實(shí)踐和實(shí)際的項(xiàng)目中提高自己的編程能力。因此我選定了這個(gè)題目。1.2關(guān)于編譯軟件本程序采用Microsoft Visual C+6.0的中文版本進(jìn)行編譯。VisualC+6.0是Microsoft公司推出的基于Windows操作系統(tǒng)的可
3、視化C+編程工具,盡管Microsoft公司推出了.NET平臺(tái)的集成開發(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è)計(jì)2.1程序結(jié)構(gòu)根據(jù)分析,貪吃蛇這個(gè)程序一共要實(shí)現(xiàn)如下幾個(gè)功能,包括游戲方面開始游戲、暫停游戲以及停止游戲,音樂音效的添加與控制,游戲幫助提示與英雄榜的顯示等等。具體的程序結(jié)構(gòu)如下面的圖1-1所示。圖2-1 貪吃蛇結(jié)構(gòu)圖2.2程序流程根據(jù)分析后的貪吃蛇結(jié)構(gòu)設(shè)計(jì)出相應(yīng)的
4、貪吃蛇流程。貪吃蛇的內(nèi)容主要包括: 游戲開始,隨機(jī)出現(xiàn)食物;按下ToolBar中的暫停按鈕或Space鍵可以實(shí)現(xiàn)暫停功能;按下幫助鍵或ToolBar中的“?”鍵可獲得游戲幫助說明;可播放背景音樂和音效并可通過菜單以及ToolBar控制其播放或停止等等。圖2-2 貪吃蛇流程圖第三章 游戲?qū)崿F(xiàn)3.1游戲界面控制貪吃蛇游戲的游戲界面包括背景圖片、蛇身體的繪制、蛇移動(dòng)范圍的繪制等等。其中貪吃蛇的身體用什么方法繪制,才可以使得其在游戲過程中可以實(shí)現(xiàn)“吃”的功能是很重要的。因此在游戲界面的初始繪制時(shí)就必須考慮到游戲時(shí)可能遇到的問題。本程序采用點(diǎn)數(shù)組CArray<CPoint,CPoint> m
5、_ysBody來存儲(chǔ)貪吃蛇,點(diǎn)數(shù)組的功能很強(qiáng)大,可以添加點(diǎn),同時(shí)可以獲得蛇的長度,對(duì)于而后進(jìn)行游戲中控制蛇的顏色以及音效的播放等都有很大的幫助。3.2初始化食物確定用點(diǎn)數(shù)組存儲(chǔ)貪吃蛇以后,貪吃蛇的食物如何達(dá)到隨機(jī)出現(xiàn),并且能夠按照網(wǎng)格式與蛇頭無偏差相接就是一個(gè)亟待解決的問題。隨機(jī)出現(xiàn)應(yīng)采用rand()函數(shù)來實(shí)現(xiàn),而食物與蛇頭無偏差相接則利用坐標(biāo)來解決。設(shè)置兩個(gè)整型變量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)下一個(gè)食物,反之,如果沒吃到,則不出現(xiàn)食物直到標(biāo)簽為1為止。最后,再將(m_ysX,m_ysY)賦給m_ysFood作為食物坐標(biāo),以便在其他函數(shù)中調(diào)用。3.3游戲控制開始游戲后的重點(diǎn)是如何用鍵盤來控制蛇的移動(dòng)并傳遞到OnTimer(UINT nIDEvent)函數(shù)中去以及判斷蛇是否死亡。首先說明鍵盤與蛇的響應(yīng),設(shè)置一個(gè)方向控制變量m_ysDirect,再添加OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函數(shù)來實(shí)現(xiàn)鍵盤消息的傳遞,按下不同的鍵盤按鍵,
7、m_ysDirect會(huì)相應(yīng)的改變,再利用switch語句在OnTimer(UINT nIDEvent)函數(shù)中對(duì)坐標(biāo)進(jìn)行相應(yīng)改變即可。其次來解釋一下如何判斷蛇的死亡,由于蛇的身體是由點(diǎn)坐標(biāo)數(shù)組構(gòu)成的,因此判斷蛇是否死亡其本質(zhì)就是判斷蛇頭的坐標(biāo)是否與游戲邊框相同或者蛇頭坐標(biāo)是否與蛇自己的身體相同。該過程也在OnTimer(UINT nIDEvent)函數(shù)中寫入即可,設(shè)置一個(gè)判斷死亡變量ysTag1,當(dāng)按下向下鍵時(shí),蛇縱坐標(biāo)不斷自加,如果ysTag1為1,則說明蛇已經(jīng)死亡,應(yīng)當(dāng)彈出對(duì)話框提示死亡,輸出得分(如圖3-4),同時(shí)還可以根據(jù)玩家的得分?jǐn)?shù)相應(yīng)的改變對(duì)話框中的話語(XP系統(tǒng)下)。我們看到蛇身體
8、的顏色發(fā)生了變化,不再是初始狀態(tài)的綠色,而是變?yōu)榱怂{(lán)色,這是在OnDraw(CDC* pDC)函數(shù)中設(shè)置的,設(shè)置變量獲取蛇身長度,隨著長度的增加,蛇的顏色發(fā)生相應(yīng)改變,最終會(huì)變?yōu)楸硎疚kU(xiǎn)的紅色。并且伴隨著貪吃蛇掛掉,播放不同的音樂,如果高于70分,則放帶有掌聲鼓勵(lì)的高分音樂的IDR_YS_HIGHSCORE,反之,則播放蛇被撞死的電子音樂IDR_YS_LOWSCORE。播放音樂的函數(shù)用包含在頭文件mmsystem.h中的PlaySound函數(shù)。此外,游戲開始還需要計(jì)時(shí)、計(jì)分以及暫停等功能。這些功能都比較簡單,游戲時(shí)間和分?jǐn)?shù)分別用兩個(gè)變量m_ysTime和m_ysScore來記錄,應(yīng)用pDC-&
9、gt;TextOut函數(shù)來輸出即可。至于暫停和繼續(xù)的功能實(shí)現(xiàn),只需要暫停和恢復(fù)計(jì)時(shí)器就可以了,實(shí)現(xiàn)暫停功能即KillTimer(1)并同時(shí)令控制暫停變量為m_yspausectrl為0即可。3.4游戲設(shè)置這里的游戲設(shè)置主要是指游戲的等級(jí)以及音效音樂的播放控制。關(guān)于這三個(gè)量,我們已經(jīng)予以了定義,只需要在按下相應(yīng)鍵盤或鼠標(biāo)消息的時(shí)候,將變量值進(jìn)行改變,再利用這些值控制相應(yīng)功能的運(yùn)行。第四章 結(jié)果與討論4.1程序運(yùn)行程序開始運(yùn)行后會(huì)進(jìn)入游戲界面,但是不會(huì)立即進(jìn)行游戲,單擊菜單的“開始”才會(huì)開始游戲。在游戲開始前,玩家可以根據(jù)自己的喜好,通過菜單或者工具欄設(shè)置游戲等級(jí)等。在游戲過程中,按下Space鍵
10、就會(huì)暫停游戲,再按下Space鍵則會(huì)繼續(xù)游戲。圖4-1所顯示的是XP系統(tǒng)下菜單的樣式,以及單擊菜單開始。開始游戲了,小蛇越來越長,顏色也有所不同了。顏色的改變預(yù)示著游戲的難度加大了,并且,不同的最終得分會(huì)產(chǎn)生不同的死亡評(píng)語。在前面顯示了貪吃蛇死亡的樣子,其中因?yàn)樵摼钟螒虻梅直容^低,因此得到的評(píng)語是“你才得了這么兩分!”,而如果得分較高,就會(huì)得到更好的評(píng)語,最好的評(píng)語是“牛!”。如果不太會(huì)玩貪吃蛇這款游戲,那么可以單擊菜單“幫助游戲說明”,尋求幫助。4.2錯(cuò)誤調(diào)試與分析本程序由于經(jīng)常調(diào)用Invalidate()函數(shù)重繪窗口,因此在游戲過程中頻閃的非常嚴(yán)重。查閱了很多資料,雙緩沖技術(shù)可以解決這個(gè)問
11、題,但是如果采用雙緩沖技術(shù),暫時(shí)還不能克服背景的問題,因?yàn)樵陔p緩沖技術(shù)的應(yīng)用中,背景是被強(qiáng)制默認(rèn)為顏色,而不是圖片。我嘗試改變了一下,但是沒有成功,所以這個(gè)問題還沒有解決。希望老師多多給予意見。附錄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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 通訊行業(yè)會(huì)計(jì)的工作計(jì)劃
- 建立互助養(yǎng)老服務(wù)網(wǎng)絡(luò)的計(jì)劃
- 水務(wù)產(chǎn)業(yè)發(fā)展戰(zhàn)略計(jì)劃
- 促進(jìn)學(xué)校與家長的緊密合作的學(xué)期工作計(jì)劃
- 2025年合成橡膠型膠粘劑項(xiàng)目建議書
- 強(qiáng)化供需監(jiān)測(cè)機(jī)制保障市場秩序
- 2025年人造崗石樹脂項(xiàng)目建議書
- 2025年硅粉系列合作協(xié)議書
- 國有土地使用權(quán)租賃合同
- 第二季度部門工作計(jì)劃表
- 2024河南省鄭州市公安局輔警招聘2024人歷年高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 投資居間協(xié)議合同模板
- 多重耐藥菌的預(yù)防及護(hù)理課件
- 抽水蓄能電站課件
- GB/T 25052-2024連續(xù)熱浸鍍層鋼板和鋼帶尺寸、外形、重量及允許偏差
- 河北科大項(xiàng)目實(shí)施計(jì)劃書
- 消防設(shè)施操作和維護(hù)保養(yǎng)規(guī)程
- -精益與智能工廠三年規(guī)劃
- 2024年高素質(zhì)農(nóng)民職業(yè)技能大賽(農(nóng)業(yè)經(jīng)理人)賽項(xiàng)考試題庫-下(多選、判斷題)
- 中小學(xué)校園安全教育主題班會(huì)課件:筑牢安全紅線、守護(hù)校園平安
- 高空作業(yè)考試題(帶答案)
評(píng)論
0/150
提交評(píng)論