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

C 語言實現 2048 遊戲:核心邏輯與代碼解析

     編輯:關於C語言

專案簡介

利用業餘時間用 C 語言復刻經典 2048 遊戲。操作方式:方向鍵移動、R 重新開始、Esc 退出。代碼尚在優化中,可能存在 Bug,歡迎指正。

界面截圖

2048 遊戲界面

核心邏輯:單步移動與合併

遊戲核心在於「向某方向移動一格並嘗試合併」。以下為關鍵函數 MoveOneStep 邏輯重構:

BOOL MoveOneStep(int i1, int j1, int i2, int j2, UINT32 *uData) {
    UINT32 uNextData = GetByPosition(i2, j2);

    // 目標格為空:直接移動
    if (uNextData == 0) {
        SetAddMatByPosition(i2, j2, GetAddMatByPosition(i1, j1));
        SetAddMatByPosition(i1, j1, FALSE);
        SetByPosition(i1, j1, 0);
        SetByPosition(i2, j2, *uData);
        return TRUE;
    }

    // 目標格非空且雙方均未合併過且數值相等:合併
    if (!GetAddMatByPosition(i1, j1) && !GetAddMatByPosition(i2, j2) && *uData == uNextData) {
        *uData *= 2;
        SetByPosition(i1, j1, 0);
        SetByPosition(i2, j2, *uData);
        SetAddMatByPosition(i2, j2, TRUE); // 標記本回合已合併
        return TRUE;
    }

    return FALSE; // 無法移動或合併
}

單方向持續移動

MoveOneUp 循環調用 MoveOneStep,直到無法移動為止:

BOOL MoveOneUp(int i, int j) {
    BOOL bHasMoved = FALSE;
    UINT32 uData = GetByPosition(i, j);
    if (uData == 0) return FALSE;

    while (i > 0) {
        if (!MoveOneStep(i, j, i - 1, j, &uData)) break;
        bHasMoved = TRUE;
        i--;
    }
    return bHasMoved;
}

處理用戶輸入:向上滑動示例

cmdUp 遍歷所有格子,調用 MoveOneUp,若有移動則生成新數字並刷新界面:

void cmdUp() {
    int i, j;
    BOOL bHasMoved = FALSE;
    if (!BeforeMove()) return; // 備份當前狀態供撤銷用

    for (i = 0; i < SIZE; i++) {
        for (j = 0; j < SIZE; j++) {
            if (MoveOneUp(i, j)) bHasMoved = TRUE;
        }
    }

    if (bHasMoved) AfterMove(); // 生成新數字、檢查勝負、重繪
}

其他方向實現提示

  • 向下:i 從 SIZE-2 遞減至 0,調用 MoveOneDown。
  • 向左/向右:交換雙重循環順序,調用對應 MoveOneLeft/Right。

待優化方向

  • 動畫過渡效果(目前瞬間跳變)。
  • 分數統計、最高分記錄持久化。
  • 撤銷功能(已預留 BeforeMove/AfterMove 鉤子)。
  • 跨平台圖形庫替換(現依賴特定環境)。

結語

這是一個練習 C 語言指標、二維數組操作、遊戲邏輯封裝的小專案。完整代碼可在文章末尾下載鏈接獲取。歡迎 Fork、Star、提 Issue 共同完善!

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