当前位置: 首页 > article >正文

C语言基础(五)【控制语句与循环综合应用篇猜数字游戏】

文章目录

  • 前言
  • 一、实现一个猜数字游戏
  • 二、游戏实现的步骤
    • 1. 随机数生成
      • 1.1 rand
      • 1.2 srand
      • 1.3 time
      • 1.4 设置随机数的范围
    • 2. 菜单函数的实现
    • 3. 游戏函数的实现
  • 二、猜数字游戏的实现
    • 1. 不限制次数
    • 2. 限制次数为 5
  • 总结


前言

学习过前面有关控制语句跟循环的相关知识,可以实现一个有趣的猜数字游戏。


一、实现一个猜数字游戏

要求:
1.电脑自动生成 1 ~ 100 的随机数。
2.玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直
到猜对,游戏结束。
3.可增加难度: 玩家只有 5 次机会,如果 5 次都没有猜中,猜数字失败,游戏结束。


二、游戏实现的步骤

1. 随机数生成

1.1 rand

  1. C语言提供了一个函数叫 rand,这函数是可以生成随机数的,需要包含头文件

语法形式如下:

	int rand(void);                                          

示例:

#include<stdio.h>  
#include<stdlib.h>  
int main()  
{
	printf("%d\n", rand());  
	printf("%d\n", rand());  
	printf("%d\n", rand());  
	printf("%d\n", rand());  
	return 0;  
}

输出结果:
1.
在这里插入图片描述


在这里插入图片描述


注意:
1.rand 函数返回的是伪随机数(不是真正的随机数),这个随机数的范围是在 0 ~ RAND_MAX 之间,这个RAND_MAX的大小通常是依赖编译器上实现的,但是大部分编译器上是32767。所以说程序两次运行的结果是一样的。


2.rand 函数是对一个叫“种子”的基准值进行运算生成的随机数。因为 rand 函数生成随机数的默认种子是1,所以前面每次运行程序产生的随机数序列是一样的。如果要生成不同的随机数,需要让种子是变化的


这段文字有蓝是的是的

1.2 srand

1.C语言中又提供了一个函数叫 srand,用来初始化随机数的生成器的。

语法形式如下 :

	void srand(unsigned int seed);

注意:
在程序中使用 rand 函数生成随机数之前,通常会先调用 srand 函数,并通过传递一个参数(种子)给 srand 来初始化随机数生成器。种子决定了 rand 函数生成随机数序列的起点。如果每次种子都不同,则每次生成的随机数序列也会不同。


1.3 time

1.在程序中一般是使用程序运行的时间作为种子,因为时间时刻在发生变化的。

C语言中有个函数叫 time ,就可以获得这个时间,要包含头文件:time.h

语法形式:

	time_t time(time_t* timer);
1.time 函数的作用是获取当前时间,并将其转换为从特定起点(1970年1月1日0时 0分0秒)到当前时刻的秒数差,这个秒数差称为时间戳。

2.time 函数的返回值是 time_t 类型,这是一个能够存储时间戳的类型。

3.如果 timer 是一个非空指针(即指向一个有效的内存地址)time 函数会将当前时间的时间戳返回给调用者。这个时间戳存储在 timer 指针指向的内存位置。

4.如果 timer 是 NULL(空指针),意味着没有提供一个有效的内存地址,time 函数只返回当前时间的时间戳,但不会把时间戳存储在任何地方。

示例:

#include<stdio.h>  
#include<stdlib.h>  
#include<time.h>  
int main()  
{
	// 使用 time 函数的返回值设置种子  
	// 因为 srand 的参数是 unsigned int 类型,将 time 函数的返回值强制类型转换
	srand((unsigned int)time(NULL));  
	printf("%d\n", rand());  
	printf("%d\n", rand());  
	printf("%d\n", rand());  
	return 0  
}

输出结果:
1.
在这里插入图片描述
2.在这里插入图片描述

注意:
上面程序两次运行的结果不一样,则这段代码能获得真正的随机数
srand 函数是不需要频繁调用的,一次运行的程序中调用一次就够了


1.4 设置随机数的范围

