【C】猜数字游戏,通过一个代码掌握 rand() 函数、srand() 函数和 time() 函数的使用


1. 游戏描述:

a. 电脑产生一个随机数(1~100)
b. 玩家猜数字
c. 得到反馈:猜大了or猜小了
d. 猜到数字,游戏结束

2. 实现难点

2.1 生成随机数 :rand()

C语言中的库函数 rand() 能为我们解决这一问题,下面是该函数的基本介绍

声明: int rand(void);
作用: 返回一个范围在 0 到 RAND_MAX 之间的伪随机数

使用: 实际情况中通常用做随机生成某个区间的数,与 % 模号配合使用可以达到控制范围的效果。

   /* 举例:输出 0 到 49 之间的 5 个随机数 */
   for( i = 0 ; i < 5 ; i++ ) 
   {
      printf("%d\n", rand() % 50);
   }
      /* 举例:输出 1 到 50 之间的 5 个随机数 */
   for( i = 0 ; i < 5 ; i++ ) 
   {
      printf("%d\n", rand() % 50 + 1);
   }

使用该函数,能生成伪随机数,意思是其返回的结果看似随机,但多次运行后我们很快就可以发现,这个伪随机值是同一串值。这样的结果,在很多实际问题的处理上会导致随机值并不随机。

2.2 真正的随机数:srand()

srand() 函数,在一些地方也被称作随机数发生器,在 rand() 函数前使用

声明:void srand(unsigned int seed);
作用: 配合 time() 函数设置时间戳,解决 rand() 函数生成值每次都是固定顺序的问题。
参数: seed 是一个整型值,用于伪随机数生成算法播种。

   /* 随机数发生器的初始化 */
   srand((unsigned) time(NULL));
 
   /* 输出 0 到 49 之间的 5 个随机数 */
   for( i = 0 ; i < 5 ; i++ ) {
      printf("%d\n", rand() % 50);
   }
2.3 时间戳:time()

time() 函数,可以返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。

声明:time_t time(time_t *seconds);
作用: 设置时间戳。
参数: seconds 是指向类型为 time_t 的对象的指针,用来存储 seconds 的值。
返回类型: time_t 本质上也是一个整形。
返回值: 以 time_t 对象返回当前日历时间。如果 seconds 不为空,则返回值也存储在变量 seconds 中。

简单说来,srand() 函数要求上传整形参数,time() 函数的返回值time_t本质上就是整形,用 (unsigned) 进行强制类型转换不影响使用,并且是一个一直在变动的值。所以,这两个函数搭配起来,刚好能使得 rand() 函数生成真正的随机值。

3. 代码

// 1. 游戏菜单
void menu()
{
	printf("****************************\n");
	printf("*********  猜数字  *********\n");
	printf("*********  play-1  *********\n");
	printf("*********  exit-0  *********\n");//0为假,做do-while循环,条件为假结束程序
	printf("****************************\n");
}
// 2.游戏逻辑
void game()
{
	// a.生成 1~100 之间的随机数
	// 随机数 %100 生成的是 0~99 间的随机数,+1则为1~100
	int random_num = rand()%100+1;

	// b. 玩家输入所猜数字
	int i = 0;
	while (1)
	{
		printf("请输入所猜测数字(1-100):>");
		scanf("%d", &i);
		// c. 判断是否猜对
		if (i < random_num)
			printf("猜小了\n");
		else if (i > random_num)
			printf("猜大了\n");
		else
		{
			printf("猜对啦!\n");
				break;
		}
	}
}

// 3. 主程序
int main()
{
	int input = 0;
	do
	{	
		menu();
		srand((unsigned)time(NULL));

		printf("请选择1/0:>");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while(input);

	return 0;
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值