MFC俄羅斯方塊

MFC俄羅斯方塊

ID:40750657

大小:101.50 KB

頁(yè)數(shù):10頁(yè)

時(shí)間:2019-08-07

MFC俄羅斯方塊_第1頁(yè)
MFC俄羅斯方塊_第2頁(yè)
MFC俄羅斯方塊_第3頁(yè)
MFC俄羅斯方塊_第4頁(yè)
MFC俄羅斯方塊_第5頁(yè)
資源描述:

《MFC俄羅斯方塊》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。

1、MFC版俄羅斯方塊2010-01-1121:17MFC版俄羅斯方塊總算完成了,足足花了我兩天時(shí)間,其間出現(xiàn)過(guò)好多問(wèn)題,后來(lái)都被一一化解,最頭疼的是昨天晚上那個(gè)Bug把我頭都弄大了,找了一晚上都沒(méi)找出來(lái),幸虧第二天腦子清醒才發(fā)現(xiàn)問(wèn)題,要不然我真的很難找到一條讓自己不崩潰的理由。呵呵,還好頂住了,任務(wù)也算順利完成了。我寫(xiě)的這個(gè)俄羅斯方塊游戲功能雖然比較簡(jiǎn)單,界面做的也很普通,但是從設(shè)計(jì)到實(shí)現(xiàn)基本上是用自己的算法實(shí)現(xiàn)的,雖然在程序的封裝性和模塊化上面做的不夠好,東補(bǔ)西湊也算湊合吧??倸w一句話(huà),不容易啊!閑話(huà)不多說(shuō)

2、了,下面我介紹一下俄羅斯方塊的設(shè)計(jì)思路和流程以及在編碼過(guò)程中遇到的一些問(wèn)題。在寫(xiě)俄羅斯方塊之前我對(duì)這個(gè)經(jīng)典的小游戲進(jìn)行了策略分析,并大體總結(jié)出了它的功能需求。下面是我當(dāng)時(shí)記錄的游戲設(shè)計(jì)的功能需求:1.圖形界面布局(長(zhǎng)方形主框,圖形預(yù)覽,score,Level)2.各種Shape的數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)和隨機(jī)生成3.圖形界面的繪制以及各控件顯示(主圖形、預(yù)覽圖形顯示、score、level、游戲說(shuō)明)4.時(shí)鐘控制圖形更新(主圖的下降)5.圖形的變換控制:↑↓←→控制鍵響應(yīng)6.邊界控制和圖形的保存(Map[27][41

3、])7.消格,得分,升級(jí)圖形變化控制策略:要求對(duì)Shape對(duì)應(yīng)四個(gè)點(diǎn)分別進(jìn)行如下判斷a.“1”代表有方格“0”無(wú)b.下邊有方格停止并保存c.超出左右邊界以及左右格有值(1)不能移動(dòng)d.在變形之前先判斷一下是否滿(mǎn)足前三條,滿(mǎn)足可以變形,不滿(mǎn)足變形失敗簡(jiǎn)單的分析之后就開(kāi)工了,第一步就是簡(jiǎn)單的托下控件,幾分鐘就KO了,然后就是對(duì)Shape數(shù)據(jù)結(jié)構(gòu)的分析,網(wǎng)上搜了一下有7類(lèi)19種,于是在OneNote里面將所有可能都描繪出來(lái)了如下:左邊是7種圖形,右邊是其相對(duì)正方形圖形的偏移量,正方形沒(méi)有變種,左邊其它三類(lèi)圖形有2

4、個(gè)變種,右邊三類(lèi)圖形有4個(gè)變種,加起來(lái)正好19種類(lèi)型,將這些相對(duì)正方形偏移得來(lái)的圖形記錄到二維數(shù)組Shape[19][8]當(dāng)中,然后就是設(shè)法讓這些圖形隨機(jī)生成,簡(jiǎn)單,rand()%19即可,這樣第二部就完成了。接下來(lái)就是想辦法將圖形繪制出來(lái)了,開(kāi)始是基于過(guò)程,寫(xiě)了一大堆代碼來(lái)實(shí)現(xiàn)這個(gè)功能,后來(lái)發(fā)現(xiàn)繪制出來(lái)的圖形還要被擦除,這兩個(gè)功能用到的代碼基本上是一樣的,于是就自己定義了一個(gè)m_DrawImage的成員函數(shù)來(lái)完成圖形的繪制功能。主圖形完了之后,開(kāi)始考慮如何實(shí)現(xiàn)預(yù)覽功能,發(fā)現(xiàn)預(yù)覽的圖形不需要考慮位置的移動(dòng),

