2006 年畢業後從事軟件測試,雖然後來轉向 ASP.NET 開發,但 C++ 始終是心中的一根刺。直到近期,決定用 Win32 API 親手寫一個聯機俄羅斯方塊,以此驗證自己的 C++ 實戰能力。
測試各類窗口風格,最終選用無最大化/最小化按鈕、固定大小的對話框窗口。
放棄圖片與按鈕方案,採用 FillRect() 繪製彩色矩形表示方塊,構建 10×20 的遊戲區。
首次接觸 WM_PAINT 重繪機制,花費兩天才在黑色背景上畫出第一個直條方塊,確立了繪製流程的可行性。
設計 4 維數組 [7][4][4][4] 存儲 7 類方塊的 4 種旋轉狀態,放棄 vector 方案,追求極簡高效。
分離數據與邏輯:Square 提供方塊數據,Gameframe 負責移動、下降、消行、暫停/開始等遊戲流程控制。
摒棄死循環,利用 SetTimer 定時觸發 Game_Down(),通過定時器間隔控制下落速度與等級加速。
完成所有單機邏輯,經測試優化修復嚴重記憶體洩漏,深入理解內存管理。
受同學招聘考核啟發,決定實現網絡對戰。新增 GameNet 類封裝 UDP 通訊,經過通訊小例程驗證後集成,實現:
Gameframe.h 關鍵定義
class Gameframe : public GameNet {
public:
void Draw_Frame(HDC, HWND, HBRUSH); // 重繪主框架
void Draw_Next(HDC, HWND, HBRUSH); // 重繪下一個方塊
void Game_Start(); // 開始遊戲
bool Game_Over(); // 判斷結束
void Game_Run(); // 設置下落定時器
void Game_Down(); // 方塊下落
void Game_Change(); // 方塊變形
bool Game_Move(int); // 方塊移動
bool Game_DelRect(); // 消行算法
// ... 成員變量省略
};
消行算法核心
bool Gameframe::Game_DelRect() {
int del=0, Count=0;
for (short int a=19; a>=Top; a--) {
for (short int b=0; b<10; b++)
if (Gframe[b][a]) del++;
if (del == 10) { // 整行滿
Count++;
// 下移上方所有行
for (; a>=0; a--) { ... }
a = 20; Top++;
}
del = 0;
}
// 計分邏輯
switch(Count) { case 1: Game_Point+=100; break; ... }
return Count>0;
}
這是第一個純 Win32 程序,雖然只是小遊戲,但極大增強了信心。從測試轉開發的路徑雖曲折,但每一步踏實的代碼積累終將匯聚成質變。源碼下載:CSDN