迷你小游戏之猜数字

猜数字

  • 1.游戏规则
  • 2.函数详解
    • 2.1rand()函数
    • 2.2srand()函数
    • 2.3time()函数
  • 3.游戏实现

1.游戏规则

输出一个菜单,输入1游戏开始,输入0游戏结束。
在每局游戏中自动生成一个随机数x,玩家输入一个数字n,若n>x,则输出猜大了,若n 在动手之前,我们需要了解,规则里的随机数怎么生成?若生成了随机数,游戏的实现不是问题。接下来请耐心的看完几个函数的介绍,看完你会消除心中的疑虑的。

2.函数详解

2.1rand()函数

  • 头文件
  • 定义int rand( void );
  • 返回值:一个随机–范围:0~RAND_MAX即0-32767(2^15-1)
#include 
#include 
int main()
{
    for (int i = 0; i < 10; i++) 
        printf("%d\n", rand());
    return 0;
}

在vs2022运行结果:
迷你小游戏之猜数字_第1张图片
我们发现,运行三次的结果均相同
问题来了:有没有办法让每次生成的随机数不同?
继续看srand函数

2.2srand()函数

  • 头文件

  • 定义 void srand (unsigned int seed);

  • 与rand关系:调用rand前需先调用srand设置随机数基数,若不设置,则rand自动设置基数为1,导致之后生成的数字相同,上面的问题也迎刃而解了。

#include 
#include 
int main()
{
    unsigned int seed;
    scanf("%u", &seed);
    srand(seed);
    for (int i = 0; i < 10; i++) 
        printf("%d\n", rand());
    return 0;
}

迷你小游戏之猜数字_第2张图片
迷你小游戏之猜数字_第3张图片
可以看到,输入的seed不同,产生的随机数不同,问题:能否不需要每次手动输入seed,让其自动产生随机seed,由上可知,rand可以生成随机数,能用rand生成的随机数作为seed?答案是不能。因为rand调用前需要用srand设置seed,由此成为死循环。没有办法了吗?山重水复疑无路,接着看我们的time函数

2.3time()函数

  • 头文件:
  • 定义:time_t time(time_t *seconds);
  • 返回值:格林尼治时间1970.1.100:00:00到当前时长(单位秒)
  • 调用: t=time(NULL)
    t=time(0)
    将time(0)的返回值作为基数,上面的问题统统解决!
#include 
#include 
#include 
int main()
{
    srand(time(0));
    for (int i = 0; i < 10; i++) 
        printf("%d\n", rand());
    return 0;
}

迷你小游戏之猜数字_第4张图片
迷你小游戏之猜数字_第5张图片
可见,在没有手动输入seed的情况下,程序已能够自动输出随机数

3.游戏实现

#include 
#include 
void menu()
{
	printf("********************************\n");
	printf("*******     1. play      *******\n");
	printf("*******     0. exit      *******\n");
	printf("********************************\n");
}
void game()
{
	int num = 0, ret = rand() % 100 + 1;
	while (1)//只有猜对了才结束循环,否则一直猜
	{
		printf("请猜数字:>");
		scanf("%d", &num);
		if (num == ret)
		{
			printf("恭喜你,猜对了\n");
			break;
		}
		else if (num > ret)
			printf("猜大了\n");
		else
			printf("猜小了\n");
    }
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//调用time函数每次随机生成seed
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);//使用do-while循环的好处:
	//无论输入1/0都会开始一轮游戏
	//若输入1,本轮游戏结束后自动进行下一轮游戏
	//若如输入0,本轮游戏结束且不会开始下一轮游戏
	return 0;
}

你可能感兴趣的:(C语言经典题目,c++,c语言,算法)