C语言随机数的产生之猜数字游戏——分支语句和循环语句的练习

        1~100以内猜数字游戏

一、猜数字的实现思路

 难点:随机数的产生和循环语句、分支语句的运用

二、随机数的产生

        2.1 函数 int rand(void):生成一个随机的整数,范围为0~RAND_MAX(具体指看编译器)不需要                                       参数,函数返回类型为整型

函数的具体简介:

 

         但这样产生的随机数在每次执行代码时产生的随机数一致。这样每次所猜数字的值都一样,那这个游戏就没有趣味性了。例:

         根据我们的需求,我们需要的随机数需要完全随机,没有规律可言,这里我们就可以将随机数与时间结合起来,时间是在不断改变的,这里就产生了时间戳的概念。怎样才能将时间和产生的随机数结合起来呢?

        查看 rand()函数的用法,在调用 rand()函数之前可以调用 srand()来 生成随机数的生成器。

        2.2 函数 void srand(unsigned int seed):该函数没有返回值,传参的时候需要传一个无符号的整形。 函数作用是设置一个随机开始的起点,如果每次运用该函数都需要进行传参,那么每需要一个随机数就要传一个数字,这样就不方便。例:


int main()
{
	srand(999);
	int ret = rand();
	printf("%d\n", ret);
	return 0;
}

        所以我们需要传一个值,这个值会不断地变化,这样就可以联想到时间是不断地改变。

        时间戳:每一个时间相对应计算机起始时间的差值,单位是秒,只要时间改变,对应的时间戳就在改变。可以通俗地理解为每一个时间对应一个不同的数值。

        2.3 生成时间戳:需要用到 time_t time( time_t *timer ) 函数

time_t time( time_t *timer )函数:函数的返回值就是时间戳,其类型是,返回的就是时间戳,需                                                          要传参的是一个指针,如果不需要用参数的时候可以传一个空                                                          指针NULL

time_t:是C语言规定的一种类型,是一个long long的整型

         我们在对srand传参的时候需要传一个无符号的整型,所以需要对time的返回值进行强制类型转换。产生随机数的代码为:

#include<time.h>
#include<stdlib.h>
int main()
{
	srand((unsigned int)time(NULL));
	int i= 0;
	for (i = 1; i <= 10; i++)
	{
		int ret = rand();
		printf("第%d个随机值为:%d\n",i, ret);
	}
	return 0;
}

 随机数:

三、游戏代码思路

        1.打印游戏菜单界面

        2选择是否玩游戏,选择是否不符合选项

        3.猜数字,与生成的随机数进行比较

        4.游戏结束,再次选择是否玩游戏

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

void menu()
{
	printf("*************************\n");
	printf("******* 0.退出游戏 ******\n");
	printf("******* 1.开始游戏 ******\n");
	printf("*************************\n");
}

void game()
{
	int n = 0;
	int ret = rand()%100+1;
	while (1)
	{
		printf("请猜数字>:");
		scanf("%d", &n);
		if (n > ret)
		{
			printf("猜大了\n");
		}
		else if (n < ret)
		{
			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 0:
				printf("退出游戏\n");
				break;
			case 1:
				game();
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}

	} while (input);
	return 0;
}

四、带有关机惩罚的猜数字游戏

        若猜数字5次以后还没有猜中,将进入惩罚。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>

void menu()
{
	printf("*************************\n");
	printf("******* 0.退出游戏 ******\n");
	printf("******* 1.开始游戏 ******\n");
	printf("*************************\n");
}

void game()
{
	int n = 0;
	int i = 5;
	int ret = rand()%100+1;
	while (i)
	{
		printf("请猜数字>:");
		scanf("%d", &n);
		i--;                                    //用来调整while()中真假
		if (n > ret && 0 != i)
		{
			printf("猜大了,你还有%d次机会\n",i);
		}
		else if (n < ret && 0 != i)
		{
			printf("猜小了,你还有%d次机会\n", i);
		}
		else if(n==ret)
		{
			printf("恭喜你,猜对了!!!\n");
			break;
		}
		if (i == 0)
		{
			char arr[20] = { 0 };
			printf("5次机会已经用完,你的电脑将在30秒后关机,输入“我是猪”后取消关机\n");
			system("shutdown -s -t 30");
			while (1)
			{
				scanf("%s", arr);
				if (strcmp(arr, "我是猪") == 0)
				{
					system("shutdown -a");
					break;
				}
				else
				{
					printf("回答错误\n");
				}
			}
		}
	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
			case 0:
				printf("退出游戏\n");
				break;
			case 1:
				game();
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}

	} while (input);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_64616721/article/details/125533352
今日推荐