规则如下: 1. 开始运行后玩家需要输入1或2选择开始游戏或退出程序 2. 每局游戏会生成一个1~100的随机数,玩家有五次机会去猜,猜错会显示猜大了还是猜小了。 3. 防止玩家沉迷游戏,一次性最多连玩三把。
C语言提供了一个函数rand,使用它需要包括头文件stdlib.h 函数原型为:
int rand (void);rand可以生成“伪”随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩取决于你的编译器,⼤部分编译器上是32767。
那为什么叫“伪”呢?我们来看看下面的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}如果你反复运行几次就会发现,结果总是:


就懵了,不是说好是随机数吗,怎么两次结果都一样??

其实 rand 函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。rand 函数首先对一个叫“种子”的基准值进行运算,算出的“随机数”,而它生成随机数的默认种子是1,所以每次结果都一样。
C语言中又提供了一个函数叫srand,是用来初始化随机数的生成器的,srand的原型如下:
void srand (unsigned int seed);可以看到,srand的参数类型要求是unsigned int
程序中在调用 rand 函数之前先调用 srand 函数,通过 srand 函数的参数seed来设置rand函数生成随机数时的种子。也就是说,如果srand的seed是随机的,rand就能生成随机数。只要种子在时刻变化,每次生成的随机数序列也就变化起来了。
对!“时刻”变化!
那么,我们就可以利用使用程序的时间作为种子。因为“时间”,正是时刻变化的!
在C语言中有一个函数叫 time ,使用它需要包含头文件time.h 它可以获得这个时间,time函数原型如下:
time_t time (time_t* timer);time函数会返回1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒,返回类型是time_t (本质上就是32位或64位的整型类型)。在本项目中,time函数不需要参数,timer可以设置为NULL 基于此,我们就可以将time函数的返回值赋给srand函数当做seed。这样,seed就是时刻变化的了,具体写法如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand( (unsigned int)time(NULL) );
// ↑
//因为time函数的返回值类型不是srand要求的,所以这里要强制转换
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}这样,每次的数字就不一样了


nice(/≧▽≦/)
这其实是最简单的一步,每次的随机数除以100得到的余数一定在0到99间,再加一,不就是1~100了吗。
综合以上四条内容:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand( (unsigned int)time(NULL) );
printf("%d\n", rand()%100+1);
printf("%d\n", rand()%100+1);
printf("%d\n", rand()%100+1);
return 0;
}

这一步就需要用到分支语句和循环语句了,但也灰常简单。 具体思路就是:定义一个变量(我下面就用a)作为每次玩家输入的数字的储存地址,根据a和答案的大小情况输出“猜到了”或“猜大了”或“猜小了”,循环五次(当然猜对的话就停止)
参考:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand((unsigned int)time(NULL));
int r = rand() % 100 + 1;
int a = 0;
for (int turn = 1; turn <= 5; turn++)
{
printf("你猜的数字是:");
scanf("%d", &a);
if (a < r)
{
printf("猜小了,你还有%d次机会\n\n", 5 - turn);
}
else if (a > r)
{
printf("猜大了,你还有%d次机会\n\n", 5 - turn);
}
else
{
printf("恭喜你,猜对了!\n");
goto end;
}
}
printf("游戏失败o(╥﹏╥)o\n答案是%d\n",r);
end :
return 0;
}不同的结果:


ps:为了得到通关的结果截图,我玩了半个小时

这部分也非常简单,一个大大的循环就彳亍
int round = 0;
do
{
round++;
......
}
while(round<3)菜单我们可以这样设计:
void menu()
{
printf("-----------------------------------\n");
printf("-----------guess number------------\n");
printf("--------------1.play---------------\n");
printf("--------------2.quit---------------\n");
printf("-----------------------------------\n");
}
//我才不会说\n是看到格式错误才想起来加上的呢!这里的void menu意思是我们设置了一个叫menu的函数,在后面的代码中我们就可以直接引用menu来打印菜单,最后我们也会将游戏运行的本体封装到一个game的函数里。有关函数的相关详细内容我们之后再讲。
好了,让我们把上面的东西都综合起来!经过一些逻辑上的修改,得到最终结果:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("-----------------------------------\n");
printf("-----------guess number------------\n");
printf("--------------1.play---------------\n");
printf("--------------2.quit---------------\n");
printf("-----------------------------------\n");
}
void game()
{
int r = rand() % 100 + 1;
int a = 0;
for (int turn = 1; turn <= 5; turn++)
{
printf("你猜的数字是:");
scanf("%d", &a);
if (a < r)
{
printf("猜小了,你还有%d次机会\n\n", 5 - turn);
}
else if (a > r)
{
printf("猜大了,你还有%d次机会\n\n", 5 - turn);
}
else
{
printf("恭喜你,猜对了!ヾ(◍°∇°◍)ノ\n");
goto end;
}
}
printf("游戏失败o(╥﹏╥)o\n答案是%d\n\n\n", r);
end:
;
}
int main()
{
srand((unsigned int)time(NULL));
int round = 0;
int choice = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
round++;
game();
if (round == 3)
printf("阿伟,你玩了三把了,休息一下吧\n");
break;
case 2:
printf("游戏结束\n");
break;
default:
printf("选择错误,请重试\n");
}
} while ((round < 3)&&(choice != 2));
return 0;
}运行结果也是非常的完美




总之,今天的任务就算圆满完成了,但我的代码也不算简洁,大家学习后一定也可以写出更漂亮的!
感谢阅读