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

C语言实战项目(1)---------->猜数字游戏

在学习完循环和选择结构之后,我们可以做一个猜数字游戏。在此项目之前,如果还不会C语言的if语句、switch语句等组成选择结构的语句,while循环、for循环、do-while循环等组成循环结构的语句。可以参考我之前的博客:

C语言(7)------------>if语句  CSDN

C语言(10)------------->switch语句 CSDN

C语言(11)------------->while循环  CSDN

C语言(12)--------->for循环  CSDN

C语言(13)------------>do-while循环 CSDN

C语言番外篇(3)------------>break、continue CSDN

在本篇文章中,我将介绍一个猜数字游戏,除了使用了C语言的选择和循环结构外,还使用到了rand函数和srand函数和time函数。函数章节暂时还没有讲解,但是这里不影响我们做出一个猜数字游戏,我都会对这些函数进行介绍以及如何使用。

猜数字的实现流程大致如下:

菜单的设计----->进入游戏信息的提示---->选择游戏是否进行------>进入游戏----->猜数字游戏的实现

为了让读者体会到设计的过程,我将抽丝剥茧般地讲解,所以整个文章的末尾将给出全部的源代码。

一、菜单的设计

我们常见的游戏菜单进入界面是有开始游戏键和退出游戏键,在本程序中输入数字1表示开始游戏,输入数字0表示退出游戏。

参考代码: 

#include <stdio.h>int main()
{printf("***********************\n");printf("******* 1 .PLAY  ******\n");printf("******* 0 .EXIT  ******\n");printf("***********************\n");return 0;
}

运行结果:

二、 进入游戏信息的提示

使用printf函数提示输入数字,并使用scanf函数输入数字。

参考代码: 

#include <stdio.h>int main()
{int input = 0;//使用do-while循环的原因是因为游戏界面至少会显示一次do{//菜单的设计printf("***********************\n");printf("******* 1 .PLAY  ******\n");printf("******* 0 .EXIT  ******\n");printf("***********************\n");//选择信息printf("请选择:>\n");scanf("%d", &input);} while (input);//使用input作为循环条件的原因是因为当我们输入了0,也就是退出游戏,恰好用于结束循环条件return 0;
}

运行结果:

三、游戏的进入与退出

 使用scanf函数输入数字,选择是否进入游戏。

输入1进入游戏,输入0退出游戏。输入1和0外的数字将提示输入错误重新输入数字。

当输入的数字是0,循环条件为假跳出循环,同时实现了结束游戏的目的。

 参考代码: 

#include <stdio.h>int main()
{int input = 0;//使用do-while循环的原因是因为游戏界面至少会显示一次do{//菜单的设计printf("***********************\n");printf("******* 1 .PLAY  ******\n");printf("******* 0 .EXIT  ******\n");printf("***********************\n");//选择信息printf("请选择:>\n");scanf("%d", &input);//进入模式switch (input){case 1:printf("开始游戏\n");break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);//使用input作为循环条件的原因是因为当我们输入了0,也就是退出游戏,恰好用于结束循环条件return 0;
}

运行结果:

四、游戏逻辑的实现 

 实现猜数字游戏逻辑前我们先介绍一下三个函数 rand、srand、time。

(1)rand函数

rand函数定义在stdlib.h中,使用time函数需要引用此头文件。它用于产生伪随机数字,但是此随机数字是基于种子1产生的。当我们运行两次后生成的数字是一样的。生成的伪随机数字的范围是0~0x7fff。而0x7fff这个数字就是32767,这个可以使用16进制计算出来。也可以在程序中打印出来。

参考代码:

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

运行结果:

rand函数使用参考代码:

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

第一次运行:

 第二次运行:

 我们可以看到两次运行结果产生的随机数字确实是一样的。

(2)time函数

time函数定义在time.h中,使用time函数需要引用此头文件。

它的返回类型是time_t,本质上是32位或64位的整型。返回的是一个时间戳。

它的参数是一个指针。即 time_t* timer

(3)srand函数

刚刚的例子中,大家可能好奇的是为什么要介绍time函数呢?这个就和我们的srand函数有关系了。srand函数的参数用于输入一个unsigned类型的种子。我们知道种子要是随机的才好,时间是一直流动的。所以时间戳一定不会重复。用time函数恰好能够解决我们的问题。

我们可以尝试一下使用srand函数之后的rand函数生成的随机数字。

参考代码:

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

第一次运行结果:

 第二次运行结果:

我们可以发现,这个时候生成的随机数字是不一样的了。 

介绍完这三个函数后,我们来实现游戏逻辑。

