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

2048 遊戲 C 語言終端機版完整原始碼與邏輯解析

     編輯:關於C語言

經典 2048 遊戲:4×4 終端機純 C 實作

2048 是款風靡全球的數字合併遊戲。本文提供完整可編譯的 C 原始碼,在標準終端機(Windows conio.h、Linux ncurses 皆可移植)上運行,支援 WASD 方向鍵控制、分數統計、遊戲結束判定。

核心資料結構

int board[4][4] = {0};   // 4×4 棋盤,0 代表空格
int temp[5];             // 暫存單行/單列資料(含哨兵)
int score = 0;           // 累計分數
int moves = 0;           // 移動步數

關鍵演算法:單向滑動與合併 add()

將一行/列壓縮至 temp[4],temp[4]=0 作哨兵:

  1. 去零:將非零數字前移,中間不留空隙
  2. 合併:從前向後掃描,相鄰相等則合併(前者×2,後者歸零),分數累加
  3. 再去零:合併後再次前移
int add(void) {
    int changed = 0, t = 0;
    // 階段 1:去零
    do {
        for (int i=0;i<4;++i) if (temp[i]==0 && temp[i]!=temp[i+1]) {
            temp[i]=temp[i+1]; temp[i+1]=0; changed=1;
        }
    } while (++t < 4);
    // 階段 2:合併
    for (int i=1;i<4;++i) if (temp[i]==temp[i-1] && temp[i]!=0) {
        temp[i-1]*=2; score+=temp[i-1]; temp[i]=0; changed=1;
    }
    // 階段 3:再去零(同上)
    t=0;
    do {
        for (int i=0;i<4;++i) if (temp[i]==0 && temp[i]!=temp[i+1]) {
            temp[i]=temp[i+1]; temp[i+1]=0; changed=1;
        }
    } while (++t < 4);
    return changed;
}

四個方向統一處理

透過索引映射將「上、下、左、右」統一轉為「左向」邏輯:

  • 上 (W):逐列取出 temp[i]=board[i][col] → add() → 寫回
  • 下 (S):temp[i]=board[3-i][col] 反序取出 → add() → 反序寫回
  • 左 (A):逐行取出 temp[j]=board[row][j] → add() → 寫回
  • 右 (D):temp[j]=board[row][3-j] 反序 → add() → 反序寫回

主迴圈與隨機生成

while (!gameover) {
    if (changed) {  // 僅在棋盤變化時生成新數
        do { r=rand()%4; c=rand()%4; } while (board[r][c]);
        board[r][c] = (rand()%4==0) ? 4 : 2;  // 25% 機率生成 4
        moves++;
    }
    print_board();
    switch (getch()) {
        case 'w': case 'W': slide_up(); break;
        case 's': case 'S': slide_down(); break;
        case 'a': case 'A': slide_left(); break;
        case 'd': case 'D': slide_right(); break;
        case '0': exit(0);
    }
    // 檢查是否全滿且無法合併
    gameover = 1;
    for (int i=0;i<4;++i) for (int j=0;j<4;++j) if (!board[i][j]) gameover=0;
}
printf("Game Over! 分數:%d 步數:%d\n", score, moves);

跨平台編譯提示

  • Windows (MSVC/MinGW):直接編譯,需 conio.h、system("cls")
  • Linux/macOS:將 getch() 改用 ncurses 或 termios 非緩衝輸入;system("clear") 替換 cls

擴充建議

  • 加入「撤銷」功能(儲存歷史棋盤快照)
  • 支援 2048→4096→8192 持續遊戲
  • 引入啟發式 AI(Expectimax)實現自動遊玩

完整原始碼約 150 行,結構清晰,適合 C 語言初學者研讀陣列操作、隨機數、終端機控制等核心技巧。

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