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

2048 遊戲 C++ 控制台版完整源碼分享與解析

     編輯:C++ 入門

專案背景

作者在課堂上花費約 1.5 小時編寫了這個 300 行左右的 2048 遊戲,融合了 iOS 版 Threes 和原版 2048 的滑動規則。雖未深度優化,但邏輯完整、可直接編譯運行。

核心數據結構

int pane[4][4];  // 4×4 棋盤,0 表示空格
int N = 1;       // 記錄當前最大塊的 2 的冪次

關鍵算法模塊

1. 合併判斷:if2n()

判斷兩數之和是否為 2 的冪次,同時更新全局最大冪次 N:

int if2n(int x) {
    for (int n = 1; n <= 11; n++)
        if (x == pow(2, n)) {
            if (n > N) N = n;
            return 1;
        }
    return 0;
}

2. 四向移動與合併

以 upmove() 為例,採用「先合併再下沉」的簡化邏輯:

int upmove() {
    int flag = 0;
    for (int j = 0; j < 4; j++)
        for (int i = 0; i < 3; i++)
            if (if2n(pane[i][j] + pane[i+1][j])) {
                pane[i][j] += pane[i+1][j];
                pane[i+1][j] = 0;
                flag = 1;
            }
    return flag;
}

注意:這裡未處理「連續合併」的標準 2048 規則(如 2,2,4 向上應先合併成 4,4 再合併成 8),作者採用了較簡單的單步合併邏輯。

3. 新數生成策略

根據移動方向,在對應邊緣尋找第一個空格放入新數(2 的 N 次方以內隨機):

void addnewnumberup() {
    srand(time(NULL));
    int n = (N == 1) ? 1 : (rand() % N + 1);
    int newnumber = pow(2, n);
    for (int i = 3; i >= 0; i--)
        for (int j = 0; j < 4; j++)
            if (pane[i][j] == 0) { pane[i][j] = newnumber; return; }
}

4. 輸入處理:_getch() 讀取方向鍵

Windows 控制台下方向鍵會產生兩個字符(0xE0 + 碼),需雙次讀取:

int GetDirection() {
    int ret = 0, ch;
    do {
        ch = _getch();
        if (isascii(ch)) continue;
        ch = _getch();
        switch (ch) {
            case 72: ret = 2; break;  // 上
            case 75: ret = 1; break;  // 左
            case 77: ret = 3; break;  // 右
            case 80: ret = 4; break;  // 下
        }
    } while (ret == 0);
    return ret;
}

主循環邏輯

while (ifwin() + ifGameOver() == 0) {
    int c = GetDirection();
    switch (c) {
        case 2: upmove(); addnewnumberup(); break;
        case 4: downmove(); addnewnumberdown(); break;
        case 1: leftmove(); addnewnumberleft(); break;
        case 3: rightmove(); addnewnumberright(); break;
    }
    system("cls"); showpane();
}

改進建議

  • 合併邏輯:應實現標準 2048 的「滑動至邊緣 → 同向合併 → 再次滑動」三階段流程;
  • 隨機數種子:每次生成新數都調用 srand(time(NULL)) 會導致同一秒內生成相同數,應僅在程序啟動時調用一次;
  • 跨平台:conio.h、system("cls")、Sleep() 均為 Windows 專用,移植時需替換;
  • 代碼復用:四向操作高度相似,可抽象為統一的「向量旋轉 + 單向處理」模式,大幅減少重複代碼。

總結

這是一個適合初學者閱讀的完整遊戲專案,展示了控制台遊戲的基本框架:狀態維護、輸入處理、渲染循環、勝負判斷。通過重構可將其提升為教學級示範代碼。

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