#include#include #include #include #include #include #include //定义玩家结构体 typedef struct _PLAYERS { char name[17]; //玩家名 int coin; //玩家金币数 bool guess; //玩家出币的正反 }Players; //设置参数结构体 typedef struct _SETTINGS { int coin; //初始金币数 char name0[17]; //电脑玩家的名字 char name1[17]; //人类玩家的名字 }Settings; void menu(char * menuch); //菜单函数 void init(Players * player, Settings * settings); //初始化函数 void setup(Players * player, Settings * settings); //设置 void deenter(char * ch); //去除字符串中的'n' void loadsettings(Settings * settings); //加载设置文件 void help(void); //帮助 void display(Players * player); //显示游戏界面 void gameplay(Players * player); //游戏开始 bool gamejudge(Players * player); //判断输赢 int main() { char menuch; time_t t; Settings settings; //创建两个玩家 Players *player; //定义玩家指针 //给两个玩家分配内存空间 player = (Players *)malloc(sizeof(Players) * 2); srand((unsigned)time(&t));//初始化随机数种子 init(player, &settings); //初始化 while(true) { menu(&menuch); //获取玩家游戏菜单选项 system("cls"); //控制台命令清屏 switch(menuch) { case 'p': init(player, &settings); gameplay(player); break; case 'h': help(); break; case 's': setup(player, &settings); break; case 'q': printf("nntBye Bye!n"); break; default: break; } if(menuch == 'q') break; } free(player); //释放内存 Sleep(1000); //延时1000毫秒 return 0; } bool gamejudge(Players * player) //判断输赢 { bool play0, play1; play0 = (player + 0) -> guess; play1 = (player + 1) -> guess; if(play0 && play1) //全出正面,玩家给电脑3金币 { (player + 0) -> coin += 3; (player + 1) -> coin -= 3; } if((!play0) && (!play1)) //全出反面,玩家给电脑1金币 { (player + 0) -> coin += 1; (player + 1) -> coin -= 1; } if(play0 != play1) //一正一反,电脑给玩家2金币 { (player + 0) -> coin -= 2; (player + 1) -> coin += 2; } //查看双方金币量是否小于0,判断游戏是否结束 if((player + 0) -> coin <= 0 || (player + 1) -> coin <= 0) return true; else return false; } void gameplay(Players * player) //开始游戏 { bool guessin; char ch = '0'; char guess[2][3] = {"反", "正"}; char * game0, * game1; display(player); while(ch != 'q') { printf("nt请选择你的金币正反面..."); printf("nt提示:按"1"出正面,按"0"出反面,按"q"退出。"); fflush(stdin); //清除输入缓存,以免出错。 ch = getch(); fflush(stdin); if(ch == '1'){ //玩家输入“1”,表示出正面,其它均为反面 guessin = true; game1 = guess[1]; }else{ guessin = false; game1 = guess[0]; } (player + 1) -> guess = guessin; //随机给电脑出正反面 (player + 0) -> guess = (bool)(rand() % 2); if(player -> guess) { game0 = guess[1]; }else{ game0 = guess[0]; } if(gamejudge(player)) { system("cls"); printf("nntt游戏结束!nnt"); if(player -> coin <= 0) { printf("nt恭喜你!"%s"的金币输光了!你赢了!", player -> name); }else{ printf("nt很遗憾!"%s"的金币输光了!你输了!", (player + 1) -> name); } printf("nnnt按任意键返回..."); getch(); break; } display(player); printf("nt%s:出的"%s"。 %s:出的"%s"。n", player -> name, game0, (player + 1) -> name, game1); } } void display(Players * player) //显示游戏界面 { system("cls"); printf("nn"); printf("t-------------------------------------------n"); printf("t| %-19s|%19s |n", player -> name, (player + 1) -> name); printf("t-------------------------------------------n"); printf("t| | |n"); printf("t| 金币 | 金币 |n"); printf("t| %-15d | %15d |n", player -> coin, (player + 1) -> coin); printf("t| | |n"); printf("t-------------------------------------------n"); } void help(void) //帮助 { printf("nn"); printf("t--帮助------------------------------------n"); printf("t| 猜金币游戏规则 |n"); printf("t| |n"); printf("t| 双方同时各放一枚金币桌面上, |n"); printf("t| 如果双方都为正面,玩家给电脑3枚金币 |n"); printf("t| 如果双方都为反面,玩家给电脑1枚金币 |n"); printf("t| 如果双方正反面不同,电脑给玩家2枚金币 |n"); printf("t| |n"); printf("t| 按数字1表示出正面,数字0表示出反面 |n"); printf("t| |n"); printf("t| 程序制作:ysl |n"); printf("t| 联系QQ: |n"); printf("t------------------------------------------n"); printf("nnt按任意键继续..."); getch(); } void setup(Players * player, Settings * settings) //设置参数 { FILE * fp = NULL; char buff[255]; char * ret; char ch; bool test; loadsettings(settings); system("cls"); printf("nn"); printf("t--游戏设置----------------------------n"); printf("t| |n"); printf("t| 当前设置信息如下: |n"); printf("t| |n"); printf("t| 初始金币数:%20d |n", settings -> coin); printf("t| 电脑玩家的名字:%16s |n", settings -> name0); printf("t| 人类玩家的名字:%16s |n", settings -> name1); printf("t| |n"); printf("t--------------------------------------n"); printf("nt你要重新设置吗?y/n"); ch = getch(); if(ch == 'y') { printf("n请输入初始金币数(直接回车设置默认值100):"); fgets(buff, 17, stdin); fflush(stdin); deenter(buff); if(*buff == ' ') strcpy(buff, "100"); settings -> coin = atoi(buff); if(settings -> coin < 0) settings -> coin = 0; printf("n请输入电脑玩家的名字(直接回车设置默认值):"); fgets(buff, 17, stdin); fflush(stdin); deenter(buff); if(*buff == ' ') strcpy(buff, "电脑"); strncpy(settings -> name0, buff, 16); printf("n请输入人类玩家的名字(直接回车设置默认值):"); fgets(buff, 17, stdin); fflush(stdin); deenter(buff); if(*buff == ' ') strcpy(buff, "玩家"); strncpy(settings -> name1, buff, 16); fp = fopen("setup.txt", "w"); if(fp ==NULL) { printf("n打开设置文件失败"); exit; } fprintf(fp, "%dn", settings -> coin); fprintf(fp, "%sn", settings -> name0); fprintf(fp, "%sn", settings -> name1); fclose(fp); } } void deenter(char * ch) //删除字符串中的回车符 { char * ret; ret = strchr(ch, 'n'); if(ret) *ret = ' '; } void loadsettings(Settings * settings) //读取设置文件中的参数 { FILE * fp = NULL; char buff[255]; while(fp == NULL){ fp = fopen("setup.txt", "r"); //检测文件是否存在 if(fp == NULL) { //文件不存在就创建一个,并赋初值 fp = fopen("setup.txt", "w"); if(fp == NULL) { printf("n设置文件打开失败n"); exit; } fprintf(fp, "%dn", 100); fprintf(fp, "%sn", "电脑"); fprintf(fp, "%sn", "玩家"); fclose(fp); } } fgets(buff, 255, fp); //读取文件中的数值字符串,并转换成整型值赋值给参数变量 settings -> coin = atoi(buff); fgets(buff, 255, fp); deenter(buff); //去除读取字符串中的换行符 strncpy(settings -> name0, buff, 16); fgets(buff, 255, fp); deenter(buff); //去除读取字符串中的换行符 strncpy(settings -> name1, buff, 16); fclose(fp); } void init(Players * player, Settings * settings) { //初始化函数,读取参数变量中的值赋值给玩家变量 loadsettings(settings); (player + 0) -> coin = settings -> coin; (player + 1) -> coin = settings -> coin; strncpy((player + 0) -> name, settings -> name0, 16); strncpy((player + 1) -> name, settings -> name1, 16); (player + 0) -> guess = true; (player + 1) -> guess = true; } void menu(char * menuch) { while(true) { system("cls"); printf("n"); printf("t 猜金币nn"); printf("t------------------------------------n"); printf("t| 开始游戏(p) |n"); printf("t| 帮助(h) |n"); printf("t| 设置(s) |n"); printf("t| |n"); printf("t| 退出(q) |n"); printf("t------------------------------------n"); printf("t请选择:"); *menuch = getch(); if(*menuch == 'p' || *menuch == 'h' || *menuch == 's' || *menuch == 'q'){ break; }else{ printf("nn您的输入有误,请选择"); printf(""p、h、s、q"四个选项,"); printf("n并请注意大小写。n"); printf("n按任意键继续..."); getch(); } } }
代码如上
MinGw 8.1编译通过,Win7 64完美运行。
前前后断断续续学了几个月,花两天完成以上源码,
不到之处欢迎高手指点一二,在下虚心请教。
也欢迎同为小白的朋友们互相讨论,共同进步。
本想完全用C标准库实现的,无赖,限制太多。
猜金币游戏本身没什么可玩性,双方赢金币的概率相等,
但是,玩家可以通过出正面和反面的不同数量比例(大概1/3~2/5)就能赢
可以在现实生活中赢别人钱哦,规则简单,暗藏玄机。



