




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
南京理工大學(xué)VC++課程設(shè)計(jì)報(bào)告PAGEPAGE3南京理工大學(xué)VC++課程設(shè)計(jì)報(bào)告課程:VC++課程設(shè)計(jì)系別:計(jì)算機(jī)科學(xué)與工程學(xué)院班級(jí):91210xx學(xué)號(hào):91210xx姓名:xxx選題1名稱:俄羅斯方塊(MFC版)選題1難易級(jí)別:選題2名稱:選題2難易級(jí)別:自報(bào)成績(jī):A起止時(shí)間:9月3—9月22指導(dǎo)教師:嚴(yán)悍2013年9月目錄1課題目標(biāo)利用c++和mfc編寫一個(gè)俄羅斯方塊游戲,實(shí)現(xiàn)游戲在一個(gè)游戲窗口中顯示,實(shí)現(xiàn)游戲等級(jí)的設(shè)定、背景音樂的播放、煙花效果、快捷鍵的使用和玩家對(duì)方塊的各種操作等功能。2程序具體實(shí)現(xiàn)原理2.1總體方案首先應(yīng)用mfc來繪制游戲的界面,然后把游戲的核心函數(shù)和代碼封裝在一個(gè)類中。在這個(gè)類中實(shí)現(xiàn)方塊的繪制,方塊的移動(dòng)、翻轉(zhuǎn)、消行等功能。用不同的消息響應(yīng)函數(shù)來響應(yīng)玩家的各種輸入。為不同的資源定義不同的類來管理。最后在主對(duì)話框類中調(diào)用相應(yīng)的函數(shù),來實(shí)現(xiàn)游戲在對(duì)話框界面內(nèi)的運(yùn)行。2.1.1開發(fā)平臺(tái)Windows7、VC++6.0、Photoshopcs62.1.2基本原理首先,打開游戲,進(jìn)行游戲初始化。顯示游戲的開始動(dòng)畫,播放背景音樂,背景音樂一直播放到窗口關(guān)閉。然后進(jìn)入游戲的開始菜單界面,界面中有三個(gè)按鈕,玩家可以根據(jù)自己的意愿選擇按下按鈕。當(dāng)按下操作按鈕時(shí),顯示操作說明。當(dāng)按下設(shè)置按鈕時(shí),顯示設(shè)置對(duì)話框,玩家可以選擇游戲難度和是否顯示煙花效果。當(dāng)按下開始按鈕,繪制游戲背景,邊框以及隨機(jī)產(chǎn)生方塊。然后判斷方塊是否可以下落,若不可以則繼續(xù)判斷:是否可以消行,若是則消行加分,然后判斷加分多少,并據(jù)此確定是否顯示煙花;接著判斷總分的多少,確定是否分?jǐn)?shù)足夠升級(jí)。若不能消行,則顯示“Gameover”。若可以下落,則掃描玩家的按鍵,根據(jù)不同的按鍵執(zhí)行不同的操作:當(dāng)玩家按Esc鍵時(shí),退出游戲,返回開始菜單界面。當(dāng)玩家按向上鍵時(shí),首先判斷是否可以變形,若可以則方塊在下落的同時(shí)順時(shí)針旋轉(zhuǎn);若不可以則方塊繼續(xù)下落而不旋轉(zhuǎn)。當(dāng)玩家按向下鍵時(shí),則方塊直接下落到碰到底端或其他的方塊。當(dāng)玩家按向左向右鍵時(shí),首先判斷是否可以移位,若可以則方塊在下落的同時(shí)向左移或向右移;若不可以則繼續(xù)垂直下落。按鍵操作實(shí)現(xiàn)后,然后返回到判斷是否可以下落處重復(fù)操作。在游戲的同時(shí)可以判斷玩家是否按下快捷鍵:F2、F3、F4顯示不同程度的煙花效果;F12則使方塊下落速度加快,9級(jí)未滿級(jí)。流程圖如下:俄羅斯方塊MFC版流程圖Esc左右下上左右移位加速下落變形俄羅斯方塊進(jìn)入菜單,進(jìn)行選擇操作設(shè)置顯示操作顯示設(shè)置開始刷新界面,隨機(jī)產(chǎn)生方塊方塊下落,掃描按鍵掃描按鍵是否可下落是否按下按鍵消行,計(jì)分游戲結(jié)束是是否是否是是2.2程序各個(gè)功能說明2.2.1程序結(jié)構(gòu)由于我的程序是使用mfc寫的,并且是基于對(duì)話框的應(yīng)用程序,所以會(huì)自動(dòng)生成CAboutDlg類,CSquareM1Dlg類以及CSquareM1App類。然后我又為游戲添加了兩個(gè)對(duì)話框,分別是操作說明對(duì)話框和設(shè)置對(duì)話框,并且分別將它們與CDlgHelp類以及CDlgSet類相關(guān)聯(lián)。然后我設(shè)計(jì)了GAMEBOX類,用來包含游戲中具體操作的函數(shù),例如:變換,移動(dòng),產(chǎn)生方塊,判斷是否能移動(dòng)等操作。我又添加了MYBITMAP類、MYBUTTON類來管理游戲中的位圖,按鈕以及對(duì)他們的操作。并且設(shè)置了MYCLOCK類,來實(shí)現(xiàn)游戲中的時(shí)鐘處理。GAMEBOX類:類中函數(shù)有:public: GAMEBOX(); ~GAMEBOX(); voidShow();//顯示圖片 intCheck();//時(shí)鐘處理 voidMouseMove(intx,inty);//鼠標(biāo)移動(dòng)處理 intLButtonUp(intx,inty);//鼠標(biāo)單擊 voidKeyProc(intiKey);//按鍵處理 voidInitFont();//初始化字體數(shù)組 voidShowInfoNow();//分?jǐn)?shù) voidClearMap();//清除數(shù)組 voidCreateNext();//創(chuàng)建新的方塊public: voidBeginBomb(intisize);//初始化特效 voidShowBomb();//播放焰火 voidShowSet();//設(shè)置速度 voidShowHelp();//顯示操作信息 voidShowFail();//顯示gameover //旋轉(zhuǎn)、移動(dòng) voidRotate(); voidMoveDown(); voidClearRow(); voidMoveRight(); voidMoveLeft(); voidPutSpare();//一個(gè)方塊落底,寫入數(shù)組 intCanMove();//是否能移動(dòng) voidCheckGame();//游戲中檢測(cè) voidShowSquare();//游戲中繪制 intiState;//游戲數(shù)據(jù) //畫筆,畫刷 HBRUSHhBrush; HPENhPen,hPenWhite; //字體 HFONThf[10];intiAni;//動(dòng)畫 //游戲數(shù)據(jù) intgamemap[20][10];structSQUAREsquareNow; structSQUAREsquareNext; intiSpeed;//游戲中的方塊降落速度 intiTime; intiScore;//玩家數(shù)據(jù) intiSpeedSet;//在設(shè)置菜單中,設(shè)置的速度 intiStartBomb; intiScene; structMAGICmagicobj[MAGIC_NUM]; intiScale;//粒子數(shù)量intiUseMagic;MYBITMAP類:類中函數(shù)有:public: MYBITMAP(); ~MYBITMAP(); //初始化 voidInit(HINSTANCEhInstance,intiResource); voidSetDevice(HDChdest,HDChsrc); //設(shè)置圖像大小 voidInitSizeList(intnum,intw,inth); voidInitSizeList(intnum,intw,inth,intismask); voidInitSizeList(intnum,int*pw,int*ph,intismask); //顯示 voidShow(intid,intx,inty); //去背顯示 voidShowNoBack(intid,intx,inty); voidShowNoBack(intid,intx,inty,intframe); //拉伸顯示 voidStretch(intid,intx,inty,intwdest,intydest);public: //位圖句柄 HBITMAPhBm; // HDChdcdest; HDChdcsrc; //寬度高度縱坐標(biāo) intwlist[20]; inthlist[20]; intylist[20];};MYBUTTON類:類中函數(shù)有:public: MYBUTTON() ~MYBUTTON() voidInitButton(intnum,RECT*pRect);//初始化按鈕矩形 voidShow(intid);//顯示 intMouseOver(intx,inty);//鼠標(biāo)檢測(cè) voidHide(intid);public: voidShow2(intid); voidHideAll(); intidMouseOver;//鼠標(biāo)在哪一個(gè)按鈕上 RECT*pRect; intiBtNum; intIsShow[10];//是否可見MYCLOCK類:類中函數(shù)有:public: MYCLOCK() ~MYCLOCK() intclockcount()//統(tǒng)計(jì)時(shí)間片 //計(jì)時(shí):iNumClip變化過程0,1,2,...,24,0,1,2 intclipcount();//從0到24表示1秒 voidReStart(inttimetotal) { iNumDest=timetotal; iNumClip=0; } //windows定時(shí)器 voidInit(HWNDhWnd,inttimetotal) { SetTimer(hWnd,1,40,NULL);//每40ms刷新一次 iNumDest=timetotal; iNumClip=0; hWndClock=hWnd; } //顯示 voidShow(HDChDC){ chartemp[20]={0}; sprintf(temp,"D%d,C%d",iNumDest,iNumClip); TextOut(hDC,50,50,temp,strlen(temp)); }public: intiNumClip; intiNumDest; clock_ttimenow; inttimeclip; //windows HWNDhWndClock;};2.2.2課程設(shè)計(jì)要求的實(shí)現(xiàn)1.游戲界面的繪制:游戲界面的繪制是用mfc中的函數(shù)實(shí)現(xiàn)的。首先將黑色畫刷選入設(shè)備描述表內(nèi),然后用黑色畫刷填充背景。然后設(shè)置畫筆顏色為白色,用畫筆在游戲背景上繪制矩形,將游戲界面分為三個(gè)區(qū)域:一是主游戲區(qū),二是下一個(gè)方塊提示區(qū),三是文本區(qū)。然后用TextOut函數(shù)在特定位置顯示分?jǐn)?shù)以及速度。主要函數(shù)原型如下://黑色背景 SelectObject(hdccanvas,hBrush); SelectObject(hdccanvas,hPenWhite); Rectangle(hdccanvas,0,0,GAMEWIDTH,GAMEHEIGHT); // Rectangle(hdccanvas,20,18,244,462); Rectangle(hdccanvas,LEFT_RECT_X,LEFT_RECT_Y,242,460); //右上角 Rectangle(hdccanvas,RIGHT_RECT_X,RIGHT_RECT_Y, RIGHT_RECT_X+132,RIGHT_RECT_Y+132); ShowInfoNow();//分?jǐn)?shù),速度文字 ShowSquare();//方塊 ShowBomb();//特效方塊顯示本游戲中一共有七種不同形狀的方塊,而方塊的形成主要是使用GAMEBOX類的成員函數(shù)ShowSquare函數(shù)來實(shí)現(xiàn)的,函數(shù)定義如下:voidGAMEBOX::ShowSquare(){ inti; intx0,y0;//坐標(biāo)原點(diǎn) intm,n; //右上角顯示下一個(gè) x0=RIGHT_RECT_X+2*ITEM_EDGE; y0=RIGHT_RECT_Y+2*ITEM_EDGE; for(i=0;i<4;i++) { bmSquare.Show(squareNext.icolor, x0+squareNext.chip[i].x*ITEM_EDGE, y0+squareNext.chip[i].y*ITEM_EDGE); } //當(dāng)前移動(dòng)的方塊 x0=LEFT_RECT_X+squareNow.pos.x*ITEM_EDGE; y0=LEFT_RECT_Y+squareNow.pos.y*ITEM_EDGE; if(squareNow.id!=INVALID) { for(i=0;i<4;i++) { //方塊在界面內(nèi),則顯示 if(squareNow.pos.y+squareNow.chip[i].y>=0) { bmSquare.Show(squareNow.icolor, x0+squareNow.chip[i].x*ITEM_EDGE, y0+squareNow.chip[i].y*ITEM_EDGE); } } } //已經(jīng)放置的方塊,20行,10列 for(m=0;m<20;m++) { for(n=0;n<10;n++) { if(VALID==gamemap[m][n]) { bmSquare.Show(PIC0, LEFT_RECT_X+n*ITEM_EDGE, LEFT_RECT_Y+m*ITEM_EDGE); } } }}方塊變形俄羅斯方塊的特點(diǎn)就在于通過方塊的變形拼滿整行來消去該行方塊從而使游戲可以繼續(xù)下去,很難想象不能變形的俄羅斯方塊是什么樣子。而變形的過程就是根據(jù)當(dāng)前方塊形狀改變方塊的相對(duì)位置,這樣就可以改變方塊的形狀了。在程序中每當(dāng)按下“↑”鍵,調(diào)用GAMEBOX類的成員函數(shù)Rotate函數(shù)來實(shí)現(xiàn)旋轉(zhuǎn),具體代碼為:voidGAMEBOX::Rotate(){ inti; intm,n;//行列 intiCan=1; inttemp; //正方形不旋轉(zhuǎn) if(ID_SQAURE==squareNow.id) return; //判斷是否能旋轉(zhuǎn) for(i=0;i<4;i++) { //旋轉(zhuǎn)后的小塊坐標(biāo) //旋轉(zhuǎn)公式(x,y)旋轉(zhuǎn)90度變?yōu)?-y,x),再加上當(dāng)前位置 m=squareNow.pos.y+squareNow.chip[i].x; n=squareNow.pos.x-squareNow.chip[i].y; if(n<0||n>9 ||m<0||m>19 ||VALID==gamemap[m][n]) { iCan=0; break; } }//使用旋轉(zhuǎn)公式 if(iCan) { for(i=0;i<4;i++) { temp=squareNow.chip[i].x; //旋轉(zhuǎn)后的小塊坐標(biāo) squareNow.chip[i].x=-squareNow.chip[i].y; squareNow.chip[i].y=temp; } }}方塊移動(dòng)游戲中方塊的移動(dòng)主要是調(diào)用GAMEBOX類的成員函數(shù)MoveLeft,MoveRight,Movedown來實(shí)現(xiàn)的,當(dāng)玩家按下相應(yīng)的按鍵時(shí)執(zhí)行相應(yīng)的操作。函數(shù)代碼如下:voidGAMEBOX::MoveLeft(){ inti; intm,n;//行列 intiCan=1; for(i=0;i<4;i++) { m=squareNow.pos.y+squareNow.chip[i].y; n=squareNow.pos.x+squareNow.chip[i].x-1;//左移 if(n<0||VALID==gamemap[m][n]) { iCan=0; break; } } if(iCan) squareNow.pos.x--;}voidGAMEBOX::MoveRight(){ inti; intm,n;//行列 intiCan=1; for(i=0;i<4;i++) { //右移 m=squareNow.pos.y+squareNow.chip[i].y; n=squareNow.pos.x+squareNow.chip[i].x+1; if(n>9||VALID==gamemap[m][n]) { iCan=0; break; } } if(iCan) squareNow.pos.x++;}voidGAMEBOX::MoveDown(){ inti; for(i=0;i<19;i++) { if(!CanMove()) { return; } else { squareNow.pos.y++; } }}消行計(jì)分游戲玩家拼滿一行后,游戲消去滿行,并計(jì)分。當(dāng)一個(gè)方塊不能下落后,程序檢查方塊是否充滿了游戲區(qū)域,如果是結(jié)束游戲。不是,則判斷是否構(gòu)成消行條件,從下落方塊的最低點(diǎn)依次向上檢查是否可以消行,根據(jù)消去行數(shù)分?jǐn)?shù)增加。若消去行數(shù)在兩行以上,則產(chǎn)生煙花特效。并且當(dāng)分?jǐn)?shù)達(dá)到一定程度,等級(jí)提升。程序中消行是通過調(diào)用GAMEBOX類的成員函數(shù)ClearRow來實(shí)現(xiàn)的,代碼如下:voidGAMEBOX::ClearRow(){ inti; intm,n;//行列 intiNum; intiScoreRow[]={0,10,30,60,100};//分值,1行10分,2行30,3行60,4行100 intiRow;//消去多少行 iRow=0; //第19行,是最底一行 for(m=19;m>0;m--) { iNum=0; for(n=0;n<10;n++) { iNum+=gamemap[m][n]; } //消去一行 if(iNum==10) { iRow++;//統(tǒng)計(jì)消去多少行 for(i=m;i>0;i--) { //移動(dòng) memcpy(gamemap[i],gamemap[i-1],10*sizeof(int)); } memset(gamemap[0],0,10*sizeof(int)); m++;//重要,再次檢測(cè)這一行 } if(iNum==0) { //空行,不再判斷 break; } } iScore+=iScoreRow[iRow];//增加分?jǐn)?shù) if(iRow>=2) { //消除兩行以上 BeginBomb(iRow); }}游戲退出在我的這個(gè)游戲中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年法學(xué)專業(yè)知識(shí)水平測(cè)評(píng)試卷及答案
- 2025年公共事務(wù)與社會(huì)服務(wù)考試試題及答案
- 我的世界極限生存之溫暖的家450字(10篇)
- 走進(jìn)昆蟲世界:自然觀察與寫作啟蒙教學(xué)
- 農(nóng)業(yè)養(yǎng)殖技術(shù)培訓(xùn)及實(shí)踐協(xié)議
- 線上音樂平臺(tái)音樂版權(quán)交易協(xié)議
- 有你真好作文550字11篇范文
- 《數(shù)字孿生技術(shù)及應(yīng)用》課件 第六章 數(shù)字孿生應(yīng)用
- 分子生物學(xué)在線測(cè)試
- 土釘墻基坑支護(hù)方案
- 2025年1月國(guó)家開放大學(xué)漢語言文學(xué)本科《中國(guó)當(dāng)代文學(xué)專題》期末紙質(zhì)考試試題及答案
- 宜良護(hù)理考試試題及答案
- 嬰幼兒喂養(yǎng)照護(hù)人工喂養(yǎng)的回應(yīng)性照護(hù)課件
- 《傳奇歌后鄧紫棋》課件
- 術(shù)后低蛋白血癥觀察及護(hù)理
- 電力營(yíng)銷安全培訓(xùn)
- 礦山承包合同
- 應(yīng)急預(yù)案中的應(yīng)急預(yù)警系統(tǒng)
- 安徽省合肥市肥西縣2024-2025學(xué)年上學(xué)期七年級(jí)數(shù)學(xué)期末測(cè)試卷
- 統(tǒng)編版語文四年級(jí)上冊(cè)21古詩(shī)三首《出塞》課件
評(píng)論
0/150
提交評(píng)論