rand函数和srand函数、生成的游戏

1、游戏要求

1、生成一个1~100的随机数

2、玩家输入数字,对随机数进行判断,看它猜大了、还是猜小了,猜对了

3、如果不过瘾,那在玩一遍;

2、rand函数

C语言给我们提供了一个生成随机数的函数,叫rand;

int   rand(void);

不用给rand函数任何参数;它返回的是一个整型;

rand函数会返回一个伪随机数,这个伪随机数的范围是0~RAND_MAX(32767);注意,伪随机数并不是一个真正的随机数,rand函数会根据一个叫“种子”的基准值来进行运算生成随机数的;

注意我们使用rand函数需要包含头文件;#include<stdlib.h>

注意,调用rand函数,它默认的种子是1;

通过上面的案例,我们可以看到怎么生成第二次的随机数是一样的呢?

因为rand函数默认种子是1;每次都是按照种子1来运算生成随机数,所以每次生成的随机数都是一样的。

那我们想让它生成不同的随机数,是不是生成不同的种子就行了?生成不同的种子,rand函数也就按照不同的种子运算生成不同的随机数了

3、srand函数

C语言提供一个srand函数,可以设置种子;初始化生成随机数的生成器;

void  srand (unsigned int  seed)

没有返回值,它的参数类型是无符号整型,通过改变seed,生成不同的种子;         

通过上面的两次生成随机数,我们得知它跟上次的的随机数是不一样了;但是生成第二次的时候,生成随机数又一样了;因为虽然我们用srand函数设置种子,但是你设置的这个种子2,那下一次也还是这个种子2,没有变,所以生成的随机数也还是一样的;

那我们让srand函数每次生成不一样的种子不就行了吗?那我们在srand函数给一个变化的值,想一下在电脑中哪一个是变化的呢?是时间!

  4、time函数

在C语言我们一般用时间做种子,因为每时每刻都在变化。

C语言提供一个叫time的函数,可以获取电脑的时间;

time_t  time(time*timer)

time函数会返回一个时间差,也叫时间戳,也就是电脑的起始时间到现在时间的差值;

time函数的返回类型是time_t类型,time_t本质上是一个32位或者64位的一个整型;它的参数是指针,但是我们不管,我们只想要它的返回值,那我们就给它一个空指针——NULL

注意time函数,需要包含头文件;#include<time.h>

   这样我们每次生成的随机数就不一样了;注意我们的游戏要求是生成1~100的随机数;

那我们可以这样做:

5、基本框架

1、我们要求不过瘾,那就再玩一遍;那用do....while循环,先玩一遍再说,不过瘾再玩一遍或者玩了一遍,退出;

2、玩游戏,给一个游戏选项菜单,选择哪一个选项;输入进去input变量;然后再根据input变量里的选项,去选择对应的功能,1玩游戏,0退出,如果输入其他的选项,那就是输入错误,重新选择;我们这里就用到switch选择语句;do...while的循环变量是input;大家琢磨琢磨;

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	int input = 0;
	do
	{
		printf("**************************\n");
		printf("********  1.play  ********\n");
		printf("********  0.exit  ********\n");
		printf("**************************\n");
		printf("请选择:>");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			printf("猜数字\n");
			break;
		case 2:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

那我们为了代码简洁,高效;我们把菜单用函数封装起来

void meun ()没有返回值,只是打印菜单;

我们游戏想要实现,那实现游戏的代码可能很长,如果全部放在主函数里,那就会很冗长,不好看,检查代码也麻烦;我们就照猫画虎,也封装成一个函数,没有返回值;

void  game()

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		meun();//调用菜单函数
		printf("请选择:>");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();//调用游戏函数
			break;
		case 2:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

菜单函数

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

6、游戏实现

我们要实现游戏的代码用函数game封装起来,首先我们先生成1~100的随机数,然后我们就猜数字;那我们猜数字不一定一次猜中,可能要猜多次;那我们用while循环;输入我们猜的数字;进行 比较得出结果,然后打印,如果猜小了或者猜大了,就继续,如果猜对了,brake;跳出循环游戏结束。

void game()
{
	//生成1~100的随机数
	int r = rand() % 100 + 1;
	int guess = 0;
	//猜数字
	while (1)
	{
		printf("猜数字\n");
		scanf("%d",&guess);
		if (guess > r)
			printf("猜大了\n");
		else if (guess < r)
			printf("猜小了\n");
		else
		{
			printf("恭喜你猜对了,正确的数字是%d\n",r);
			break;
		}

	}
}

我们也可以给游戏增加点难度,只给你5次机会;

5次机会,就是你输入5次都没有猜对,那循环变量就是count;循环5次,每一次count--;循环结束,跳出循环,另外猜对了,也是break跳出循环,但是break跳出循环count肯定是小于5的;循环结束是count==0的;那我们再循环外再做一个判断,如果你5次都没猜对;那就给一个说明;

void game()
{
	//生成1~100的随机数
	int r = rand() % 100 + 1;
	int guess = 0;
	//猜数字
	int count = 5;//5次机会
	while (count)
	{
		printf("你还剩%d的机会\n",count);
		printf("猜数字\n");
		scanf("%d",&guess);
		if (guess > r)
			printf("猜大了\n");
		else if (guess < r)
			printf("猜小了\n");
		else
		{
			printf("恭喜你猜对了,正确的数字是%d\n",r);
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("机会用完,游戏结束,正确的答案是%d\n",r);
	}
}

 游戏结束!                              

                                                              感谢观看!感谢指正!

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值