猜数字游戏

文章介绍了如何使用C语言编写一个猜数字游戏。通过srand和rand函数生成1-100之间的随机数,并结合do-while循环和switch-case结构实现游戏菜单和用户交互。游戏的核心在于正确使用随机数生成器,避免生成相同的随机数,以及通过时间戳确保每次游戏的数字不同。此外,文章还展示了游戏的完整代码结构。
摘要由CSDN通过智能技术生成

要实现的功能

  1. 生成1-100之间的随机数
  2. 猜大了,告诉猜大了
  3. 猜小了,告诉猜小了
  4. 猜对了,告诉猜对了

让我们先写一个菜单函数吧

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

}

接着是代码的主体

从主函数写起,我们可以写一个循环,来实现多次玩游戏。这里可以用while或者do...while都可以,然后就是用switch...case语句实现菜单的选择。
在下面的代码中,我们用了choice作为循环条件,逻辑上更为简便,在你选择输入了0之后,因为选项内容是结束游戏,所以循环条件为0时,恰好结束循环,游戏随即退出。

int main()
{
	int choice = 1;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;

		}
	} while (choice);
	


	return 0;
}

在这里将choice初始化为1或者0都是没问题的,只不过在用while循环的时候,因为循环条件只有是非0的时候才能执行,所以不能将choice初始化为0


在写到这里时,先不要急着往下写,不妨先测试一下,看看有没有语法和逻辑上的错误,确定无误后在写接下来的内容


接下来是游戏函数

这是这项程序中最重要而且是最难的部分,我们需要生成一个随机数

在C语言中,有一个生成随机数的函数rand(),包含在<stdlib.h>头文件中。

void game()
{
	int ret = rand();
	printf("%d\n", ret);
}

该函数会以某种算法生成特定的范围内的数,但是该函数会有一个缺陷,会生成固定的数,先看一下结果。
运行截图

第二次运行截图

很明显两次出现的“随机数”结果相同, 这能很好的说明它是不够随机的,那它不就是没用了吗?不是这样的,这个函数想要发挥作用,需要一个与它密切相关的函数———srand(),此函数可以理解为种子函数

void game()
{
	srand(1);
	int ret = rand();
	printf("%d\n", ret);
}

当函数接收1


在这里插入图片描述


当函数接收2时(就是将srand()括号中写上2)


在这里插入图片描述
“种子”即意为源头,当源头相同时,会生成一样的数,就像上面srand()接收1或者2所得到的数字;当源头不同时,srand()接收12所得到的数字不同,rand()函数用某种算法计算出的”随机值“才会不同。
所以当我们要随机起来,srand()函数要接受的数字得变化起来

这里介绍一个工具——时间戳
我们在百度中直接搜索便可找到
时间戳
时间戳
Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

我们其实这样理解就可以了:它为某一刻的时间赋予了一个编码、代号。(现在只需要知道这么多就可以了,想要深入了解可以自行搜索)时间是不断变化的,我们利用这个就可以实现数字的不断变化,以此来生成随机数。

在C语言中,调用时间戳的函数是time(),包含在<time.h>头文件中

void game()
{
	srand((unsigned int)time(NULL));
	int ret = rand();
	printf("%d\n", ret);
}

srand函数
我们可以看到,srand()函数接收unsigned int类型的数值,我们将其强制转换,time(NULL)函数携带空指针返回(学识有限,实在无法解释为什么用空指针,大家见谅),返回一个时间戳。
在这里插入图片描述

这时我们就可以看到,数字在变换,不过我们仍然可以发现,数字太过相近,当我们按的过快的时候,后面的数字都有可能相同,因为按的过快,时间太接近,时间戳就相近,所以要想解决这个问题,我们需要把”种子“函数srand搬到game()函数外面,搬到主函数main中,srand 在循环外面,game()在循环中,那么当运行程序的时候,时间戳不会和循环内部同步,就可以生成不同的随机数了。

int main()
{
	srand((unsigned int)time(NULL));
	int choice = 1;

	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;

		}
	} while (choice);
	


	return 0;
}

在这里插入图片描述
由于我们要生成1-100之间的数字,我们就需要进行一些操作
int ret = rand()%100+1;,顺便把printf()屏蔽掉,总不能打印出来要猜的数字把。
然后就是简单的猜数字循环了

void game()
{
	int ret = rand()%100+1;
	//printf("%d\n", ret);
	int x = 0;
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &x);
		if (x > ret)
		{
			printf("猜大了\n");
		}
		else if (x < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}
	}
	
}

完整的代码如下

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

}
//2.生成随机数,猜数字
void game()
{
	int ret = rand()%100+1;
	//printf("%d\n", ret);
	int x = 0;
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &x);
		if (x > ret)
		{
			printf("猜大了\n");
		}
		else if (x < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}
	}
	
}
//3.主函数
int main()
{
	srand((unsigned int)time(NULL));
	int choice = 1;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;

		}
	} while (choice);
	
	return 0;
}

难免有疏漏,烦请各路大佬指正,感谢感谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值