1.如果要生成 0 ~ 99 之间的随机数

	rand() % 100; // 余数范围为 0 ~ 99  

2.如果要生成 1 ~ 100 之间的随机数

	rand() % 100 + 1; // 余数范围为 1 ~ 100  

3.如果要生成 100 ~ 200 的随机数

    // 余数范围 0 ~ 100,加上 100 后是 100 ~ 200  
	100 + rand() % (200 - 100 + 1);    

4.如果要生成 a ~ b 的随机数

	a + rand() % (b - a + 1);  

2. 菜单函数的实现

// 定义了一个名为 menu 的函数用来打印选项,void 表示没有返回值
void menu()
{
	printf("*******************************\n");
	printf("************ 1. play **********\n");
	printf("************ 0. exit **********\n");
	printf("*******************************\n");

}

3. 游戏函数的实现

// 定义一个名为 game 的函数(没有返回值),用于实现一个猜数字游戏               
void game()
{
	// r 为一个随机生成 1 ~ 100 的数字
	int r = rand() % 100 + 1;

	// 用于表示猜测的数字
	int guess = 0;
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &guess);

		if (guess > r)
		{
			// 表示猜测的数字大了
			printf("猜大了\n");
		}
		else if (guess < r)
		{
			// 表示猜测的数字小了
			printf("猜小了\n");
		}
		else
		{
			// 猜对数字,则跳出循环
			printf("猜对了\n");
			break;
		}
	}
}

二、猜数字游戏的实现

1. 不限制次数

1.完整代码

#include<stdio.h>
#include<stdlib.h>   // 包含标准库头文件,可使用 rand() 和 srand() 等函数
#include<time.h>     // 包含时间库头文件,可使用时间相关的函数,如 time()

// 定义一个名为 game 的函数(没有返回值),用于实现一个猜数字游戏               
void game()
{
	// r 为一个随机生成 1 ~ 100 的数字
	int r = rand() % 100 + 1;

	// 用于表示猜测的数字
	int guess = 0;
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &guess);

		if (guess > r)
		{
			// 表示猜测的数字大了
			printf("猜大了\n");
		}
		else if (guess < r)
		{
			// 表示猜测的数字小了
			printf("猜小了\n");
		}
		else
		{
			// 猜对数字,则跳出循环
			printf("猜对了\n");
			break;
		}
	}
}

// 定义了一个名为 menu 的函数用来打印选项,void 表示没有返回值
void menu()
{
	printf("*******************************\n");
	printf("************ 1. play **********\n");
	printf("************ 0. exit **********\n");
	printf("*******************************\n");

}

int main()
{
	int input = 0;

	// 设置随机数种子,使用当前时间作为种子,以确保每次运行程序时生成的随机数序列不同
	srand((unsigned int)time(NULL));

	// 使用 do - while 循环,用于重复显示菜单并处理输入的值,直到选择退出(0)
	do {
		menu();
		printf("请选择:>");
		scanf("%d", &input);

		// 使用 switch 语句根据输入的值执行不同的操作
		switch (input)
		{
			// 如果输入 1,则调用 game 函数开始游戏
			case 1:
				game();
				break;

			// 如果输入 0,打印 "游戏结束",然后跳出循环
			case 0:
				printf("游戏结束\n");
				break;

			// 如果输入的值既不是 1 也不是 0,打印错误信息,并重新选择
			default:
				printf("选择错误,请重新选择\n");
				break;
		}

	} while (input);

	return 0;
}

示例:

在这里插入图片描述


2. 限制次数为 5

#include<stdio.h>
#include<stdlib.h>   // 包含标准库头文件,可使用 rand() 和 srand() 等函数
#include<time.h>     // 包含时间库头文件,可使用时间相关的函数,如 time()

