C语言 猜数字游戏 VS2022

//电脑产生一个随机数(1~100)
//反馈:猜大了或者猜小了

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

void menu()
{
	printf("******************************\n");
	printf("********    1.play    ********\n");
	printf("********    0.exit    ********\n");
	printf("******************************\n");
}

void game()//游戏主体
{
	int guess = 0;
	//生成随机数
	int ret = rand() % 100 + 1;//生成随机函数,范围为0~RAND_MAX(32767);
	
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned int)/*强制转换为int*/time(NULL));//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;
}

        猜数字小游戏是学习代码非常基础也非常经典的一款小游戏,接下来我将详细介绍程序的实现过程。

        在主函数中,我们主要实现游戏的开始与退出,此时我们使用switch()函数实现游戏功能的选择(分支结构)。同时,为了让游玩者至少做出一次选择,并在游戏结束后,为了再次让游玩者做出选择,我们使用do while()函数(循环结构)

        接下来,让我们将目光放到game()函数中,这也是整段代码最重要的部分。为了猜一个数字,首先我们需要生成一个随机数,此时我们将使用rand()函数,其作用为Generates a pseudorandom number(生成一个随机数),下图为rand()函数的具体使用方法:

        注意!下面有句话,The rand function returns a pseudorandom integer in the range 0 to RAND_MAX. 意思是rand()函数将会返回一个范围0~RAND_MAX的伪随机数。有读者就会问:晓铭晓铭,RAND_MAX的大小是多少啊?看下图:

         RAND_MAX的大小为0x7fff,而这是一个十六进制的数,我们打开电脑自带的计算机进行换算,结果为下图:

        折腾了这么久,我们终于得出,rand()函数所返回的伪随机数的范围为0~32767。这时会有动手能力强的读者会说:晓铭晓铭,rand()函数的返回值在第一次的时候确实是随机的,但也只是第一次是。为什么这么说呢,原来是因为第一次和第二次所给出的数字与顺序是完全相同的。

        这是便涉及到rand()函数定义中的另外一句话: Use the srand function to seed the pseudorandom-number generator before calling rand.在调用rand之前,使用srand函数来播种伪随机数生成器。其作用为Sets a random starting point.(设置一个随机的起点),下图为srand()函数的具体使用方法:

         即我在主函数main中所编写的srand((unsigned int)time(NULL));此时又涉及到一个新的函数time(),其作用为Gets the system time.(获取系统时间),下图为time()函数的具体使用方法:

         想必已经有读者猜到晓铭为什么要获取系统时间了,原因其实很简单,因为时间是不停在变换的。The time function returns the number of seconds elapsed since midnight (00:00:00), January 1, 1970, coordinated universal time, according to the system clock. 时间函数返回自系统时钟指示下的1970年1月1日午夜(00:00:00)以来所经过的秒数。这样就可以通过srand函数来设置rand函数的起点。

        需要注意的是,The return value is stored in the location given by timer. This parameter may be NULL, in which case the return value is not stored.返回值存储在计时器给出的位置中。此参数可以为NULL,在这种情况下,不存储返回值。所以我们在time函数中填入NULL(空指针)。并且因为srand函数所需要的参数为无符号整型,所以我们使用unsigned int强制将time函数的返回值转换为整型(时间不可能为负数)。

        这样我们就完美解决了随机数生成的问题,再通过if else函数进行判断,while函数进行循环,直到猜中随机数,使用break退出循环。

        代码到这里基本就结束了,最后,希望你们,也希望自己越来越优秀......

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓铭同学381125

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值