《C语言初阶》 猜数字小游戏

大家好,这篇文章主要教大家写个小游戏,学习编程的时候我们肯定都有一个梦想就是想写出属于自己的游戏。这次,我们就从0到1开始写一个非常简单的猜数字小游戏,当你写完时和你的朋友一起玩吧!

首先,我们制定一些游戏规则:
电脑随机生出一个1~100的数字。
玩家猜大了,电脑会告诉:猜大了。
玩家猜小了,电脑会告诉:猜小了。
玩家猜对了,电脑会告诉:恭喜你,猜对了。

第一步:在主函数内构建好基本框架
因为,我们一开始就要玩游戏并且多次玩,我们应该使用do…while循环。
在进入循环的开始,我们就应该看到菜单所以我们应该创建一个打印菜单的函数。代码如下:
在这里插入图片描述
然后作为玩家看到菜单应该选择1或0,选择1则玩游戏,选择0则退出游戏,如果玩家不小心输入错误的数字,应该提醒玩家重新输入。所以,在后面我们应该用switch语句来实现分支内容
在这里插入图片描述
现在出现了一个问题循环条件该填什么?
我们思考一下可不可以将input放到条件里,如果输入的是0,来到判断条件0为假跳出循环,符合要求。如果输入的是1,判断条件为真则又一次进入循环,符合要求。如果输入的是其它数字,判断条件为真,也会再一次进入循环,所以循环条件填input是符合要求的。
第二步:构建猜数字game()函数里的随机数
1.C语言中如何生成随机数?
C语言中生成的随机数的方式是rand函数(在使用前应该引用头文件stdlib.h)。rand函数我们初步了解一下:
在这里插入图片描述
在这里插入图片描述
这句话的意思是返回一个随机数它的范围在0到RAND_MAX。RAND_MAX是多大呢?我们将RAND_MAX转到定义:
在这里插入图片描述
在这里插入图片描述
可以看到RAND_MAX是16进制的0x7fff,转换为10进制是32767。
现在,我们就用vs2019测试一下rand函数:
在这里插入图片描述
这里虽然生成随机数,但是每次运行结果随机数都是一样的。这就有问题了,当你玩完一把后再玩第二把答案是一样的。这是什么原因?
在这里插入图片描述
我们再来看后面这段话,在使用rand函数之前,要调用srand函数生成那个随机数的生成器。
这样,我们再来看一下srand函数:
在这里插入图片描述
我们可以看到srand函数里需要传入一个无符号整数。这样,我们用srand函数来测试一下。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以看到传入srand函数里的参数不一样,则生成的随机数是发生变化的。
那我们该如何给srand函数里传入一个随时变化的值呢?
比如说:电脑上的时间,时间是随时发生变化的。
这里有个时间戳的概念:就是现在电脑上的时间和电脑起始时间的一个差值,转换成秒。
那我们该如何获取时间戳呢?
在C语言中有一个time函数(在使用前要引用time.h头文件),可以获取时间戳。
在这里插入图片描述
这里的参数为指针类型(先了解一下,以后再细说),这样我们就传空指针给time函数,然后强制类型转换成unsigned int。
在这里插入图片描述
我们可以看到生成的随机数是不一样了,但是当我们输入的1过快,则产生的随机数会相同。因为,生成器只需要创建一次就行了,不需要玩一把创建一次。所以,我们把srand放到主函数里就不会出现这个问题了。
最后,就是我们生成的是0到32767,但我们需要1到100的数,所以只需要给随机数%100,余的就是0到99,因为余数不会大于除数。再加1,就是1到100了
第三步:构建game函数里的玩家猜数字的过程
这一步就非常简单了。

	if (guess < r)
	{
    
    
		printf("猜小了\n");
	}
	else if (guess > r)
	{
    
    
		printf("猜大了\n");
	}
	else
	{
    
    
		printf("恭喜你,猜对了\n");
	}

当我们猜的数字和正确数字不同时给出相应的提示,但我们猜数字不是一次就猜对,应该加个循环,当我们猜对了跳出来。

while (1)
	{
    
    
		printf("请猜数字:>");
		scanf("%d", &guess);
		if (guess < r)
		{
    
    
			printf("猜小了\n");
		}
		else if (guess > r)
		{
    
    
			printf("猜大了\n");
		}
		else
		{
    
    
			printf("恭喜你,猜对了\n");
			break;
		}

	}

整个游戏代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
    
    
	printf("****************************\n");
	printf("********    1.play    ******\n");
	printf("********    0.exit    ******\n");
	printf("****************************\n");
}

void game()
{
    
    
	int guess = 0;
	//猜数字游戏过程
	//生成随机数
	int r = rand()%100+1;//生成1到100的数字
	//玩家猜数字
	while (1)
	{
    
    
		printf("请猜数字:>");
		scanf("%d", &guess);
		if (guess < r)
		{
    
    
			printf("猜小了\n");
		}
		else if (guess > r)
		{
    
    
			printf("猜大了\n");
		}
		else
		{
    
    
			printf("恭喜你,猜对了\n");
			break;
		}

	}
}

int main()
{
    
    
	int input = 0;
	srand((unsigned int)time(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;
}

总结
这样我们就可以完成这个猜数字小游戏了。好了,不知道到这里大家有没有学会自己写这个小游戏,我希望大家可以自己去尝试写一下,这样会对大家的编程能力和编程兴趣都会有大大的提高。如果这篇文章大家认为有不足之处或错误都可以告诉我,如果大家认为这篇文章有用的话,也希望大家能给我点赞关注,你们的支持就是对我最大的鼓励,我们下一篇文章再见。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_52154068/article/details/122353759