四、改造21點游戲
1、引入字符串類型
GString結構包含了三個成員:保存字符串當前狀態的C字符串,除了結束符的字符串長度,和為字符串當前分配的內存數量。如果字符串增加到超出分配的內存長度,GString會自動為其分配更多內存。
typedef struct
{
gchar *str;
gsize len;
gsize allocated_len;
} GString;
在玩家和電腦抽數後,僅顯示本次抽到的數字,需要在每次抽取後顯示所有的數字,使用Gstring完成含有多個數字的字符串的動態生成。創建一個新GString的一種方式是利用g_string_new(),使用g_string_append_printf(),它將附加格式化的字符串到GString的結尾,並保持當前內容不變。
dp@dp:~/gliblearn % cat 21dian.c
#include
#include
#include
//code:[email protected]
//date:2014-01-26
//未經作者書面許可,請勿用於任何用途
int main(int argc, char *argv[]){
setlocale(LC_ALL,"");
GString *man_list;
GString *comp_list;
man_list=g_string_new("玩家抽到的數字: ");
comp_list=g_string_new("電腦抽到的數字: ");
GRand *gamerand;
gchar gamename[10];
g_print("您叫什麼名字?\n");
scanf("%s",&gamename);
g_print("歡迎您,%s,這裡是21點游戲\n",gamename);
setbuf(stdin,NULL);
gint key=0;
gint rndnumber;
gint man_number,comp_number;
gint man_count=0,comp_count=0;
gboolean man_end=FALSE,comp_end=FALSE;
gboolean gameover=FALSE;
gamerand = g_rand_new();
do{
if (!man_end){
g_print("%s,按Y/y鍵抽數字,按其它鍵表示不再抽數字!\n",gamename);
key=getchar();
getchar();
//玩家抽數字
if (key=='y'||key=='Y'){
rndnumber=g_rand_int_range(gamerand,1,11);
man_number=rndnumber;
man_count+=man_number;
g_string_append_printf(man_list,"%d ",man_number);
g_print("%s,您抽到的是:%d\n",gamename,man_number);
}else
{
g_print("玩家放棄抽數!\n",comp_number);
man_end=TRUE;
}
}
//電腦抽數字
if (comp_count<=17){
rndnumber=g_rand_int_range(gamerand,1,11);
comp_number=rndnumber;
comp_count+=comp_number;
g_string_append_printf(comp_list,"%d ",comp_number);
g_print("電腦抽到的是:%d\n",comp_number);
}else
{
g_print("電腦放棄抽數!\n",comp_number);
comp_end=TRUE;
}
g_print("$$$$$$本輪結束,雙方明細$$$$$$\n");
g_print("%s\n",man_list->str);
g_print("%s\n",comp_list->str);
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,gamename,man_count);
gameover=TRUE;
}
else if ((man_count>21 && comp_count<=21)||(man_count<21 && comp_count==21)) {
g_print("電腦贏了,電腦%d點,%s %d點\n",comp_count,gamename,man_count);
gameover=TRUE;
}
else if ((man_count<=21 && comp_count>21) ||(man_count==21 && comp_count<21)) {
g_print("玩家贏了,電腦%d點,%s %d點\n",comp_count,gamename,man_count);
gameover=TRUE;
}
else if (man_end && comp_end){
man_count>comp_count?g_print("玩家贏了,電腦%d點,%s %d點\n",comp_count,gamename,man_count):g_print("電腦贏了,電腦%d點,%s %d點\n",comp_count,gamename,man_count);
gameover=TRUE;
}
else
{
g_print("\n$$$$$$電腦%d點,%s %d點$$$$$$\n",comp_count,gamename,man_count);
}
}while(!gameover);
g_string_free(man_list,TRUE);
g_string_free(comp_list,TRUE);
g_rand_free(gamerand);
return 0;
}
dp@dp:~/gliblearn % ./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
$$$$$$本輪結束,雙方明細$$$$$$
玩家抽到的數字: 8
電腦抽到的數字: 8 1 7
$$$$$$電腦16點,myhaspl 8點$$$$$$
電腦抽到的是:2
$$$$$$本輪結束,雙方明細$$$$$$
玩家抽到的數字: 8
電腦抽到的數字: 8 1 7 2
$$$$$$電腦18點,myhaspl 8點$$$$$$
電腦放棄抽數!
$$$$$$本輪結束,雙方明細$$$$$$
玩家抽到的數字: 8
電腦抽到的數字: 8 1 7 2
電腦贏了,電腦18點,myhaspl 8點