//猜数字游戏(猜1-100之间的数字)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//菜单函数
void menu()
{
printf("**********************\n");
printf("*** 开始游戏(Y/N)***\n");
printf("**********************\n");
printf("\n");
}
//游戏函数 1.产生随机数 2.猜数字
void game()
{
//1.产生随机数
int in = 0; //in means input
int ran; //ran means random number
ran = rand() % 100 + 1; //random number between 1-100
//2.猜数字
while (1)
{
//printf("%d\n", ran); //看看随机数是啥,在游戏中应注释掉
printf("\n");
printf("请输入:");
scanf("%d", &in);
if (in > ran)
{
printf("猜大了\n");
continue;
}
else if (in < ran)
{
printf("猜小了\n");
continue;
}
else
{
printf("猜对了\n");
printf("\n");
break;
}
}
}
int main()
{
char c; //c 表示 choose
char con; //con 表示 continue
//产生随机数种子
srand((unsigned int)time(NULL)); //让时间戳time()函数作为srand()函数的随机数种子
menu(); //调用菜单函数
do
{
scanf("%s", &c);
switch(c) //switch函数对选择输入(变量为c)进行相应的判断
{
case'Y':
do
{
printf("开始游戏");
game(); //调用游戏函数
printf("是否继续游戏(Y/N)");
printf("\n");
scanf("%s",&con);
if (con == 'N')
{
printf("退出游戏\n");
break;
}
}
while (con == 'Y'); //当玩家选择继续(变量为con)游戏时,循环
break;
case'N':
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新选择\n");
printf("\n");
break;
}
}
while (c != 'Y' && c != 'N'); //当玩家选择(变量为c)既非Y也非N时,循环,让其重新选择
return 0;
}
难点:随机数产生
难点在于生成随机数时,需要调用rand()函数以及srand()函数。
rand()函数
- 头文件为#include<stdlib.h>
- 返回值为0-RAND_MAX(大小为0x7fff,换算为十进制为32767)的伪随机数
- rand()函数内部其实使用线性同余法生成的伪随机数,因为周期较长,因此可以在一定程度上认为是随机数
- 要使用rand()函数生成一个0-99之间的随机数只需除以100取余即可,即为 int ran = rand() % 100;
- 在调用rand()函数之前,系统会询问是否调用过srand((unsigned int)seed)函数,是否对seed设定了初值。如果未进行调用,未设定初值,则系统会默认使用srand(1)调用一次。这就造成一个问题,seed的值每次调用都是1,那么rand()函数生成的随机数每次也都是一样的。
srand()函数
- srand()函数是随机数发生器的初始化函数。
- 为了解决seed相同,从而产生相同的随机数的问题,我们只需要让seed变成一个一直变化的随机数即可。但这就陷入了一个死循环,要生成一个随机数,就要生成一个是随机数的随机数种子。
- 其实不然,只需要seed一直变化就可以。那么什么是一直变化的呢?看看电脑的右下角。没错,就是时间,时间是一直变化的
- 那么我们如何调用时间作为随机数种子seed呢?这就需要用到时间函数time()
time()函数
- 使用time()函数,得到的返回值为一个时间戳。(时间戳 = 当前时间-1970.1.1.0:00:00)
-
函数原型: time_t time(time_t *timer)
参数说明: timer=NULL时得到当前日历时间(从1970-01-01 00:00:00到现在的秒数),timer=时间数值时,用于设置日历时间,time_t是一个unsigned long类型。如果 timer不为空,则返回值也存储在变量 timer中
- time()函数的头文件为#include<time.h>
- 因此,我们经常使用srand((unsigned int)time(NULL));对随机数进行初始化
- 但当两时间离得太近时,生成的随机数也相差不大。因此建议在主函数中调用一次srand()函数即可。
生成随机数的代码
#include<stdlib.h>
#include<time.h>
int main()
{
int ran ;
srand((unsigned int)time(NULL));
ran = rand;
return 0;
}
残留问题:访问越界
在变量c(即choose)或变量con(即为continue)选择N(即为NO,表示不进行游戏或者不继续游戏)时,会发生访问越界的情况,问题截图如下。恳请大佬指点。