c语言项目实践-猜数字大小
掌握了我之前说的那些代码知识,接下来,我们就可以写一些基本的小游戏,例如-猜数字的游戏。
游戏要求:
1. 电脑⾃动⽣成1~100的随机数
2. 玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束
随机数的生成
想要完成猜数字的游戏,首先我们要生成1-100的随机数,那。该怎么生成嘞
rand函数
在C语言中,有一个专门生成随机数的语句-rand语句,它的格式如下:
int rand (void);
rand会生成一个伪随机数,这个伪随机数的值在0~RAND_MAX之间,这个RAND_MAX是依据编译器来实现的,大多数编译器的这个值都是32767
rand使用的时候有一个头文件stdlib.h
那接下来我们展示一下rand函数的功能
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}

结果如下 你会发现,每次循环的结果都是如上图所示,是一样的,这是为什么呢
这就是我们说的rand函数生成的是一个伪随机数,为什么叫伪随机数呢,因为他是基于一个叫种子
的基准值用算法计算生成的,之所以前面的每个数都一样,就是因为rand()中默认种子为1,而想要产生变化的值,就要让种子也产生相应的变化。
srand函数
srand函数在C语言当中是初始化随机数的生成器的,它的格式如下:
void srand( unsigned int seed);
我们在调用sand函数之前,要先调用srand函数来生成种子的随机值,当种子在变化的时候,那么生成的随机数的值也就会发生相应的变化。
time函数
在C语言我们常用程序运行的时间来作为种子,因为程序运行的时间是时刻在发生变化的。
在C语言中有一个函数叫time,就可以获得这个时间,time函数的具体格式如下:
time_t time (time_t *timer);
time函数会返回当前的日历时间,实际返回的是1970年1月1日0分0秒到现在的时间差,单位是秒,返回的类型是time_t类型的,而time_t实际上是32位或64位的整数类型。
time函数的参数timer如果是非指针NULL的话,函数会将时间差这个值放到timer指向的内存中带回去。
timer如果是NULL的指针的话,就只返回这个时间的差值,time函数返回的这个时间差也叫:时间戳
如果只让time函数返回时间戳,我们可以这样写。
time(NULL);//调用time函数返回时间戳,这里没有接收值
那么,我们就可以将生成随机数的代码改写成:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand((unsigned int)time(NULL));//使用time函数的返回值接收种子,srand的接收类型是unsigned int,所以对time用强制类型转换。
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}

srand函数是不用频繁调用的,一次程序调用一次就好
设置随机数的范围
如果我们要生成0~99的随机数,方法如下:
sand()%100;
如果我们要生成1~100的随机数,方法如下:
sand()%100+1;
如果要生成100~200之间的随机数,方法如下:
100+sand()%(200-100+1);
如果要生成a~b之间的随机数,方法如下:
a+sand()%(b-a+1);
游戏代码
那么,完成之后,我们就可以完成游戏的完整代码啦!!
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
int r = rand() % 100 + 1;
int guess;
while (1)
{
printf("猜猜数字:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了");
break;
}
}
}
void menu()
{
printf("*************************\n");
printf("********1.play***********\n");
printf("********2.exit***********\n");
printf("*************************\n");
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入你的选择");
scanf("%d", &input);
switch (input)
{
case 1: game();
break;
case 2:
printf("游戏结束");
break;
default:
printf("输入错误,请输入正确数字");
break;
}
} while (input);
return 0;
}
此外,我们还可以给游戏加上一个次数限制,要是超过五次,就没机会了。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
int r = rand() % 100 + 1;
int guess;
int num = 5;
while (1)
{
printf("你还有%d次机会", num);
printf("猜猜数字:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了");
break;
}
num--;
}
if (num == 0)
{
printf("你失败了");
}
}
void menu()
{
printf("*************************\n");
printf("********1.play***********\n");
printf("********2.exit***********\n");
printf("*************************\n");
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入你的选择");
scanf("%d", &input);
switch (input)
{
case 1: game();
break;
case 2:
printf("游戏结束");
break;
default:
printf("输入错误,请输入正确数字");
break;
}
} while (input);
return 0;
}