作者在課堂上花費約 1.5 小時編寫了這個 300 行左右的 2048 遊戲,融合了 iOS 版 Threes 和原版 2048 的滑動規則。雖未深度優化,但邏輯完整、可直接編譯運行。
int pane[4][4]; // 4×4 棋盤,0 表示空格
int N = 1; // 記錄當前最大塊的 2 的冪次
判斷兩數之和是否為 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;
}
以 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),作者採用了較簡單的單步合併邏輯。
根據移動方向,在對應邊緣尋找第一個空格放入新數(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; }
}
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();
}
這是一個適合初學者閱讀的完整遊戲專案,展示了控制台遊戲的基本框架:狀態維護、輸入處理、渲染循環、勝負判斷。通過重構可將其提升為教學級示範代碼。