俄羅斯方塊第二版

放假了,沒回家,租房了,沒網線---俗話說,有電腦不能上網就好比有個老婆而不能上牀.以往自己裝好學生,電腦裏面都不帶安裝遊戲的.甚至附件裏面的紙牌,挖地雷遊戲都被我給刪掉了.現在一不能上網,立馬覺得空虛了.這日子要TMD怎麼過啊.人總不能一心煩一空虛就去拿關係代數和微積分解悶吧.

突然想起來自己是寫過一個俄羅斯方塊的,可以拿出來湊合着.翻出來代碼編譯一下,一看那代碼寫的噁心的半天沒有喫下飯.那名字就起得噁心至極:RusiaBlock,感覺真傻啊,跟我黨某某部門的門牌有一比了:police wind 叫警風;記得當時寫好那份代碼的時候,自己還得意了好幾天的.專門寫了3篇教程以宣揚自己的才華蓋世(MFC 實現 俄羅斯方塊  >MFC實現俄羅斯方塊二>MFC 實現俄羅斯方塊三....).以爲像高中語文老師說的一樣:"老子天下第一了!",沒有想到現在自己把自己噁心到了.罪過罪過

本來以爲已經有了經驗,修改一下代碼而已,應該是很容易的.但是重寫的過程中仍然遇到不少問題.

1>幾乎所有的繪圖操作都被重寫了.寒啊.

2>變量名函數名改寫了一個遍.

3>以前繪圖操作是每次都重繪所有遊戲區域.現在則是哪兒需要繪製哪兒的.

4>現在遊戲區域可以繪製到任何gui窗口上,比如按鈕什麼的.只要你願意控制.

5>簡化了接口,只需要這些地方調用.

OnEraseBkgnd—>DrawRectBlock

OnTimer—>OnTimer

OnKeyDown-->OnKeyDown,

然後其他的就是設置了背景什麼的了.一開始在想有沒有必要封裝得成這樣子.畢竟一個俄羅斯方塊而已又不需要像通用控件一樣重用,但是後來一想:既然可以封裝成這樣子爲什麼不封裝?反正沒有壞處.而且在一個窗口上畫兩個區域同時遊戲,也挺有意思的.

6>去掉了計分操作,手動SetLevel()設置升級,最大定義的是7級吧,想計分,可以在CheckFulLines()中計數,score++就好了

7> 簡化了一下隨機生成物塊的函數,現在不能生成 "T" 形狀了.想生成什麼形狀自己折騰一下下面這個函數,理論上是可以生成任意形狀的...

void CTetrics::GenerateTetric(TETRICS& tetric) 
{ 
    tetric.pane[0].row = tetric.pane[3].row = -1; 
    tetric.pane[0].col = tetric.pane[3].col = m_nCols/2; 
    int x = -2,y = -2; 
    int c; 
    for (int i = 1; i <= 3; i++) 
    { 
        c = i-1; 
        MakeRandomOffset(x,y);  
 
        if (rand()%8 == 4 && i == 2) // 沒啥意思,只是想生成的樣式更多一些 
        { 
            c = 1; 
        } 
        tetric.pane[i].row = tetric.pane[c].row + x; 
        tetric.pane[i].col = tetric.pane[c].col + y; 
    } 
    tetric.clrBody = RANDOM_COLOR; 
    tetric.clrBoder = RANDOM_COLOR; 
    UpdateBoundry(tetric); 
}
 

8> 本來想再寫一下GameOver成動畫的.但是想想算了.費那個勁已經沒有意義了.於是直接用一個老土的AfxMessageBox(_T(“Game Over!”))搞定..等我把openGL 學好了再寫一個版本.話說這學期的<計算機圖形學>老子交的可是白卷!!!爲什麼我非要學這個東西?我擦!

使用:,創建CTetrics對象,調用SetTetrics,其他幾個Set*可以設置背景和網格等.StartGame

公用接口:

void SetTetrics(HWND hWnd, CRect& rcBound,int nRows, int nCols); 
void SetGrids(COLORREF clrGridLine, BOOL bShowGridLine);
// 設置背景:使用位圖或者純色,bUseImage決定使用哪種方式,如果使用位圖,則pBmpBk一定要是正確的位圖對象指針 
    void SetBackground(CBitmap *pBmpBk,COLORREF clrBK,BOOL bUseImage=TRUE);
 
void DrawRectBlock(CDC* pDC, const CRect& rc); // 繪製遊戲區域哪個部分. 
    void StartGame(int nLevel); 
    void PauseGame(void); // 暫停 
    void StopGame(void); // 停止,不可恢復 
    void SetLevel(int nLevel); // 升級 
    void OnTimer(int nIDTimer); // 自動下落 
    void ResumeGame(void); // 暫停恢復 
    void OnKeyDown(UINT nChar); // 方向鍵控制,shift是暫停,空格是快速下落 
    BOOL IsPause(void); // ...
 

起了個天時地利人和的名字 : QTetrics .

有圖有真相:

2009-07-06_113443

設置對話框

2009-07-06_104636

另外: 有一處72bytes長的內存泄漏,檢查了好久沒有檢查出來.煩請有興趣的童鞋調試下,調試好了告我一聲.多謝多謝.這個代碼就先告一段落吧,還有很多事情要做.Email:[email protected]

Detected memory leaks!
Dumping objects ->
{209} normal block at 0x00C3B040, 72 bytes long.
Data: <    H           > B8 B0 C3 00 48 B6 C3 00 08 B7 C3 00 C8 B7 C3 00

 

ByeBye.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章