谁都不能阻挡你成为优秀的人。
//游戏题目
//珠玑妙算:是一个猜不重复数字的游戏。
//游戏流程是:出题者根据答题者的推测给予提示
//循环进行这种对话形式的处理,直到答题者猜对答案为止。
//注:数字和位置都与正确答案一致就是hit,数字猜对了但位置不对就是blow。
PS:想要发给朋友玩的方法在前面如何发动态链接库那篇文章里面哈!非常简单!
废话不多说,直接上代码(里面有详细的思路和解释哈!)
一这里先提几点:
1.生成随机数还是老方法。
2.isdigit 函数:
这个头文件是#include<ctype.h> 格式:int isdigit(int c)
功能:判断c是否为十进制数字 返回值:若判断成立,则返回除0以外的值(真),若判断不成立,则返回0。
3.计算程序所花的时间:
调用clock函数后,就能以clock_t型的数值形式获取程序启动后经过的时钟数。时钟数的单位根据编程环境不同而有所差别,但都能通过除以CLOCKS_PER_SEC来换算成以秒为单位的数值。
然而,这样直接进行除法运算的话会舍去小数部分,所以要强制转换成double型,再进行(double)clock() / CLOCKS_PER_SEC的操作。
格式就是这样:
clock_t start, end;
start = clock();
-----处理------
end = clock();
此时所需的时间是end减去start的时钟数。
把这个值除以CLOCKS_PER_SEC就能换算成以秒为单位的值。直接进行除法运算的话会舍去小数部分,所以想求出实数的话,就必须将其强制转换成double型。
(double)(end-start)/CLOCKS_PER_SEC //处理所需的时间
4.字符与对应整数的关系
数字字符减去‘0’,可以得到对应的整数值。
整数值加上‘0’,可以得到对应的数字字符。
二:游戏实现
test.c:
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" //1.生成4个各不相同的字符串 //2.检查字符串的有效性 //3.对于数字和位置是否正确的判断 //4.显示判断结果 //5.计算完成用的时间 //游戏题目 //珠玑妙算:是一个猜不重复数字的游戏。 //游戏流程是:出题者根据答题者的推测给予提示 //循环进行这种对话形式的处理,直到答题者猜对答案为止。 //注:数字和位置都与正确答案一致就是hit,数字猜对了但位置不对就是blow。 int main() { int try_guess = 0; //计算输入次数 clock_t start=0 ; clock_t end=0; srand((unsigned int)time(NULL)); //设置随机数种子 int guess[4] = { 0 }; //要猜的字符串 char buff[10] = { 0 }; //玩家输入字符串 int chk = 0; //已输入字符串的检查结果 int try_no = 0; //输入次数 int hit = 0; //位置和数字都正确的数字个数 int blow = 0; //数字正确但位置不正确的数字个数 printf("来玩珠玑妙算吧。\n"); printf("猜猜4个数字。\n"); printf("其中不包含相同的数字。\n"); printf("来玩珠玑妙算吧。\n"); printf("不能输入空格字符。\n"); make4digits(guess); start = clock(); //计算开始 do { do { printf("请输入:\n"); scanf("%s", buff); chk = check(buff); switch (chk) { case 1: printf("\a请确保输入4个字符。\n"); break; case 2: printf("\a请不要输入除了数字外以外的字符。\n"); break; case 3: printf("\a请不要输入相同的数字。\n"); break; } } while (chk != 0); try_guess++; judge(buff, guess, &hit, &blow); print_result(hit + blow, hit); } while (hit < 4); end = clock(); //计算结束 printf("用了%d次。\n", try_guess); printf("用时%lf秒。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }
game.c:
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" //1.生成4个各不相同的字符串 void make4digits(int guess[]) { int i = 0; int j = 0; int val = 0; for (i = 0; i < 4; i++) //生成4个数 { do { val = rand() % 10; //0-9的数 for (j = 0; j < i; j++) //是否已经取值 { if (val == guess[j]) break; } } while (j < i); //循环至获得不重复的值 guess[i] = val; //上面不重复之后然后赋值 } } //2.检查字符串的有效性 int check(const char buff[]) { int i = 0; int j = 0; //字符串长度不为4 if (strlen(buff) != 4) return 1; //包含了除数字以外的字符 for (i = 0; i < 4; i++) { if (!isdigit(buff[i])) return 2; } //含有相同数字 for (j = 0; j < i; j++) { if (buff[i] == buff[j]) return 3; } //字符串有效 return 0; } //3.对于数字和位置是否正确的判断 void judge(const char buff[],const int guess[], int* hit, int* blow) { int i = 0; int j = 0; *hit = *blow = 0; for ( i = 0; i < 4; i++) //前面两个for循环是4个数每个数都和其他的数比较 { for ( j = 0; j < 4; j++) { if (buff[i] == '0' + guess[j]) //数字一致 { if (i == j) { (*hit)++; //位置也一致 } else { (*blow)++; //位置不一致 } } } } } //4.显示判断结果 void print_result(int snum, int spos) { if (spos == 4) { printf("回答正确!!!\n"); } else if (snum == 0) { printf("这些数字里没有答案数字。\n"); } else { printf("这些数字里包括%d个答案数字。\n", snum); if (spos == 0) { printf("但是数字的位置都不一致。\n"); } else { printf("其中有%d个数字的位置是一致的。\n",spos); } } printf("\n"); }
game.h:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<time.h> #include<string.h> #include<ctype.h> #include<stdlib.h> //生成4个各不相同的字符串 的声明 void make4digits(int guess[]); //检查字符串的有效性 的声明 int check(const char buff[]); //3.对于数字和位置是否正确的判断 的声明 void judge(const char buff[],const int guess[], int* hit, int* blow); //4.显示判断结果 的声明 void print_result(int snum, int spos);
吐槽一下,今天这个游戏在写的时候找bug找了快两小时(两个=写成了一个=),中间写的时候还把game函数删掉了又重新写....太艰难了QAQ
今天的内容就到这里了哈!!!
要是认为作者有一点帮助你的话!
就来一个点赞加关注吧!!!当然订阅是更是求之不得!
最后的最后谢谢大家的观看!!!
你们的支持是作者写作的最大动力!!!
下期见哈!!