C语言 实现猜数字游戏的详细过程

写一个猜数字游戏,要求如下:

1,自动产生一个1-100之间的随机数

2,猜数字

     a. 猜对了,就会恭喜你,游戏结束

     b. 猜错了,会告诉你猜大了,还是猜小了,继续猜,直到猜对

3,游戏可以一直玩,除非退出游戏


 目录

do while 怎么写?

1, 首先要生成一个随机数

怎么给到srand()一个随机数呢?

2,猜数字

总结思路


解析:首先我希望玩完一把不过瘾,能再来一把,并且一开始就能玩,所以采用do while结构

int main(void)
{
	do
	{

	} while ();
	return 0;
}

do while 怎么写?

打印一个菜单:menu()

并且定义这个menu()函数,设定1 ——玩游戏,0 —— 退出游戏

声明一个input,让玩家选择玩还是不玩

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
void menu()
{
	printf("*************************\n");
	printf("******** 1.play *********\n");
	printf("******** 0.exit *********\n");
	printf("*************************\n");

}
int main(void)
{
	int input = 0;
	do
	{
		menu();   //打印菜单
		printf("请选择:>");  //选择玩还是不玩
		scanf("%d", &input);
	} while ();
	return 0;
}

如果玩家选择0,结束游戏

如果玩家选择1,开始游戏

如果玩家输入既不是0也不是1,提示玩家选择错了,重新选择

这时候用 switch语句来判断 input 的选择

do while 结构的while(),括号里放input,这是因为:

switch 里面如果选择1,就会开始游戏,猜完之后break跳出 switch,就会在 while那里进行判断,1为真,所以会继续执行do语句——继续游戏;

如果switch 里面选择0,while这里判断0为假,所以不会再次执行do语句——游戏结束;

同理,如果玩家选择其他非0数,while也会判断为真,继续执行do语句。

define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
void menu()
{
	printf("*************************\n");
	printf("******** 1.play *********\n");
	printf("******** 0.exit *********\n");
	printf("*************************\n");

}
int main(void)
{
	int input = 0;
	do
	{
		menu();   //打印菜单
		printf("请选择:>");  //选择玩还是不玩
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("猜数字\n");
			break;
		case 0:
			printf("退出游戏\n");
			break
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);  
	return 0;
}

到此,基本框架搭好了。下面开始优化猜数字的过程。

把猜数字的过程实现放到一个函数game()里面去。

1, 首先要生成一个随机数

