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

GLib 實戰:21 點遊戲核心邏輯(二)——輪流抽牌與勝負判定

     編輯:關於C語言

核心數據結構

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 停牌」,模擬莊家固定規則。可擴展為:根據玩家已知點數動態決策、引入概率模型等。

勝負判定優先級

  1. 雙方均爆牌 或 均恰好 21 → 平局
  2. 玩家爆牌且電腦未爆 → 電腦勝
  3. 電腦爆牌且玩家未爆 → 玩家勝
  4. 雙方均停牌 → 點數大者勝
  5. 否則 → 進入下一輪

狀態機視角

遊戲狀態:進行中 → 玩家停牌/電腦停牌/爆牌 → 結束。用 gboolean 組合表示,清晰低耦合。

代碼結構優化建議

  • 提取 draw_card()、judge_result()、print_status() 函數
  • 定義 struct Player { gint count; gboolean end; gchar *name; } 統一玩家/電腦邏輯
  • 使用 GString 記錄歷史抽牌序列(下節實現)

總結

本節完成遊戲核心循環:雙方輪流行動、簡單 AI 決策、完整勝負判斷邏輯。代碼雖為過程式風格,但展示了 GLib 類型系統(gint、gboolean、GRand)在實際項目中的應用模式。

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