参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main()
{int input = 0;//使用do-while循环的原因是因为游戏界面至少会显示一次do{//菜单的设计printf("***********************\n");printf("******* 1 .PLAY  ******\n");printf("******* 0 .EXIT  ******\n");printf("***********************\n");//选择信息printf("请选择:>\n");scanf("%d",&input);//进入模式switch (input){case 1:printf("开始游戏\n");srand((unsigned int)time(NULL));//用于产生rand函数的随机种子int ret=rand()%100+1;//用于产生1~100的数字//用户输入数字while (1){printf("请猜数字:>\n");int guess = 0;scanf("%d", &guess);//判断数字是否相等if (guess > ret){printf("猜大了\n");}else if (guess < ret){printf("猜小了\n");}else{printf("恭喜您,猜对了\n");break;}}break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);//使用input作为循环条件的原因是因为当我们输入了0,也就是退出游戏,恰好用于结束循环条件return 0;
}

 运行结果:

 为保证游戏公平,随机种子应当放在do-while循环前面。因为srand的随机种子是根据时间戳实现的。

参考代码:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main()
{int input = 0;//用于产生rand函数的随机种子srand((unsigned int)time(NULL));//使用do-while循环的原因是因为游戏界面至少会显示一次do{//菜单的设计printf("***********************\n");printf("******* 1 .PLAY  ******\n");printf("******* 0 .EXIT  ******\n");printf("***********************\n");//选择信息printf("请选择:>\n");scanf("%d",&input);//进入模式switch (input){case 1:printf("开始游戏\n");int ret=rand()%100+1;//用于产生1~100的数字//用户输入数字while (1){printf("请猜数字:>\n");int guess = 0;scanf("%d", &guess);//判断数字是否相等if (guess > ret){printf("猜大了\n");}else if (guess < ret){printf("猜小了\n");}else{printf("恭喜您,猜对了\n");break;}}break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);//使用input作为循环条件的原因是因为当我们输入了0,也就是退出游戏,恰好用于结束循环条件return 0;
}

 运行结果:

其实菜单和游戏逻辑的实现也可以封装成一个函数,这样使得代码更加方便阅读。考虑部分读者没有学习过C语言的函数的部分,此部分可以选择性查看。

参考代码:

#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()
{int ret = rand() % 100 + 1;//用于产生1~100的数字while (1){printf("请猜数字:>\n");int guess = 0;scanf("%d", &guess);//判断数字是否相等if (guess > ret){printf("猜大了\n");}else if (guess < ret){printf("猜小了\n");}else{printf("恭喜您,猜对了\n");break;}}
}int main()
{int input = 0;//用于产生rand函数的随机种子srand((unsigned int)time(NULL));//使用do-while循环的原因是因为游戏界面至少会显示一次do{//菜单的设计Menu();//选择信息printf("请选择:>\n");scanf("%d",&input);//进入模式switch (input){case 1:printf("开始游戏\n");Game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);//使用input作为循环条件的原因是因为当我们输入了0,也就是退出游戏,恰好用于结束循环条件return 0;
}

运行结果:

相关文章:

C语言实战项目(1)---------->猜数字游戏

在学习完循环和选择结构之后&#xff0c;我们可以做一个猜数字游戏。在此项目之前&#xff0c;如果还不会C语言的if语句、switch语句等组成选择结构的语句&#xff0c;while循环、for循环、do-while循环等组成循环结构的语句。可以参考我之前的博客&#xff1a; C语言&#xf…...

web理论总结

1.网页&#xff1b;可以承载各种网址应用和信息的容器&#xff0c;所有可视化的内容都会通过网页展示给用户。 2.网页主要由文字&#xff0c;图像和超链接等元素构成。还可以包含音频&#xff0c;视频以及动画等。 网页分为静态网页&#xff0c;动态网页大部分网页静动结合。…...

Failed to start The PHP FastCGI Process Manager.

报错如下&#xff1a; Job for php-fpm.service failed because the control process exited with error code. See "systemctl status php-fpm.service" and "journalctl -xe" for details. 2月 25 21:49:00 nginx systemd[1]: Starting The PHP FastC…...

001 Kafka入门及安装

Kafka入门及安装 文章目录 Kafka入门及安装1.介绍Kafka的基本概念和核心组件 2.安装1.docker快速安装zookeeper安装kafka安装 添加topic删除topickafka-ui安装 来源参考的deepseek&#xff0c;如有侵权联系立删 1.介绍 Kafka的基本概念和核心组件 Kafka是分布式流处理平台&a…...

【paddle】详解 padde.autograd.backward