// 定义一个名为 game 的函数(没有返回值),用于实现一个猜数字游戏               
void game()
{
	// r 为一个随机生成 1 ~ 100 的数字
	int r = rand() % 100 + 1;

	// 用于表示猜测的数字
	int guess = 0;
	
	// 用于表示剩余的猜测次数,有 5 次机会
	int count = 5;
	while (count)
	{
		printf("\n你还有%d次机会\n", count);
		printf("请猜数字:>");
		scanf("%d", &guess);

		if (guess > r)
		{
			// 表示猜测的数字大了
			printf("猜大了\n");
		}
		else if (guess < r)
		{
			// 表示猜测的数字小了
			printf("猜小了\n");
		}
		else
		{
			// 猜对数字,则跳出循环
			printf("猜对了\n");
			break;
		}
		// 每次循环结束时,猜测次数减 1
		count--;
	}

	// 如果循环结束时 count 为 0,说明已经用完了所有猜测次数,打印失败信息和正确的数字
	if (count == 0)
	{
		printf("你失败了,正确的值是:%d\n", r);
	}
}

// 定义了一个名为 menu 的函数用来打印选项,void 表示没有返回值
void menu()
{
	printf("*******************************\n");
	printf("************ 1. play **********\n");
	printf("************ 0. exit **********\n");
	printf("*******************************\n");

}

int main()
{
	int input = 0;

	// 设置随机数种子,使用当前时间作为种子,以确保每次运行程序时生成的随机数序列不同
	srand((unsigned int)time(NULL));

	// 使用 do - while 循环,用于重复显示菜单并处理输入的值,直到选择退出(0)
	do {
		menu();
		printf("请选择:>");
		scanf("%d", &input);

		// 使用 switch 语句根据输入的值执行不同的操作
		switch (input)
		{
			// 如果输入 1,则调用 game 函数开始游戏
			case 1:
				game();
				break;

			// 如果输入 0,打印 "游戏结束",然后跳出循环
			case 0:
				printf("游戏结束\n");
				break;

			// 如果输入的值既不是 1 也不是 0,打印错误信息,并重新选择
			default:
				printf("选择错误,请重新选择\n");
				break;
		}

	} while (input);

	return 0;
}

示例:

在这里插入图片描述


总结

本篇文章详细介绍了如何使用C语言实现一个简单的猜数字游戏,包括如何使用rand()、srand() 和 time() 函数来生成随机数,使用 do - while 循环跟 switch 语句来进行选择等。


http://www.kler.cn/a/444803.html

相关文章:

  • C语言进阶(2) ---- 指针的进阶
  • MySQL中EXPLAIN详细讲解
  • OpenCV相机标定与3D重建(23)用于在图像上绘制世界坐标系的三条轴函数drawFrameAxes()的使用
  • ai绘图丨中国新年春节背景第二弹(附关键词
  • NSDT 3DConvert:高效实现大模型文件在线预览与转换
  • WebGIS城市停水及影响范围可视化实践
  • gcd 生成4d
  • 关于如何做技术文档
  • Android Java Ubuntu系统如何编译出 libopencv_java4.so
  • Linux文件属性 -- 文件大小
  • Suno Api V4模型无水印开发「续写」 —— 「Suno Api系列」第4篇
  • 自动图像标注可体验
  • day24文件操作--标准IO
  • 前端项目发布后打开报错Uncaught SyntaxError: Unexpected token ‘<‘ (at chunk-vendors)
  • 微信小程序实现画板画布自由绘制、选择画笔粗细及颜色、记录撤回、画板板擦、清空、写字板、导出绘图、canvas,开箱即用
  • [创业之路-199]:《华为战略管理法-DSTE实战体系》- 3 - 价值转移理论与利润区理论
  • 基于Spring Boot的校园车辆管理系统
  • 鸿蒙NEXT游戏|Cocos参展2024华为开发者年度盛典
  • 【时时三省】(C语言基础)通讯录1
  • 理解支持向量机
  • FPGA实现MIPI转FPD-Link车载同轴视频传输方案,基于IMX327+FPD953架构,提供工程源码和技术支持
  • STM32之HAL例程-FreeRTOS任务调度流程
  • 罗德与施瓦茨ZN-Z129E网络分析仪校准套件具体参数
  • Zerotier + VSCode远程连接实验室的服务器、Xshell连接远程服务器
  • OpenEuler 22.03 安装 flink-1.17.2 集群
  • 相机雷达外参标定综述“Automatic targetless LiDAR–camera calibration: a survey“