首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言圖形程式設計:俄羅斯方塊完整實現(二)原始碼全解析

     編輯:關於C語言

專案架構

本專案採用多檔案模組化設計,使用 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;

關鍵模組解析

1. 形狀載入 init.cpp::ReadRockShape()

從 rockshape.ini 讀取文字點陣(@=1, #=0),每 4 行一個旋轉狀態,以 ----- 分隔不同方塊類型。解析後存入 rockArray,並建立 nextRockIndex 循環鏈表。

2. 繪圖核心 GUI.cpp::DrawRock()

使用位元遮罩掃描 16 位點陣,對應繪製 rectangle。參數 displayed 決定顏色(白色顯示/黑色擦除),實現無閃爍動畫(配合 FlushBatchDraw())。

3. 移動合法性檢查 play.cpp::MoveAble()

根據方向(上/下/左/右)將方塊像素座標映射到邏輯棋盤 g_gameBoard,檢查目標位置是否為 0(空)。邊界以額外一圈「圍牆」(值為 1)簡化判斷。

4. 消行邏輯 ProcessFullRow() / DelFullRow()

從底部向上掃描,發現全滿行則:

  1. 以黑色矩形覆蓋擦除該行像素。
  2. 將上方所有行在邏輯陣列與畫面上整體下移一格。
  3. 更新分數(每行 +10),每 100 分升級(最高 5 級),下落加速。

5. 遊戲主迴圈 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 個旋轉狀態)
-----  // 方塊類型分隔符

編譯與執行

  1. 安裝 EasyX 庫(https://www.easyx.cn)。
  2. 將所有 .cpp、.h、.ini 放入同一目錄。
  3. 用 VC++ 6.0 或 Visual Studio 開啟專案編譯(需設定字元集為「多位元組」)。
  4. 執行時確保 rockshape.ini 在工作目錄下。

技術亮點總結

  • 位元點陣壓縮:16 位整數存 4x4 形狀,極致節省記憶體並加速碰撞檢測。
  • 靜態循環鏈表:陣列實現旋轉狀態循環,兼具隨機存取與 O(1) 狀態切換。
  • 雙重緩衝繪圖:FlushBatchDraw() 消除閃爍,提升視覺體驗。
  • 資料驅動設計:方塊形狀外置設定檔,無需重編譯即可擴充新方塊。

這個專案完整展示了 C 語言在圖形介面、遊戲邏輯、資料結構設計上的綜合應用,是從控制台程式邁向圖形化開發的優秀實戰案例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved