本專案採用多檔案模組化設計,使用 EasyX 圖形庫(VC++ 6.0 環境),包含以下檔案:
head.h:通用定義、常數、資料結構、函數宣告main.cpp:程式進入點、初始化圖形視窗、主迴圈啟動init.cpp:遊戲參數初始化、讀取方塊形狀設定檔GUI.cpp:繪圖邏輯、介面渲染、分數/等級顯示play.cpp:核心遊戲邏輯、方塊移動/旋轉/消行/判斷結束rockshape.ini:方塊形狀點陣設定檔// 方塊形狀:用 unsigned int 低 16 位表示 4x4 點陣
// nextRockIndex 形成靜態循環鏈表,實現旋轉狀態切換
typedef struct ROCK {
unsigned int rockShapeBits;
int nextRockIndex;
} RockType;
// 方塊在視窗中的像素座標(4x4 區塊左上角)
typedef struct LOCATE {
int left, top;
} RockLocation_t;
init.cpp::ReadRockShape()從 rockshape.ini 讀取文字點陣(@=1, #=0),每 4 行一個旋轉狀態,以 ----- 分隔不同方塊類型。解析後存入 rockArray,並建立 nextRockIndex 循環鏈表。
GUI.cpp::DrawRock()使用位元遮罩掃描 16 位點陣,對應繪製 rectangle。參數 displayed 決定顏色(白色顯示/黑色擦除),實現無閃爍動畫(配合 FlushBatchDraw())。
play.cpp::MoveAble()根據方向(上/下/左/右)將方塊像素座標映射到邏輯棋盤 g_gameBoard,檢查目標位置是否為 0(空)。邊界以額外一圈「圍牆」(值為 1)簡化判斷。
ProcessFullRow() / DelFullRow()從底部向上掃描,發現全滿行則:
PlayGame()while (1) {
DrawRock(current, &loc, TRUE); // 繪製當前方塊
FlushBatchDraw();
if (!MoveAble(current, &loc, DOWN)) { // 無法下落
SetOccupyFlag(current, &loc); // 固定到棋盤
// 產生新方塊、重置位置...
}
// 自動下落計時
if (GetTickCount() - oldtime >= 400 - 80*grade && moveAbled) {
DrawRock(current, &loc, FALSE); // 擦除舊位置
loc.top += ROCK_SQUARE_WIDTH; // 下落一格
oldtime = GetTickCount();
}
ProcessFullRow(); // 檢查消行
if (isGameOver()) break; // 判斷結束
if (kbhit()) ProccessUserHit(getch(), ...); // 鍵盤控制
Sleep(20); // 降低 CPU 佔用
}
rockshape.ini 格式@###
@###
@@##
####
@@@#
@###
####
####
... (共 19 種方塊,每種 4 個旋轉狀態)
----- // 方塊類型分隔符
.cpp、.h、.ini 放入同一目錄。rockshape.ini 在工作目錄下。FlushBatchDraw() 消除閃爍,提升視覺體驗。這個專案完整展示了 C 語言在圖形介面、遊戲邏輯、資料結構設計上的綜合應用,是從控制台程式邁向圖形化開發的優秀實戰案例。