怎么生成随机数呢?有一个库函数 rand(), 它需要一个头文件#include<stdlib.h>

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<stdlib.h>
void menu()
{
	printf("*************************\n");
	printf("******** 1.play *********\n");
	printf("******** 0.exit *********\n");
	printf("*************************\n");

}
void game()  //猜数字游戏的实现
{
	//1.生成随机数
	int ret = rand();
	printf("%d\n", ret);
}
int main(void)
{
	int input = 0;
	do
	{
		menu();   //打印菜单
		printf("请选择:>");  //选择玩还是不玩
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

此时,rand()函数返回了一个0-32767之间的数字,但是每一次重新打开游戏,跳出来的随机数都和上一次重新打开游戏的时候是一样的,不够随机。

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<stdlib.h>
void menu()
{
	printf("*************************\n");
	printf("******** 1.play *********\n");
	printf("******** 0.exit *********\n");
	printf("*************************\n");

}
void game()  //猜数字游戏的实现
{
	//1.生成随机数
	int ret = rand();
	srand(100);   //将生成器设置为一个固定的数
	printf("%d\n", ret);
}
int main(void)
{
	int input = 0;
	do
	{
		menu();   //打印菜单
		printf("请选择:>");  //选择玩还是不玩
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

如果用srand()函数把生成器设置成一个固定数,则一局游戏中每次跳出来的数都是一样的,对比见下图:

所以给到srand()的不是固定数,是一个随机值,才能生成一个随机值。

怎么给到srand()一个随机数呢?

把时间也就是时间戳作为参数传给srand()

时间戳,像邮戳一样,是个时间点,是某个时间相较于计算机的起始时间差值,换算成以秒为单位的一个数字。

怎么获取时间戳?

用库函数 —— time()函数

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

}
void game()  //猜数字游戏的实现
{
	//1.生成随机数
	srand((unsigned int)time(NULL));  //time()函数有参数的,这里不用它的参数,传入空值NULL
	//time() 需要引用头文件 #include<time.h>
	//把time()函数的返回类型强制改为unsigned int(srand的返回类型)
	
	int ret = rand();
	//srand(100);   //这是错的,srand()需要一个变的量,才能生成随机值
	printf("%d\n", ret);
}
int main(void)
{
	int input = 0;
	do
	{
		menu();   //打印菜单
		printf("请选择:>");  //选择玩还是不玩
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

 此时运行程序可以看到,随机值还是不够随机。这是因为srand()确实要在rand()之前调用,但是这个随机数起点的设置srand()也被带入了循环,玩一次游戏重新设置一次。频繁地设置随机数起点会导致随机数不够随机。

实际上整个游戏srand()只需要设置一次就可以了。所以把srand()放到主函数循环的外面。

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

}
void game()  //猜数字游戏的实现
{
	//1.生成随机数
    int ret = rand();
	//srand(100);   //这是错的,srand()需要一个变的量,才能生成随机值
	printf("%d\n", ret);
}
int main(void)
{
	int input = 0;
	
	srand((unsigned int)time(NULL));  //time()函数有参数的,这里不用它的参数,传入空值NULL
	//time() 需要引用头文件 #include<time.h>
	//把time()函数的返回类型强制改为unsigned int(srand的返回类型)
	do
	{
		menu();   //打印菜单
		printf("请选择:>");  //选择玩还是不玩
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

此时生成的随机数就比较随机,但是它的范围是0-32767,题目是要求0-100。

先让 int ret = rand() 这个已经生成的随机数模100,rand()%100,余数是0-99,然后+1,范围就变成0-100。这时候生成的随机数就是0-100之间。生成的随机数不能给玩家看,所以把printf("%d\n", ret);注释掉了

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

}
void game()  //猜数字游戏的实现
{
	//1.生成随机数
    int ret = rand() % 100 + 1;  
	//%100的余数是0-99,然后+1,范围变成0-100
	//printf("%d\n", ret);
}
int main(void)
{
	int input = 0;
	
	srand((unsigned int)time(NULL));  //time()函数有参数的,这里不用它的参数,传入空值NULL
	//time() 需要引用头文件 #include<time.h>
	//把time()函数的返回类型强制改为unsigned int(srand的返回类型)
	//srand(100);   //这是错的,srand()需要一个变的量,才能生成随机值
	do
	{
		menu();   //打印菜单
		printf("请选择:>");  //选择玩还是不玩
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

2,猜数字

随机数生成搞了,下面开始优化猜数字步骤

猜数字可能猜好多次,这里用个while循环,每一次猜前都提示一下,printf("请猜数字:>“),这时候需要输入一个值,用scanf(),猜的数字需要存起来,所以声明一个变量guess。

如果玩家猜的数guess < 随机数ret,告诉玩家猜小了;

如果玩家猜的数guess > 随机数ret,告诉玩家猜大了;

如果玩家猜的数guess = 随机数ret,告诉玩家猜对了,这时候break跳出去。

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

}
void game()  //猜数字游戏的实现
{
	//1.生成随机数
	int ret = rand() % 100 + 1;  
	//%100的余数是0-99,然后+1,范围变成0-100
	//printf("%d\n", ret);

	//2.猜数字
	int guess = 0;
	while (1)   //值为真,可一直猜
	{
		printf("请猜数字:>");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}
int main(void)
{
	int input = 0;
	
	srand((unsigned int)time(NULL));  
    //time()函数有参数的,这里不用它的参数,传入空值NULL
	//time() 需要引用头文件 #include<time.h>
	//把time()函数的返回类型强制改为unsigned int(srand的返回类型)
	//srand(100);   //这是错的,srand()需要一个变的量,才能生成随机值
	do
	{
		menu();   //打印菜单
		printf("请选择:>");  //选择玩还是不玩
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

总结思路

先写出主框架:do while 循环,然后来到game()函数,生成随机数。

随机数怎么生成?调用rand()函数,而调用rand()之前又需要调用srand(),调用srand()的时候需要用到库函数time(),这样就生成了随机数,这个随机数 ret % 100 + 1就设置好了随机数的范围。

然后开始猜数字,猜的话1次可能要猜很多次,所以用了while循环去猜。

注意事项:猜大猜小的提示信息不能给错。在while循环外部先生成随机数,不能每猜一次都重新生成一个随机数,不然这样永远也猜不对。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值