C指针原理(75)-GLIB
2014-01-26 16:18
441 查看
四、改造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 <glib.h>
#include <stdio.h>
#include <locale.h>
//code:myhaspl@myhaspl.com
//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点
1、引入字符串类型
GString结构包含了三个成员:保存字符串当前状态的C字符串,除了结束符的字符串长度,和为字符串当前分配的内存数量。如果字符串增加到超出分配的内存长度,GString会自动为其分配更多内存。
typedef struct
{
gchar *str;
gsize len;
gsize allocated_len;
} GString;
麦好的AI乐园博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
在玩家和电脑抽数后,仅显示本次抽到的数字,需要在每次抽取后显示所有的数字,使用Gstring完成含有多个数字的字符串的动态生成。创建一个新GString的一种方式是利用g_string_new(),使用g_string_append_printf(),它将附加格式化的字符串到GString的结尾,并保持当前内容不变。dp@dp:~/gliblearn % cat 21dian.c
#include <glib.h>
#include <stdio.h>
#include <locale.h>
//code:myhaspl@myhaspl.com
//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;
}
麦好的AI乐园博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
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点
相关文章推荐
- C指针原理(74)-GLIB
- C指针原理(50)-C语言-GLIB
- C指针原理(72)-GLIB
- C指针原理(40)-GLIB
- C指针原理(73)-GLIB
- 智能指针的原理及实现方案
- C指针原理(52)-Ncurses-文本终端的图形
- C指针原理(56)-Ncurses-文本终端的图形
- C指针原理(58)-Ncurses-文本终端的图形
- HashMap的原理,底层数据结构,rehash的过程,指针碰撞问题
- C指针原理(90)-LINUX应用(4)-带超时处理的tcp服务
- 智能指针的实现及原理
- 智能指针原理与简单实现
- 智能指针的原理及实现
- C指针原理(37)-gtk
- 讲解指向指针的指针传值原理。
- C指针原理(39)-编译基本原理-语法树及其实现
- ARC原理及强弱指针
- Android之chromimu和webkit的智能指针的原理
- C语言的指针、链表的原理