猜数字游戏【c语言项目练习】

猜字谜游戏

我们可以用代码写一下有趣的游戏,比如猜数字。

游戏要求:
1.电脑自动生成1-100的随机数;
2.玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直至猜对,游戏结束。

1.随机数生成

要想进行游戏,我们首先要能产生随机数。那么,如何产生随机数呢?

1.1 rand 函数
	C语言提供了一个叫rand的函数,可以用来生成随机数,该函数原型如下:
1 int rand (void);

rand返回的随机数范围在0~RAND_MAX之间,这个RAND_MAX的大小是靠编译器实现的,大部分编译器上是32767。

使用rand函数时需要包含头文件:stdlib.h
但是需要注意,rand函数会返回伪随机数。伪随机数不是真正的随机数,而是通过某种算法生成的随机数。rand函数是对一个叫“种子”的基准值进行运算生成的随机数。rand函数生成随机数的默认种子是1,因此程序每次运行时,rand函数产生的随机值的结果是一样的,如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#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());
	return 0;
}

在这里插入图片描述
在这里插入图片描述
我们可以看到两次的运行结果一致。如果要生成不同的随机数,就要让种子变化。

1.2 srand 函数

srand函数用来初始化随机数的生成器,原型如下

1 void srand (unsigned int seed);

程序在调用rand函数前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数也就变化了。只要srand所设置的种子随机,那么rand就能生成随机数。问题在于,如何让种子发生变化呢?

1.3 time 函数

在程序中,我们一般是使用程序运行的时间作为种子,因为时间是时刻在变化的。
C语言中的time函数就能获得这个时间,time 原型如下:

1 time_t time (time_t* timer);

time函数会返回当前的日历时间,返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型,time_t类型本质上是32位或者64位的整型类型。
如果time_t的参数timer是非NULL的指针,函数也会将这个返回的差值放在timer指向的内存中带回去。
如果timer是非空指针,就只返回这个时间的差值。time函数返回的这个时间差也被叫做时间戳。网上可以找到查询时间戳的网站,感兴趣的可以用网站换算一下。

time函数需要包含头文件:time.h

只是让time函数返回时间戳,可以这样写:

1 time(NULL);//调用time函数返回时间戳,这里没有接收返回值
特别注意:srand函数只需调用一次,所以放在主函数中就行了。
不能把srand函数放在自定义函数中,否则srand函数调用多次,每一次都先设置基准值,生成的随机数可能会一样或者十分接近。

由此,猜数字游戏的关键几个函数我们就都掌握了。

1.4 设置随机数的范围

rand生成的随机数从0~32767,范围实在太大,按照这个范围,我们很难猜出正确的答案。所以,我们必须限制随机数的大小。

如果我们要生成0~99的随机数,方法如下所示:
1 rand()%100;//余数的范围是0~99

一个数字模上100所得的余数结果只能是0~99。

如果生成1~100的随机数,如下:
1 rand()%100+1//%100的余数是0~99,再+1,范围是1~100
如果要生成100~200的随机数,则
1 100 + rand()%(200-100+1)//括号内是101,则余数是0~100,再加上100,范围是100~200
由上述可知,生成a~b的随机数的公式:
1 a + rand()%(b-a+1)

了解这些,我们就可以成功限制随机值的范围,猜数字游戏就可以正式开始实现了。

2.猜数字游戏的实现

首先,我们先写一个主函数。

这里非常适合使用do while循环,do while循环在判断前就会执行一次,而我们在玩猜数字游戏时需要先输入再判断,至少需要执行一次。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	//将time强制类型转换,time虽然返回的是整型类型,但编译器不认识
	int r = 0;
	srand((unsigned int)time(NULL));
	do
	{
		printf("***********************\n");
		printf("******  1.play   ******\n");
		printf("******  0.exit   ******\n");
		printf("***********************\n");
		printf("请选择:>");
		scanf("%d", &r);
			switch(r)
			{
				case 1:
					printf("猜数字游戏\n");
					break;
				case 0:
					printf("游戏结束\n");
					break;
				default:
					printf("输入错误,请重新选择\n");
					break;
			}                                                      
	} while (r);
	return 0;
}

这里我们会发现主函数太臃肿了,我们可以把前4个打印游戏菜单的printf函数移到自定义函数中去。并且case1中无法实现猜数字,我们需要再自定义一个函数,用来实现猜数字的过程。
如下所示:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
	int r = rand() % 100 + 1;//生成随机数,并让随机数的范围在1—100之间
		int math = 0;//输入的数值
		while (1)
		{
			printf("请猜数字>");
			scanf("%d", &math);
			if (math > r)
				printf("输大了\n");
			else if (math < r)
				printf("输小了\n");
			else
			{
				printf("恭喜你,猜数字成功\n");
				break;
			}
		}
}
void menu()//游戏菜单
{
	printf("***********************\n");
	printf("******  1.play   ******\n");
	printf("******  0.exit   ******\n");
	printf("***********************\n");
}
int main()
{
	//将time强制类型转换,time虽然返回的是整型类型,但编译器不认识
	int i = 0;//赋值游戏开始输入的值
	srand((unsigned int)time(NULL));//设置基准值,使种子变化
	do
	{
		menu();//游戏菜单
		printf("请选择:>");
		scanf("%d", &i);
			switch(i)
			{
				case 1:
					game();
					break;
				case 0:
					printf("游戏结束\n");
					break;
				default:
					printf("输入错误,请重新选择\n");
					break;
			}                                                      
	} while (i);
	return 0;
}

由此,我们就基本完成了实现猜数字游戏的代码。
当然,为了给游戏增加难度,我们可以给猜数字游戏加上猜数字的次数限制,这里我设置为5次,如果5次猜不出,则游戏失败。如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
	int r = rand() % 100 + 1;//生成随机数,并让随机数的范围在1—100之间
		int math = 0;//输入的数值
		int count = 5;//可猜数字的次数为5次
		while (count)
		{
			printf("你还有%d次机会\n", count);
			printf("请猜数字>");
			scanf("%d", &math);
			if (math > r)
				printf("输大了\n");
			else if (math < r)
				printf("输小了\n");
			else
			{
				printf("恭喜你,猜数字成功\n");
				break;
			}
			count--;
		}
		if(count==0)
		printf("你失败了,正确的答案是%d\n", r);

}
void menu()//游戏菜单
{
	printf("***********************\n");
	printf("******  1.play   ******\n");
	printf("******  0.exit   ******\n");
	printf("***********************\n");
}
int main()
{
	//将time强制类型转换,time虽然返回的是整型类型,但编译器不认识
	int i = 0;//赋值游戏开始输入的值
	srand((unsigned int)time(NULL));//设置基准值,使种子变化
	do
	{
		menu();//游戏菜单
		printf("请选择:>");
		scanf("%d", &i);
			switch(i)
			{
				case 1:
					game();
					break;
				case 0:
					printf("游戏结束\n");
					break;
				default:
					printf("输入错误,请重新选择\n");
					break;
			}                                                      
	} while (i);
	return 0;
}

这样,一个有趣的猜数字游戏就完成了。

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值