• 【C语言小游戏--猜数字】


    前言

    猜数字小游戏是我们大多数人学习C语言时都会了解到的一个有趣的C语言小游戏,下面我将详细介绍该游戏的实现和编程逻辑。玩小游戏的同时,也能对C语言控制语句有更好的认识。

    在这里插入图片描述

    1.游戏描述

    电脑随机生成一个1-100的数字,玩家来猜。玩家可以根据自己需要,设置每次猜的次数。如果在设置的次数内猜对了,则提示你猜对了,否则提示猜错了。

    2.代码实现

    2.1打印菜单

    我们在玩游戏前,都是先打印菜单,在进行选择。所以此处选择do-while循环

    #include
    void menu()
    {
    	printf("***********************\n");
    	printf("***  1.play  0.exit ***\n");
    	printf("***********************\n");
    }
    int main()
    {
    	do
    	{
    		menu();
    	} while (1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    效果展示:
    在这里插入图片描述

    2.2构建基础框架

    选择1:玩游戏;
    选择0:退出;
    选择其它:重新选择

    int main()
    {
    	int input = 0;
    	do
    	{
    		menu();
    		printf("请选择:");
    		scanf("%d", &input);
    		switch (input)
    		{
    		case 1:
    			printf("玩游戏\n");
    			break;
    		case 0:
    			printf("退出游戏\n");
    			break;
    		default:
    			printf("选择错误,请重新选择:\n");
    		}
    	} while (input);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    效果展示:
    在这里插入图片描述

    2.3玩游戏

    既然我们要玩猜数字游戏,那么我们选择1后,不能就打印一个玩游戏吧,因此下面来真正实现猜数字游戏。

    2.3.1生成随机数

    怎么才能生成随机数呢?
    C语言提供了一个函数用来生成随机数

    2.3.1.1rand()

    在这里插入图片描述

    查看文档我们发现:

    • rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是 依赖编译器上实现的,但是⼤部分编译器上是32767。
    • 在调用rand之前,使用srand函数为伪随机数生成器提供种子。
    • rand函数的使用需要包含⼀个头文件是:stdlib.h

    什么意思呢?我们不妨写代码测试一下:
    运行一下发现,确实产生了随机数。但是当我运行第二次发现,产生的随机数和第一次的一样,那怎么能行,这不是BUG吗?

    在这里插入图片描述
    在这里插入图片描述

    如果再深⼊了解⼀下,我们就不难发现,其实rand函数⽣成的随机数是伪随机的,伪随机数不是真的随机数,是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽rand函数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。
    之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦是1。 如果要⽣成不同的随机数,就要让种⼦是变化的。

    种子要变化,我们再让种子是一个随机值不就行了嘛
    NO,大漏特漏
    如果这样的话,就死循环了

    2.3.1.2srand()

    刚才在文档中提到的一个srand是什么呢?
    在这里插入图片描述

    程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次生成的随机数序列也就变化起来了。
    那也就是说给srand的种⼦如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随机数,这就又矛盾了

    那电脑上什么东西是一直变化的呢?——时间

    2.3.1.3time()

    在这里插入图片描述

    • time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运行时间之间的差值,单位是秒。 如果
    • time()的参数timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳

    如果是这样,我们就可以这样写代码:
    在这里插入图片描述
    在这里插入图片描述
    这样我们发现数字就随机起来了,那我们的代码接下来可就好写咯。
    我们需要的随机数是1-100之间的,所以我们可以这样写代码:
    在这里插入图片描述

    2.3.2game()

    生成随机数

    void game()
    {
    	srand((unsigned int)time(NULL));
    	int random_number = rand() % 100 + 1;
    	printf("%d\n", random_number);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    效果如下:

    在这里插入图片描述
    但是如果你是老司机,手速比较快的话,生成的随机数会相同,如下:
    在这里插入图片描述
    这是为什么呢?
    因为当我们运行一次game(),就会调用一次srand(),这样在较短时间内调用,就会产生相同的数字
    因此,srand函数不需要频繁调用的,⼀次运⾏的程序中调用⼀次就够了。
    所以,我们可以将其放在main()中

    void game()
    {
    	int random_number = rand() % 100 + 1;
    	int number = 0;
    	while (1)
    	{
    		printf("请猜数字:");
    		scanf("%d", &number);
    		if (number > random_number)
    		{
    			printf("您猜大了\n");
    		}
    		else if (number < random_number)
    		{
    			printf("您猜小了\n");
    		}
    		else
    		{
    			printf("恭喜你,猜对了!\n");
    			break;
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2.4自己设定猜的次数

    用户自己输入次数,如果未在设置的次数中猜对,则提示失败
    代码变动地方如下:

    switch (input)
    		{
    		case 1:
    			printf("你感觉你几次就能猜对呢?\n");
    			scanf("%d", &count);
    			game(count);
    			break;
    		case 0:
    			printf("退出游戏\n");
    			break;
    		default:
    			printf("选择错误,请重新选择:\n");
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    void game(int count)
    {
    	int random_number = rand() % 100 + 1;
    	int number = 0;
    	while (count)
    	{
    		printf("请猜数字:");
    		scanf("%d", &number);
    		if (number > random_number)
    		{
    			printf("您猜大了\n");
    		}
    		else if (number < random_number)
    		{
    			printf("您猜小了\n");
    		}
    		else
    		{
    			printf("恭喜你,猜对了!\n");
    			break;
    		}
    		count--;
    	}
    	if (count == 0)
    	{
    		printf("你未在规定的次数内猜对,有点高估自己了,还得练哦\n");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    效果如下:
    在这里插入图片描述
    在这里插入图片描述

    3.完整代码

    #include
    #include
    #include
    void menu()
    {
    	printf("***********************\n");
    	printf("***  1.play  0.exit ***\n");
    	printf("***********************\n");
    }
    void game(int count)
    {
    	int random_number = rand() % 100 + 1;
    	int number = 0;
    	while (count)
    	{
    		printf("请猜数字:");
    		scanf("%d", &number);
    		if (number > random_number)
    		{
    			printf("您猜大了\n");
    		}
    		else if (number < random_number)
    		{
    			printf("您猜小了\n");
    		}
    		else
    		{
    			printf("恭喜你,猜对了!\n");
    			break;
    		}
    		count--;
    	}
    	if (count == 0)
    	{
    		printf("你未在规定的次数内猜对,有点高估自己了,还得练哦\n");
    	}
    }
    int main()
    {
    	srand((unsigned int)time(NULL));
    	int input = 0;
    	int count = 0;
    	do
    	{
    		menu();
    		printf("请选择:");
    		scanf("%d", &input);
    		switch (input)
    		{
    		case 1:
    			printf("你感觉你几次就能猜对呢?\n");
    			scanf("%d", &count);
    			game(count);
    			break;
    		case 0:
    			printf("退出游戏\n");
    			break;
    		default:
    			printf("选择错误,请重新选择:\n");
    		}
    	} while (input);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    本次分享就到这里啦,感谢您的观看
    在这里插入图片描述

  • 相关阅读:
    20道经典软件测试面试题(答案+文档)
    第6章_瑞萨MCU零基础入门系列教程之串行通信接口(SCI)
    宜搭,怎么在公式编辑中计算百分比的和?
    相机标定:理论与实践
    【Spring】@Transactional常用参数使用示例、以及常见的一些坑
    深入理解常见的二十三种设计模式
    Spring提供的API实现文件上传
    Spire.Office for .NET 7.9.0 update
    免费最强下载工具IDM,没有之一
    JS—DOM节点的使用知识整理
  • 原文地址:https://blog.csdn.net/weixin_69380220/article/details/133975986