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

embedded/2024/12/21 17:01:03/

文章目录

  • 前言
  • 一、实现一个猜数字游戏
  • 二、游戏实现的步骤
    • 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;}// 每次循环结束时,猜测次数减 1count--;}// 如果循环结束时 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.ppmy.cn/embedded/147574.html

相关文章

系统设计:微服务架构的可扩展性系统 详解

在本文中&#xff0c;我们将设计一个基于微服务架构的可扩展系统。我将详细解释每个设计步骤的底层原理&#xff0c;并清晰推导每个决策背后的原因&#xff0c;以便让新同志们能够清楚理解为什么这样设计以及如何实现。 一、可扩展系统的核心需求 在设计一个可扩展性系统时&am…

django的model中定义【记录修改次数】的这个字段该用什么类型

django中定义对于某个文章应用的数据库中使用到记录修改次数的这个字段 如models.py中的配置 from django.db import models from django.utils import timezone from django.contrib.postgres.fields import ArrayFieldclass Article(models.Model):# Titlestitle_cn model…

高性能KPC354x国产光电耦合器:适用于现代应用

KPC354x国产光电耦合器是一种多功能高效组件&#xff0c;旨在为复杂的电子系统提供可靠的电气隔离和信号传输。其坚固的设计加上高性能规格使其成为从工业自动化到通信系统和消费电子产品等应用的重要组成部分。通过提供耐用性、适应性和环境合规性的平衡&#xff0c;KPC354x脱…

Moretl开箱即用日志采集

永久免费: 至Gitee下载 使用教程: Moretl使用说明 使用咨询: 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架…

数据结构之旅:红黑树如何驱动 Set 和 Map

一、红黑树 1、定义 红黑树是一种二叉搜索树&#xff0c;在每个节点上增加一个存储位表示结点的颜色(红色或者黑色)。通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保不会有一条路径比其他路径长出两倍&#xff0c;因而这种树是一种接近平衡的…

阻塞队列与线程池原理

1、阻塞队列 阻塞队列&#xff1a;当队列已满的时候&#xff0c;向队列中添加元素的操作会被阻塞&#xff1b;当队列为空的时候&#xff0c;从队列中取元素的操作会被阻塞。 Java 中用 BlockingQueue 接口表示阻塞队列。BlockingQueue 接口作为 Queue 的子接口&#xff0c;主…

软件测试工程师面试整理 —— 编程与自动化!

在软件测试领域&#xff0c;编程与自动化是提升测试效率、覆盖率和可靠性的关键因素。掌握编程技术和自动化测试框架&#xff0c;能够帮助测试人员有效地执行大量重复性测试任务&#xff0c;并迅速反馈软件的质量状况。以下是编程与自动化在测试中的主要应用及相关技术介绍&…

网络直播带货查询系统设计与实现:SSM + JAVA 核心架构与 JSP 支撑

第四章 系统设计 4.1 系统体系结构 网络直播带货网站的结构图4-1所示&#xff1a; 图4-1 系统结构 模块包括主界面&#xff0c;主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等进行相应的操作。 登录系统结构图&#xff0c;如图4-2所示&#xf…