5、并重載了一下m_DrawImage實(shí)現(xiàn)了對(duì)預(yù)覽圖形的繪制。接下來(lái)就是想辦法讓圖形動(dòng)起來(lái)了,想到了用時(shí)鐘SetTimer讓它隔一段時(shí)間位置下落一定距離,這里關(guān)鍵是要考慮到如何將之前的圖形擦除,怎么辦呢?其實(shí)只需將之前繪制的圖形保存,并用和背景顏色一致畫(huà)刷繪制就可實(shí)現(xiàn)擦除功能。第五步就是實(shí)現(xiàn)圖形的變換控制了,注意一點(diǎn)對(duì)話(huà)框程序不能直接用WM_KEYDOWN消息來(lái)實(shí)現(xiàn),要用PreTranslateMessage代替。因?yàn)樵趯?duì)話(huà)框程序中,某些特定的消息,例如按鍵消息,它們被Windows內(nèi)部的對(duì)話(huà)框過(guò)程處理了(即在

6、基類(lèi)中完成了處理,可以查看MFC的源代碼),或者被發(fā)送給子控件(獲取焦點(diǎn)的子控件)進(jìn)行處理,所以我們?cè)趯?duì)話(huà)框類(lèi)中就捕獲不到按鍵的消息了。比較傷腦筋的就是第六步了,程序?qū)懙竭@里就要考慮如何保存之前的數(shù)據(jù)以及如何防止方塊出界的問(wèn)題了,問(wèn)題變得越來(lái)越具體,對(duì)數(shù)據(jù)的要求也越來(lái)越精確,這一步我用GetClientRect(&rect)測(cè)量了主窗口的長(zhǎng)和寬并用數(shù)組Map[27][41]將其進(jìn)行了保存。在考慮如何保存方塊位置以及邊界控制的過(guò)程中,為題就出現(xiàn)了,我之前想只用到一個(gè)點(diǎn)坐標(biāo)m_CurPos記錄左上角一個(gè)方塊的位

7、置,然后想根據(jù)其它方塊和它相連的關(guān)系和偏移量Shape的關(guān)系來(lái)卻定所有定的確切位置,在實(shí)現(xiàn)過(guò)程中發(fā)現(xiàn)這樣好繁瑣,每一個(gè)點(diǎn)的表示都有好長(zhǎng)一串代碼,我才意識(shí)到偷懶是不行的,還是必須用四個(gè)點(diǎn)來(lái)記錄每一個(gè)方塊的位置,于是我用PointArray[4]分別記錄了四個(gè)點(diǎn)的坐標(biāo)位置,這樣之后問(wèn)題就明朗了,一個(gè)一個(gè)點(diǎn)去考慮,比起四個(gè)點(diǎn)一起考慮要容易的多,這也是化抽象為具體,分而治之這種最簡(jiǎn)單而又最實(shí)用的方法的強(qiáng)大威力的的再一次證實(shí)。最后就是消格,得分,升級(jí)的問(wèn)題了,有了前面的基礎(chǔ)這些問(wèn)題也都很快沿刃而解了。在第6步的過(guò)程中

8、也產(chǎn)生了最讓我頭疼的Bug,后來(lái)想想這根本就不算是問(wèn)題,都怪自己粗心大意,害自己白忙活一晚上,最開(kāi)始我本來(lái)是對(duì)的Map[27][41]這個(gè)數(shù)組橫坐標(biāo)對(duì)應(yīng)x值,縱坐標(biāo)對(duì)應(yīng)y值,不知道突然哪根筋不對(duì)了,想著要把它改成Map[41][27],41行,27列,對(duì)啊,幸虧及時(shí)糾正,沒(méi)想到這一改差點(diǎn)把我整崩潰了。本來(lái)這么簡(jiǎn)單的問(wèn)題不應(yīng)該看不出來(lái),但是有時(shí)候啊,人的那個(gè)腦袋就是容易產(chǎn)生固定化思維模式,這也是阻礙很多人進(jìn)步的原因

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶(hù)上傳,版權(quán)歸屬用戶(hù),天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶(hù)請(qǐng)聯(lián)系客服處理。