分支与循环语句练习——用C语言设计一个猜数字游戏把(随机数的生成)

前言


博客主页:干脆面la的主页

      为了能够获得更多关于使用分支与循环语句的经验,现在编写一个简单的游戏程序。这个程序产生一个1~100的随机数,用户尝试尽可能少的次数猜出这个数。

  • 如果认为博主的文章对你有所帮助
  • 欢迎三连加关注
  • 你们的支持是最我大的动力!

目录

前言

 1 下面是这个程序运行时用户将看到的

2 整体构思

2.1 main函数

2.2 menu()函数

2.3 game()函数

2.3.1 利用rand()函数生成1~100随机数

 2.3.2 srand()函数 

2.3.3 time函数

2.3.4 交互过程 

3 完整代码奉上 


正文开始...

 1 下面是这个程序运行时用户将看到的

  • 猜数字游戏
  • 电脑随机生成一个1~100之间数字
  • 用户猜小了,电脑会告诉:猜小了
  • 用户猜大了,电脑会告诉:猜大了
  • 玩家猜对了,电脑会告诉:恭喜你,猜对了

    运行结果如下:


2 整体构思

这个程序需要完成几个任务:

  1. 打印菜单
  2. 选择开始游戏 or 退出游戏
  3. 生成随机数
  4. 猜测神秘数
  5. 与用户交互直到选出正确数
  6. 选择继续开始游戏 or 退出游戏

因此我们可以写下主函数的框架:


2.1 main函数

分析过程:

  1. 进入程序需要先打印菜单,并且选择1(开始游戏)/0(结束游戏)来开始游戏或结束游戏。
  2. 我们知道当程序一运行起来就要打印菜单并且输入选择开始or结束,因此选择用do...while循环来编写程序。
  3. input就是我们选择的对菜单进行的选择1(开始游戏)/0(结束游戏),用input作为while的判断条件恰好使输入1的时候条件为真继续循环,而输入0的时候条件为假结束循环。
int main()
{
	int input = 0;
	do 
	{
		//打印菜单
		menu();
		printf("Please select:>");
		scanf("%d", &input);
		switch(input)
		{
		case 1://输入1开始游戏,调用game()函数
			game();
			break;
		case 0:
			printf("退出游戏\n");//输入0结束游戏,并且循环结束
			break;
		default:
			printf("选择错误\n");//输入其他数字会显示输入错误,并继续重新输入
			break;
		}
	} while (input);
	return 0;
}

2.2 menu()函数

menu函数的实现其实很简单,就是通过printf函数来打印相关内容

void menu()
{
	printf("**************************\n");
	printf("*****    1.start     *****\n");
	printf("*****    0.exit      *****\n");
	printf("**************************\n");
}

2.3 game()函数

分析过程:

  1. 电脑生成1~100随机数
  2. 用户猜数字
  3. 用户每猜一次就会告诉用户猜大or猜小
  4. 用户猜对了就返回主函数

    2.3.1 利用rand()函数生成1~100随机数

        C语言中生成随机数的方法是rand()函数

        我们先来通过文档看看该怎么使用rand函数

 转到定义得知RAND_MAX是一个十六进制数0x7fff也就是说返回一个十进制为0~32767的int

文档说到必须在使用rand函数前使用srand函数,我们尝试下如果不使用会怎么样:

void game()
{
	int r = rand();
	printf("%d\n", r);
}

第一次运行程序: 

第二次运行程序: 

 我们发现两次运行生成的随机数居然是相同的,这明显不是我们想要的结果。


 2.3.2 srand()函数 

srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。

 当我们将种子值设为1时,我们发现随机数都为41

void game()
{
	srand(1);
	int r = rand();
	printf("%d\n", r);
}

 当我们将种子值设为100时,随机数又全为365

 因此,种子值决定了随机数生成的值,因此我们要思考,什么参数是可以不断变化的,从而实现真正意义上的“随机”,这里我们可以将种子值设为不断变化的时间,这里我们又要引用time()函数。


2.3.3 time函数

 由于time返回的值是time_t,而time_t转为定义我们发现它实际上通过typedef定义的整型

而srand函数需要的参数是unsigned int,因此我们需要对time函数强制类型转换为unsigned int,通过整理,我们只需要把代码写成这样,就可以在真正意义上生成随机数。

void game()
{
	srand((unsigned int)time(NULL));//设置随机数的生成器
	int r = rand();
	printf("%d\n", r);
}

 但是这里还有一点是错误的,就是设置随机数的生成器只需要在整个工程中设置一次就可以了,如果在game()函数中创造随机数,如果输入快点会发现生成一样的随机数,如下图:

 因此我们把它放在main函数里才是正确的打开方式,这时我们无论输入多快,随机数值都不会重复,如下图: 

 

那么我们在设计程序时想要设置的数字时1~100之间的数字,我们要怎么做呢?

首先我们用r=rand()%100,r的范围就是0~99;

那么再加上1:r=rand()%100+1,r的范围就是1~100。

 至此我们就成功生成随机数了:


2.3.4 交互过程 

接下来就是猜数字及电脑与用户交互的过程,如下图代码:

void game()
{
	printf("请猜一个1~100的数字:>\n");
	//生成随机数
	int r = rand() % 100 + 1;
	int guess = 0;
	int count = 0;
	while(1)
	{
		scanf("%d", &guess);
		if (guess < r)
		{
			printf("猜小啦,请继续\n");
			count++;
		}
		else if (guess > r)
		{
			printf("猜大啦,请继续\n");
			count++;
		}
		else
		{
			printf("恭喜你,猜对啦!\n");
			count++;
			printf("总共猜了%d次~\n", count);
			break;
		}
	}
}

3 完整代码奉上 

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

void menu()
{
	printf("**************************\n");
	printf("*****    1.start     *****\n");
	printf("*****    0.exit      *****\n");
	printf("**************************\n");
}
void game()
{
	printf("请猜一个1~100的数字:>\n");
	//生成随机数
	int r = rand() % 100 + 1;
	int guess = 0;
	int count = 0;
	while(1)
	{
		scanf("%d", &guess);
		if (guess < r)
		{
			printf("猜小啦,请继续\n");
			count++;
		}
		else if (guess > r)
		{
			printf("猜大啦,请继续\n");
			count++;
		}
		else
		{
			printf("恭喜你,猜对啦!\n");
			count++;
			printf("总共猜了%d次~\n", count);
			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do 
	{
		//打印菜单
		menu();
		printf("Please select:>");
		scanf("%d", &input);
		switch(input)
		{
		case 1://进入游戏
			game();
			break;
		case 0://退出游戏
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

(完)

Guess you like

Origin blog.csdn.net/m0_63303316/article/details/122489732