C语言实现猜数字游戏

引言:

在掌握了前面的分支循环使用之后,我们就可以写一些稍微有趣的代码了,例如,我们可以实现一个猜数字游戏。

一.随机数的生成

要想完成猜数字游戏,我们就需要生成随机数,那么该如何产生随机数呢?

C语言中提供了一个函数叫做rand,这函数是可以生成随机数的,函数原型如下:

int rand(void);

但是值得注意的是,rand函数生成的随机数是一种伪随机数,并不是真正意义上的随机,这个随机数范围在0——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所提供的随机数是一种伪随机,是通过某种算法生成的随机数,真正的随机数是无法预测下一个数是多少的,如果要生成不同的随机数,那我们就需要改变一下函数。

二.srand函数

C语言中又提供了一个函数叫做srand,是用来初始化随机数的生成器的,srand函数的原型如下:

void srand(unsigned int seed);

程序中调用rand函数之前先调用了srand函数,通过srand函数的参数seed来设置rand函数随机数生成的种子,只要种子在变化,每次生成的随机数也就变化起来了。那就是说给srand的种子如果是随机的,rand就能生成随机数,在生成随机数时又需要一个随机数,这就相互矛盾了。

三.time函数的引入

在程序中我们一般是使用程序运行的时间作为种子,因为时间是时刻在变化的。

在C语言中有一个函数叫做time,就可以获得这个时间,time函数原型如下:

time_t time(time_t* timer);

time函数会返回当前的日历时间,其实返回的是现在的时间距离1970年1月1日0时0分0秒的差值,单位为秒,其返回类型是time_t类型,time_t类型实际上是32位或64位的整型类型。

time函数的参数timer如果是非NULL的指针的话,函数也会将这个返回值的差值放在timer指向的内存中带去。

如果timer是NULL,就只返回这个时间差值。time函数返回的这个时间值也叫做时间戳。

time函数使用时需要包含头文件:time.h,那么我们就可以让生成随机数的代码改写如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand((unsigned int)time(NULL));
    printf("%d\n",rand());
    printf("%d\n",rand());
    printf("%d\n",rand());
    printf("%d\n",rand());
    return 0;
}

                                                      

 再次观察,每次运行的结果就不同了,就代表我们的随机数设置成功了。

四.设置随机数的范围

如果我们要生成0——99之间的随机数,方法如下:

rand()%100;//余数范围为0到99

 如果我们要生成1——100之间的随机数,方法如下:

rand()%100+1;//余数是0——99,+1后范围是1——100

  如果我们要生成100——200之间的随机数,方法如下:

100+rand()%101;//余数范围是0——100,加上100范围为100——200

五.猜数字游戏的实现

我们要先想象一下猜数字游戏的架构,先给出一个随机数,是我们要猜的数字,如果猜大了,则给予提示,并且重新猜测,猜小了,就给出提示猜小了,如果猜对了,就可以提示恭喜通关,也可以增加难度比如只能猜三次。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
	int r=rand()%100+1;
	int guess=0;
	int count=5;
	while(count)
	{
		printf("\n你还有%d次机会\n",count);
		printf("请猜数字>:");
		scanf("%d",&guess);
		if(guess<r)
		{
			printf("猜小了,请重新猜测\n");
		}
		else if(guess>r)
		{
			printf("猜大了,请重新猜测\n");
		}
		else
		{
			printf("恭喜你,完成猜测,奖励100元\n");
			break;
		}
		count--;
	}
	if(count==0)
	{
		printf("你失败了,好好反思下最近是不是没有努力\n");
	}
}
void menu()
{
	printf("********************\n");
	printf("*******1.play ******\n");
	printf("*******0.exit ******\n");
	printf("********************\n");
}
int main()
{
	int input=0;
    srand((unsigned int)time(NULL));
    int n=rand();
    int m;
    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;
}

最后,完整代码附上,快上你的vs2022试试吧!喜欢的话可以点个赞支持一下哦!

  • 41
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值