【C语言】数字炸弹(0-100之间)

//猜数字游戏(猜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,表示不进行游戏或者不继续游戏)时,会发生访问越界的情况,问题截图如下。恳请大佬指点。

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值