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
| 函數 | 用途 |
|---|---|
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 連帶釋放緩衝區 |