目录 backward二次函数案例paddle 代码pytorch 代码 backward paddle.autograd.backward(tensors, grad_tensorsNone, retain_graphFalse)[源代码] 参数 tensors (list[Tensor]) – 将要计算梯度的 Tensors 列表。Tensors 中不能包含有相同的 Tensor。grad_tensors (None|list…...

飞腾腾锐D2000 + OpenHarmony 4.1release部署deepseek大模型

简介 1.1 飞腾腾锐D2000 飞腾腾锐D2000是一款面向桌面应用的高性能通用处理&#xff0c;集成8个飞腾自主研发的高能效处理器核FTC663&#xff0c;兼 容64位ARMv8指令集并支持ARM64和ARM32两种执行模式&#xff0c;支持单精度、双精度浮点运算指令和ASIMD处理 指令&#xff0c;主…...

【REST2SQL】15银河麒麟系统下达梦数据库部署REST2SQL

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…...

晶体管输出光耦和逻辑输出光耦

晶体管输出光耦&#xff08;非线性&#xff09;和逻辑输出光耦&#xff08;线性&#xff09;的区别&#xff1a; 逻辑输出光耦的电流传输特性曲线是非线性的&#xff0c;适合于开关信号的传输&#xff0c;不适合于传输模拟量&#xff1b; 光电晶体管输出光耦的电流传输特性是线…...

智能生活综合平台需求规格说明书

一、引言 1.1 编写目的 本需求规格说明书旨在明确智能生活综合平台的功能、性能、用户界面等方面的需求&#xff0c;为平台的开发、测试和部署提供详细的指导&#xff0c;确保平台能够满足用户在社交、购物、教育、医疗、政务等多个领域的智能生活需求&#xff0c;提升用户的…...

绕过过滤order by

一、常见绕过技术 1、注释符截断 利用注释符&#xff08;如 --、#&#xff09;截断后续查询&#xff0c;消除过滤逻辑的影响。 ORDER BY 1-- 若原查询为 SELECT * FROM table ORDER BY 用户输入&#xff0c;注入后可能忽略后续过滤逻辑。 2、大小写混淆/编码绕过 若过滤是大…...

计算机网络之传输层(传输层的功能)

一、数据分段与重组 传输层从会话层接收数据&#xff0c;并将其分割成较小的数据段&#xff0c;以适应网络层的最大传输单元&#xff08;MTU&#xff09;限制。在目的端&#xff0c;传输层负责将这些数据段重新组合成原始数据&#xff0c;确保数据的完整性和正确性。 二、端口…...

面试八股文--数据库基础知识总结(1)

1、数据库的定义 数据库&#xff08;DataBase&#xff0c;DB&#xff09;简单来说就是数据的集合数据库管理系统&#xff08;Database Management System&#xff0c;DBMS&#xff09;是一种操纵和管理数据库的大型软件&#xff0c;通常用于建立、使用和维护数据库。数据库系统…...

优化 Flink 消费 Kafka 数据的速度:实战指南

在使用 Flink 消费 Kafka 数据时&#xff0c;你可能会遇到 消费速率较慢 的问题。本文将从 Kafka 并行消费、批量拉取、Checkpoint 频率、Consumer Poll 速率 以及 Flink 任务 Slot 资源 等多个方面&#xff0c;详细解析如何优化 Flink 消费 Kafka 的速度。 &#x1f525; 1. 增…...

轮式机器人在复杂地形中如何选择合适的全局路径规划算法?

已思考完成 收起 嗯&#xff0c;用户问的是轮式机器人在复杂地形中如何选择合适的全局路径规划算法。首先&#xff0c;我需要理解复杂地形可能带来的挑战&#xff0c;比如崎岖的路面、动态障碍物、非结构化环境等等。轮式机器人在这里的运动控制需要考虑地形通过性、稳定性&…...

数据结构与算法:动态规划dp:买卖股票相关力扣题(下):309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费

309. 买卖股票的最佳时机含冷冻期 首先我们要明确&#xff0c;如果全程只能买卖一次或者允许买卖多次&#xff0c;那么我们就没必要记录无操作这个状态。 如果买卖的次数为k&#xff08;k≥2&#xff09;&#xff0c;那么我们才要记录无操作这个状态&#xff0c;以此来区分具体…...

[uboot][stm32]配置LTDC屏幕

文章目录 前提dts设备树修改Kconfig日志打印后记 https://github.com/wdfk-prog/u-boot 前提 手上刚好有块屏幕,尝试在uboot中点亮一下使用前请使用其他手段点亮该屏幕确保屏幕的完好再进行操作.确保配置的参数及引脚是可用的. dts设备树修改 ltdc状态修改为重定向前绑定,另…...

机试刷题_1614. 括号的最大嵌套深度【python】

1614. 括号的最大嵌套深度 class Solution:def maxDepth(self, s: str) -> int:maxD 0if not s:return maxDstack []for char in s:if char(:stack.append(char)maxD max(maxD,len(stack))elif char) :stack.pop()return maxD...

VM虚拟机安装与配置Ubuntu Linux操作系统详细教程~

一、下载VM虚拟机 VMware16.0.zip百度网盘下载链接:https://pan.baidu.com/s/1-l-CcAVNINqhRLSiQ26R7w?pwd=tznn 提取码: tznn 二、软件介绍 VMware(虚拟机)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,通过它可在一台电脑上同…...

2025年2月科技热点深度解析:AI竞赛、量子突破与开源革命

引言 2025年的科技领域持续呈现爆发式增长&#xff0c;AI大模型竞争白热化、量子计算商业化加速、开源工具生态繁荣成为本月最受关注的议题。本文结合最新行业动态&#xff0c;从技术突破、商业布局到开发者生态&#xff0c;全面解析当前科技热点&#xff0c;为读者提供深度洞…...

免费PDF工具

Smallpdf.com - A Free Solution to all your PDF Problems Smallpdf - the platform that makes it super easy to convert and edit all your PDF files. Solving all your PDF problems in one place - and yes, free. https://smallpdf.com/#rappSmallpdf.com-解决您所有PD…...

组件注册方式、传递数据

组件注册 一个vue组件要先被注册&#xff0c;这样vue才能在渲染模版时找到其对应的实现。有两种注册方式&#xff1a;全局注册和局部注册。&#xff08;组件的引入方式&#xff09; 以下这种属于局部引用。 组件传递数据 注意&#xff1a;props传递数据&#xff0c;只能从父…...

IPD流程适合创业团队吗?

目录 简介 创业团队 作者简介 简介 回答这个问题&#xff0c;就不能只局限于 IPD 流程本身。 而是要先回答为什么需要 IPD 流程&#xff1f; 在 IPD 思维这篇文章&#xff0c;我也强调过这个观点&#xff1a; IPD 本身是为过剩经济量身定做的一种模式、一种思维。 包括…...

异步fifo学习

FIFO 本质是由 RAM 加上读写逻辑构成的先入先出的数据缓冲器。与 RAM 的区别是 FIFO 没有外部读写地址线&#xff0c;顺序写入顺序读出数据&#xff0c;其数据地址是由内部读写指针自增完成&#xff0c;因此 FIFO 在读写时不需要考虑读写冲突的问题。 根据 FIFO 工作的时钟域&a…...

【有啥问啥】All-to-All 通信:原理、实现与应用

All-to-All 通信&#xff1a;原理、实现与应用 一、引言 在分布式计算和并行处理领域&#xff0c;进程之间的通信是至关重要的。All-to-All 通信作为一种高效的通信模式&#xff0c;广泛应用于各种高性能计算和分布式系统中。本文将详细介绍 All-to-All 通信的定义、工作原理…...

深度学习(3)-TensorFlow入门(常数张量和变量)

低阶张量操作是所有现代机器学习的底层架构&#xff0c;可以转化为TensorFlow API。 张量&#xff0c;包括存储神经网络状态的特殊张量&#xff08;变量&#xff09;​。 张量运算&#xff0c;比如加法、relu、matmul。 反向传播&#xff0c;一种计算数学表达式梯度的方法&…...

Python学习第十七天之PyTorch保姆级安装

PyTorch安装与部署 一、准备工作二、pytorch介绍三、CPU版本pytorch安装1. 创建虚拟环境2. 删除虚拟环境1. 通过环境名称删除2. 通过环境路径删除 3. 配置镜像源4. 安装pytorch1. 首先激活环境变量2. 进入pytorch官网&#xff0c;找到安装指令 5. 验证pytorch是否安装成功 四、…...

HTML邮件的制作以及遇到的问题

以下是关于HTML邮件制作的详细步骤以及可能遇到的问题和解决办法&#xff1a; 一、HTML邮件制作步骤 规划邮件结构&#xff1a;确定邮件的主题、主要内容、目标受众等。比如是营销推广邮件、新闻通讯邮件还是通知邮件等。例如&#xff0c;营销推广邮件可能需要突出产品特点和…...

GPT-5倒计时:2025年AI海啸来袭,机器与人类对话临近

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 人工智能&AIGC术语100条 Shelly聊AI-重…...

ADC采集的电压误差比较大怎么办?

目录 1、电源噪声和电源不稳定 2、参考电压不稳定或不准确 3、采样电路设计不合理 4、温度影响 5、软件校准和误差修正 6、时钟抖动 ADC&#xff08;模数转换器&#xff09;采集的电压误差可能会受到多种因素的影响&#xff0c;要有效减少误差&#xff0c;需要从硬件和软…...

【单片机】MSP430MSP432入门

文章目录 0 前言1 开发方式选择2 CCS和开发相关软件3 Keil开发MSP4324 IAR for 430开发MSP4305 总结 0 前言 最近因为想学DSP&#xff0c;所以把之前卸载的CCS给装回来了&#xff0c;手头也还有之前电赛剩下的MSP430和MSP432的板子&#xff0c;由于年代久远&#xff0c;想着花点…...