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

GLib 進階:GString 動態字符串優化 21 點遊戲(三)——歷史記錄與細節展示

     編輯:關於C語言

GString 核心優勢

GString 封裝動態字符串,自動管理內存擴容,成員:

  • gchar *str:C 字符串指針(含結束符)
  • gsize len:當前長度(不含結束符)
  • gsize allocated_len:已分配容量

核心 API:g_string_new()、g_string_append_printf()、g_string_free()。

引入歷史記錄

GString *man_hist = g_string_new("玩家抽到的牌: ");
GString *comp_hist = g_string_new("電腦抽到的牌: ");

// 玩家抽牌後
g_string_append_printf(man_hist, "%d ", card);

// 電腦抽牌後
g_string_append_printf(comp_hist, "%d ", card);

// 每輪結束顯示
g_print("$$$$ 本輪結束,雙方明細 $$$$\n");
g_print("%s\n", man_hist->str);
g_print("%s\n", comp_hist->str);

完善勝負判定邏輯

// 平局擴展:雙方均≤21且點數相等且均停牌
if ((man_count > 21 && comp_count > 21) ||
    (man_count <= 21 && comp_count <= 21 && man_count == comp_count && man_end && comp_end)) {
    g_print("平手:電腦 %d,%s %d\n", comp_count, name, man_count);
    gameover = TRUE;
}
// 電腦勝:玩家爆牌&電腦未爆,或 電腦恰好21&玩家<21
else if ((man_count > 21 && comp_count <= 21) || (man_count < 21 && comp_count == 21)) {
    g_print("電腦勝:電腦 %d,%s %d\n", comp_count, name, man_count);
    gameover = TRUE;
}
// 玩家勝:電腦爆牌&玩家未爆,或 玩家恰好21&電腦<21
else if ((man_count <= 21 && comp_count > 21) || (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) {
    (man_count > comp_count) ?
        g_print("%s 勝:電腦 %d,%s %d\n", name, comp_count, man_count) :
        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);
}

資源釋放

g_string_free(man_hist, TRUE);  // TRUE = 同時釋放字符串緩衝區
g_string_free(comp_hist, TRUE);
g_rand_free(rand);

運行演示

$ ./21dian
您叫什麼名字?
myhaspl
歡迎您,myhaspl,這裡是 21 點遊戲
myhaspl,按 Y/y 抽牌,其他鍵停牌!
y
myhaspl,您抽到:8
電腦抽到:8
$$$$ 本輪結束,雙方明細 $$$$
玩家抽到的牌: 8 
電腦抽到的牌: 8 
--- 電腦 8,myhaspl 8 ---
myhaspl,按 Y/y 抽牌,其他鍵停牌!
n
玩家停牌!
電腦抽到:1
$$$$ 本輪結束,雙方明細 $$$$
玩家抽到的牌: 8 
電腦抽到的牌: 8 1 
--- 電腦 9,myhaspl 8 ---
電腦抽到:7
...
電腦勝:電腦 18,myhaspl 8

GString 進階用法速查

總結

引入 GString 解決了「每輪只顯示最新牌」的痛點,實現完整歷史記錄動態增長。代碼結構更清晰,勝負判定邊界條件更完備。下一步可封裝玩家對象、引入文件存檔、添加圖形界面(GTK)等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數用途
g_string_new(init)創建,可選初始內容
g_string_append(str, text)追加字符串
g_string_append_printf(str, fmt, ...)格式化追加(最常用)
g_string_prepend(str, text)前綴追加
g_string_erase(str, pos, len)刪除子串
g_string_truncate(str, len)截斷長度
g_string_free(str, free_segment)釋放,free_segment=TRUE 連帶釋放緩衝區