原創 MFC實現的俄羅斯方塊

2021-05-01 00:14:21 字數 3604 閱讀 2812

用mfc

實現的俄羅斯方塊

,上學期期末複習著無聊的時候做出來的

,每天做一點

,最後居然順利做出來

.做了之後才發現

,要做成這個小遊戲

,值得考慮的地方還是很多的

.想了想就有以下的一些細節

,總結起來有以下幾點:

1.關於方塊結構的確定

,最初考慮的是用

4*4的陣列來表示乙個方塊

,但這就意味著每個方塊會造成遠大於自身的儲存空間的浪費

,而且按照這種思路

,方塊每切換一次形狀

,就要對乙個

4*4的陣列資料進行重寫

,時間和空間效率都不高

.在考慮換種表示方法的時候

,突然觀察到

,其實俄羅斯方塊裡的每個方塊都是由

4個格仔組成的

,只要定義乙個大小為

4的結點陣列就能很好的儲存方塊的位置了.於是

node

結構就這樣成了.

typedef struct node

node;

2.有了這個結構之後

,就該考慮如何表示方塊了

,因為使用的是

mfc,

而上學期又系統的學了

c++,

於是考慮了用物件導向的方法來實現這幾個方塊

,從物件導向的角度來看

,這幾個方塊確實具有驚人的相似度,首先

,它們都是由四個格仔組成,其次

,都能由鍵盤可控制移動,然後

,都能通過某個按鍵

(本程式定義用空格

)來切換形態,最後

,也是理所當然的能夠被顯示出來.所以

,我為這些方塊定義了乙個名叫

cbase

的抽象類作為它們的基類

,而由於這些方塊的左右移動和著陸方法都是相同的

,所以在基類中就實現了這幾種方法

,充分體現了物件導向的**重用機制

,最重要的是也省去了寫重複**的麻煩.

class cbase ;

3.有了這個基類後

,方塊類只用重寫繼承來的虛函式就可以

,讓自己成為特定的方塊了

,在重寫這些虛函式時

,最重要的當然是顯示的問題了

,在做這個程式之前

,看見一篇文章

,介紹如何使用無閃爍重繪

,所以就把這種方法用進來了

,其結果就是為了實現無閃爍

,計算了大量的方塊移動後需要重繪的區域

,實在是痛苦

…..好在最後還是把這個功能實現了

.在**裡也可以看到

draw

方法裡面很多行都用在計算座標然後呼叫

invalidaterect()上了.

4.俄羅斯方塊總共有

7種方塊

,每個方塊就對應乙個繼承於

cbase的類.

在這些類中另乙個重要的實現細節就是如何判斷方塊成功著陸了

.在俄羅斯方塊中

,成功著陸分為兩種情況

,第一就是落到最下層的」地面

」上,第二就是落在了其他方塊上面

.顯然這兩種著陸方式是由本質不同的

.如果要成功實現這兩種方式

,至此就必須考慮怎樣把已著陸的方塊和玩家正控制的方塊聯絡起來

.從這個問題出發

,構造了

cbackground類,

已著陸的類就好像背景一般的存在.那麼

,第一種著陸方式就可以直接判斷當前方塊的格仔

y座標是否有和地面相同的

,而第二種著陸

,就判斷當前方塊格仔

y座標是否有和

cbackground

中格仔相同的

.那麼著陸的問題就解決了

.以下便是

cbackground

類class cbackground ;

5.構造這個類

,還考慮其他的一些問題.比如

,1.既然是用於表示已著陸的方塊的類

,那麼關於消去的方法也理所應當在這個類裡面實現

,2.當前方塊成功著陸後

,就由當前方塊變成了

cbackground

的組成,getnode()

負責完成這個轉變3.當

cbackground

中的某個節點的

y座標到某指定值時

,就應該意味著遊戲結束了

.4.關於計分

,首先在這個類中記錄消去次數然後把這個次數傳給乙個

ccounter

計數器來統計和顯示當前分值

,個人設定的公式就是

10*消去次數.

6.這些自定義類完成後

,程式也到了最後階段了

,那就是在

mfc中使用的問題.首先

,在cmainframe

類中新增

wm_getminmaxinfo訊息,

在訊息響應函式中

,把視窗的大小固定成了

300*400;接著,

為cview

類新增一系列將要使用的物件

,其中有

cbase

類指標m_pbase,

通過這個指標

,就可以

new出不同的方塊了.

7.說到方塊的產生

,就不得不提另乙個問題了

.俄羅斯方塊中方塊的產生都是隨機的

,每次執行遊戲產生的方塊都有可能不同

.這是一種真的隨機,而

random()

函式產生的卻都是偽隨機數

,每次執行產生的結果是固定的

,不符合要求.於是

,考慮了用讀取系統時間值並對

7取模的方式來產生編號為

0—6的方塊

,這樣就模擬出了需求的隨機效果.

8.對於俄羅斯方塊這個遊戲的描述應該是

,開啟遊戲後

,有各種下落的方塊

,並能顯示下乙個出現的方塊

,使用者可以控制當前方塊直到它著陸

,控制包括左右移動快速下移以及切換形態

,當方塊成功著陸後

,控制下乙個方塊

,如此迴圈

.當一行充滿格仔時

,該行被削去

,增加計分值.

當方塊累積到一定高度時遊戲結束

.能清晰描述後

,該遊戲的需求分析就完了,對於

cview

部分的**

,就是這些功能的具體實現.

9.最後要說一下演算法的問題

,在寫消去演算法的時候

,本來為了簡化

,我把多行的消去考慮為一行消去的遞迴形式

,本來覺得這種考慮是正確的

,起初也沒有出現問題

,但在某一次玩的時候

,居然出現了消不動的情況

,經過幾次測試才發現

,最早的演算法是判斷與當前方塊著陸點有關的行數是否滿足消去條件

,然後逐行遞迴消去

.但是俄羅斯方塊也可以隔行消去,比如

3行5行滿足消去條件而

4行不滿足

,由於考慮不足

,出問題是自然的了

.在改進之後

,我採用了記錄與當前方塊著陸點相關的

4行並判斷它們是否滿足消去條件.

MFC 俄羅斯方塊

提取碼 a2a3 一 定義了一些結構體和常量 每個俄羅斯方塊 block 由4個正方形 pston 組成,乙個正方形 pston 的定義如下 typedef struct pston ty pston 定義乙個俄羅斯方塊 block 包含了4個正方形pst,及顏色屬性color,距離左l與頂t的位置...

mfc筆記 俄羅斯方塊

一年前剛學完 c就很想寫俄羅斯方塊。自己看了點 windows 程式設計的書。但是因為沒有學 c 對 class 完全沒有概念。隨便乙個 point 的物件就可以搞到頭暈都沒懂。現在寫完 painter 來寫俄羅斯方塊頓覺清晰很多。1 將乙個字串寫到螢幕指定位置。bool textout hdchd...

俄羅斯方塊高階 AI俄羅斯方塊

前文回顧 致青春 python實現俄羅斯方塊 人工智慧大火的今天,如果還是自己玩俄羅斯方塊未免顯得太low,為什麼不對遊戲公升級,讓機器自己去玩俄羅斯方塊呢?有了這個想法之後利用週六週日兩天的時間去蒐集了大量的資料,在電腦宕機好多次之後終於將ai俄羅斯方塊實現了。所謂讓機器自己去玩俄羅斯方塊,就是讓...