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

遊戲核心在於「向某方向移動一格並嘗試合併」。以下為關鍵函數 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 共同完善!