C语言实现猜数字游戏
猜数字游戏要求:
1.创建一个menu函数,实现菜单选项,选择0表示退出游戏,选择1表示开始游戏(即可以连续多次游玩猜数字游戏)
2.系统随机产生一个1-100的数字,要求每次产生的随机数不一样
3.只允许猜5次及5次以下,超过5次则为失败
注意点:
1.怎么生成随机数?
C语言提供了一个函数 rand,用于产生随机数
函数原型:
int rand ( void );使用该函数需要使用库函数:<stdlib.h>
该函数会生成一个伪随机数,范围是在0~RAND_MAX之间,RAND_MAX的⼤⼩是 依赖编译器上实现的,但是⼤部分编译器上是32767。
出现问题:
因为rand函数生成的是伪随机数,默认的种子是1,直接使用每次生成的随机数其实是确定的,我们需要做以下事情来实现真正的生成随机数:
1.改变种子的值,使得每次游玩的种子值不一样,这样每次生成的随机数也不一样
2.每次改变的种子值和之前不相同,若相同,那和默认种子为1没区别,只是把1变成了2or3or其他数字。

解决方法:
C语言中的srand函数,用于改变种子值
函数原型:
void srand ( unsigned int seed);
如何使得每次种子值都不一样?
现实生活中时间在不断变化,我们可以根据时间的变化来生成种子值,从而改变rand函数生成的随机值。
C语言中的time函数,可以获取时间
函数原型:
time_t time ( time_t * timer);time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的 差值,单位是秒。返回的类型是time_t类型,time_t 类型本质上其实就是32位或者64位的整型类型。如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做: 时间戳使用该函数需要使用头文件:<time.h>
因此使得rand函数实现真正的随机值的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
//srand要求函数类型为unsigned int类型,但是time函数的返回类型为time_t类型,因此需要强制转换
srand((unsigned int)time(NULL));
printf("%d\n",rand());
return 0;
}
2.怎么使得生成的随机数在1-100之间?
在刚刚的代码中,每次生成的随机数位数都不一样,因为我们需要进行运算将随机数控制在1-100之间。
int r = 0;
// %100后的数字在0-99之间,再加1即可实现数字范围在1-100之间
r = rand() % 100 + 1;
由上面可以得出一个结论:
生成a~b的随机数,所写代码如下:
a + rand()% (b-a+1)
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("************************\n");
printf("**** 1.play ****\n");
printf("**** 0.exit ****\n");
printf("************************\n");
}
void game()
{
//生成随机数字,范围是1-100
int randNumber = 0;
int guess = 0;
randNumber = rand()%100+1;
//猜数字
int count = 5;
while(count)
{
printf("你还有%d次机会\n",count);
printf("请输入你猜的数字:");
scanf("%d",&guess);
if(guess>randNumber)
{
printf("猜大了\n");
}
else if(guess<randNumber)
{
printf("猜小了\n");
}
else
{
printf("恭喜你猜对了!\n");
break;
}
count--;
}
if(0 == count)
{
printf("机会用尽,你失败了!\n");
}
}
int main()
{
int input = 0;
//每次都会生成新的种子,如果按的足够快,种子差异不大(甚至相同),则生成的随机数差异也不大
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
//玩游戏
game();
break;
case 0:
//退出游戏
printf("已经退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}while(input);
return 0;
}