放假了,沒回家,租房了,沒網線---俗話說,有電腦不能上網就好比有個老婆而不能上牀.以往自己裝好學生,電腦裏面都不帶安裝遊戲的.甚至附件裏面的紙牌,挖地雷遊戲都被我給刪掉了.現在一不能上網,立馬覺得空虛了.這日子要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 .
有圖有真相:
設置對話框
另外: 有一處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.