gint man_count = 0, comp_count = 0; // 雙方點數和
gboolean man_end = FALSE, comp_end = FALSE; // 停牌標誌
gboolean gameover = FALSE; // 遊戲結束標誌
gboolean = gint,取值 TRUE/FALSE,語義更清晰。
GRand *rand = g_rand_new();
do {
// === 玩家回合 ===
if (!man_end) {
g_print("%s,按 Y/y 抽牌,其他鍵停牌!\n", name);
int key = getchar(); getchar(); // 吸收換行
if (key == 'y' || key == 'Y') {
gint card = g_rand_int_range(rand, 1, 11);
man_count += card;
g_print("%s,您抽到:%d\n", name, card);
} else {
g_print("玩家停牌!\n");
man_end = TRUE;
}
}
// === 電腦回合:簡單策略 ≤17 必抽 ===
if (comp_count <= 17) {
gint card = g_rand_int_range(rand, 1, 11);
comp_count += card;
g_print("電腦抽到:%d\n", card);
} else {
g_print("電腦停牌!\n");
comp_end = TRUE;
}
// === 勝負判定 ===
if ((man_count > 21 && comp_count > 21) ||
(man_count == 21 && comp_count == 21)) {
g_print("平局:雙方 %d 點\n", man_count);
gameover = TRUE;
}
else if (man_count > 21 && comp_count <= 21) {
g_print("電腦勝:電腦 %d,%s %d\n", comp_count, name, man_count);
gameover = TRUE;
}
else if (man_count <= 21 && comp_count > 21) {
g_print("%s 勝:電腦 %d,%s %d\n", name, comp_count, man_count);
gameover = TRUE;
}
else if (man_end && comp_end) { // 雙方均停牌,比較點數
if (man_count > comp_count)
g_print("%s 勝:電腦 %d,%s %d\n", name, comp_count, man_count);
else
g_print("電腦勝:電腦 %d,%s %d\n", comp_count, name, man_count);
gameover = TRUE;
}
else {
g_print("--- 本輪結束:電腦 %d,%s %d ---\n", comp_count, name, man_count);
}
} while (!gameover);
g_rand_free(rand);
$ ./21dian
您叫什麼名字?
麥好
歡迎您,麥好,這裡是 21 點遊戲
麥好,按 Y/y 抽牌,其他鍵停牌!
y
麥好,您抽到:7
電腦抽到:10
--- 本輪結束:電腦 10,麥好 7 ---
麥好,按 Y/y 抽牌,其他鍵停牌!
Y
麥好,您抽到:1
電腦抽到:9
--- 本輪結束:電腦 19,麥好 8 ---
...
電腦勝:電腦 19,麥好 25
硬編碼「≤17 必抽,≥18 停牌」,模擬莊家固定規則。可擴展為:根據玩家已知點數動態決策、引入概率模型等。
遊戲狀態:進行中 → 玩家停牌/電腦停牌/爆牌 → 結束。用 gboolean 組合表示,清晰低耦合。
draw_card()、judge_result()、print_status() 函數struct Player { gint count; gboolean end; gchar *name; } 統一玩家/電腦邏輯GString 記錄歷史抽牌序列(下節實現)本節完成遊戲核心循環:雙方輪流行動、簡單 AI 決策、完整勝負判斷邏輯。代碼雖為過程式風格,但展示了 GLib 類型系統(gint、gboolean、GRand)在實際項目中的應用模式。