【C语言小游戏--猜数字】

文章目录

  • 前言
  • 1.游戏描述
  • 2.代码实现
    • 2.1打印菜单
    • 2.2构建基础框架
    • 2.3玩游戏
      • 2.3.1生成随机数
        • 2.3.1.1rand()
        • 2.3.1.2srand()
        • 2.3.1.3time()
      • 2.3.2game()
    • 2.4自己设定猜的次数
  • 3.完整代码

前言

猜数字小游戏是我们大多数人学习C语言时都会了解到的一个有趣的C语言小游戏,下面我将详细介绍该游戏的实现和编程逻辑。玩小游戏的同时,也能对C语言控制语句有更好的认识。

在这里插入图片描述

1.游戏描述

电脑随机生成一个1-100的数字,玩家来猜。玩家可以根据自己需要,设置每次猜的次数。如果在设置的次数内猜对了,则提示你猜对了,否则提示猜错了。

2.代码实现

2.1打印菜单

我们在玩游戏前,都是先打印菜单,在进行选择。所以此处选择do-while循环

#include<stdio.h>
void menu()
{printf("***********************\n");printf("***  1.play  0.exit ***\n");printf("***********************\n");
}
int main()
{do{menu();} while (1);return 0;
}

效果展示:
在这里插入图片描述

2.2构建基础框架

选择1:玩游戏;
选择0:退出;
选择其它:重新选择

int main()
{int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:printf("玩游戏\n");break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择:\n");}} while (input);return 0;
}

效果展示:
在这里插入图片描述

2.3玩游戏

既然我们要玩猜数字游戏,那么我们选择1后,不能就打印一个玩游戏吧,因此下面来真正实现猜数字游戏。

2.3.1生成随机数

怎么才能生成随机数呢?
C语言提供了一个函数用来生成随机数

2.3.1.1rand()

在这里插入图片描述

查看文档我们发现:

  • rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是 依赖编译器上实现的,但是⼤部分编译器上是32767。
  • 在调用rand之前,使用srand函数为伪随机数生成器提供种子。
  • rand函数的使用需要包含⼀个头文件是:stdlib.h

什么意思呢?我们不妨写代码测试一下:
运行一下发现,确实产生了随机数。但是当我运行第二次发现,产生的随机数和第一次的一样,那怎么能行,这不是BUG吗?

在这里插入图片描述
在这里插入图片描述

如果再深⼊了解⼀下,我们就不难发现,其实rand函数⽣成的随机数是伪随机的,伪随机数不是真的随机数,是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽rand函数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。
之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦是1。 如果要⽣成不同的随机数,就要让种⼦是变化的。

种子要变化,我们再让种子是一个随机值不就行了嘛
NO,大漏特漏
如果这样的话,就死循环了

2.3.1.2srand()

刚才在文档中提到的一个srand是什么呢?
在这里插入图片描述

程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次生成的随机数序列也就变化起来了。
那也就是说给srand的种⼦如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随机数,这就又矛盾了

那电脑上什么东西是一直变化的呢?——时间

2.3.1.3time()

在这里插入图片描述

  • time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运行时间之间的差值,单位是秒。 如果
  • time()的参数timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳

如果是这样,我们就可以这样写代码:
在这里插入图片描述
在这里插入图片描述
这样我们发现数字就随机起来了,那我们的代码接下来可就好写咯。
我们需要的随机数是1-100之间的,所以我们可以这样写代码:
在这里插入图片描述

2.3.2game()

生成随机数

void game()
{srand((unsigned int)time(NULL));int random_number = rand() % 100 + 1;printf("%d\n", random_number);
}

效果如下:

在这里插入图片描述
但是如果你是老司机,手速比较快的话,生成的随机数会相同,如下:
在这里插入图片描述
这是为什么呢?
因为当我们运行一次game(),就会调用一次srand(),这样在较短时间内调用,就会产生相同的数字
因此,srand函数不需要频繁调用的,⼀次运⾏的程序中调用⼀次就够了。
所以,我们可以将其放在main()中

void game()
{int random_number = rand() % 100 + 1;int number = 0;while (1){printf("请猜数字:");scanf("%d", &number);if (number > random_number){printf("您猜大了\n");}else if (number < random_number){printf("您猜小了\n");}else{printf("恭喜你,猜对了!\n");break;}}
}

2.4自己设定猜的次数

用户自己输入次数,如果未在设置的次数中猜对,则提示失败
代码变动地方如下:

switch (input){case 1:printf("你感觉你几次就能猜对呢?\n");scanf("%d", &count);game(count);break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择:\n");}
void game(int count)
{int random_number = rand() % 100 + 1;int number = 0;while (count){printf("请猜数字:");scanf("%d", &number);if (number > random_number){printf("您猜大了\n");}else if (number < random_number){printf("您猜小了\n");}else{printf("恭喜你,猜对了!\n");break;}count--;}if (count == 0){printf("你未在规定的次数内猜对,有点高估自己了,还得练哦\n");}
}

效果如下:
在这里插入图片描述
在这里插入图片描述

3.完整代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{printf("***********************\n");printf("***  1.play  0.exit ***\n");printf("***********************\n");
}
void game(int count)
{int random_number = rand() % 100 + 1;int number = 0;while (count){printf("请猜数字:");scanf("%d", &number);if (number > random_number){printf("您猜大了\n");}else if (number < random_number){printf("您猜小了\n");}else{printf("恭喜你,猜对了!\n");break;}count--;}if (count == 0){printf("你未在规定的次数内猜对,有点高估自己了,还得练哦\n");}
}
int main()
{srand((unsigned int)time(NULL));int input = 0;int count = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:printf("你感觉你几次就能猜对呢?\n");scanf("%d", &count);game(count);break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择:\n");}} while (input);return 0;
}

本次分享就到这里啦,感谢您的观看
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/115008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Power BI 傻瓜入门 1. 数据分析术语:Power BI风格

本章内容包括&#xff1a; 了解Power BI可以处理的不同类型的数据了解您的商业智能工具选项熟悉Power BI术语 数据无处不在。从你醒来的那一刻到你睡觉的时候&#xff0c;某个系统会代表你收集数据。即使在你睡觉的时候&#xff0c;也会产生与你生活的某些方面相关的数据。如…

react封装一个简单的upload组件(待完善)

目录 react封装一个简单的upload组件component / uploadImg / uploadImg.jsx使用效果 react封装一个简单的upload组件 component / uploadImg / uploadImg.jsx import React, { useState } from react; import { LoadingOutlined, PlusOutlined } from ant-design/icons; imp…

基于SpringBoot的家具商城管理系统

基于SpringBoot的家具商城管理系统的设计与实现【文末源码】 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 家具详情 通知公告 登录界面 管理员界面 摘要 一段关于基于…

Vue3踩坑指南

vue.config.ts不起作用 关于项目 项目使用的还是vue-cli搭建的&#xff0c;底层还是webpack&#xff0c;没有使用新的vite搭建。 踩坑1&#xff1a;vue.config.ts不起作用 我本着既然是vue3 ts的项目&#xff0c;那么为了规范&#xff0c;项目中所有的js文件都得替换成ts文…

浅析人脸活体检测技术的功能及几种分类

在日常生活工作中&#xff0c;出现了人脸验证、人脸支付、人脸乘梯、人脸门禁等等常见的应用场景。这说明人脸识别技术已经在门禁安防、金融行业、教育医疗等领域被广泛地应用&#xff0c;人脸识别技术的高速发展与应用同时也出现不少质疑。其中之一就是人脸识别很容易被照片、…

03、Python 字符串高级用法

目录 Python 字符串高级用法转义字符字符串格式化序列相关的方法大小写相关的方法dir 可以查看某个类的所有方法删除空白查找、替换相关方法 Python 字符串高级用法 转义字符 字符串格式化 序列相关的方法 字符串本质就是由多个字符组成&#xff0c;字符串的本质就是不可变序…

为什么spring默认采用单例bean

概 述 熟悉 Spring开发的朋友都知道 Spring 提供了 5种 scope&#xff0c;分别是&#xff1a; singleton: 单例模式&#xff0c;当spring创建applicationContext容器的时候&#xff0c;spring会欲初始化所有的该作用域实例&#xff0c;加上lazy-init就可以避免预处理&#xf…

antd组件onChange回调,需要立即执行改变value与防抖节省接口开销。

文章目录 普通使用使用防抖节省开销页面功能复杂需要value受控回调需要部分代码立即执行&#xff0c;部分代码防抖延时执行useRefuseCallback 小结 普通使用 当我们使用Antd的input或者select进行搜索时&#xff0c;onChange回调会即时执行。 import { Input } from "an…

C语言之通讯录的实现篇优化版

目录 动态内存管理 通讯录声明 静态版本 动态版本 ​初始化通讯录 静态版本 动态版本 Add增加通讯录 静态版本 动态版本 Checkcapacity增容 DestroyContact释放动态空间 文件操作 SaveContact保存信息到文件中 初始化通讯录 旧版本 文件版本 LoadContact加载…

Openssl数据安全传输平台008:业务数据分析+工厂方法

文章目录 UML图1.1 客户端1.2 服务器端 UML图 1.1 客户端 // 准备要发送的数据 struct RequestMsg {//1 密钥协商 //2 密钥校验; // 3 密钥注销int cmdType; // 报文类型string clientId; // 客户端编号string serverId; // 服务器端编号string sign;string data; };1.2 服务器…

Unity之ShaderGraph如何实现UV抖动

前言 今天我们通过噪波图来实现一个UV抖动的效果。 如下图所示&#xff1a; 关键节点 Time&#xff1a;提供对着色器中各种时间参数的访问 UV&#xff1a;提供对网格顶点或片段的UV坐标的访问。可以使用通道下拉参数选择输出值的坐标通道。 SimpleNoise&#xff1a;根据…

Windows Server 2019 搭建FTP站点

目录 1.添加IIS及FTP服务角色 2.创建FTP账户&#xff08;用户名和密码&#xff09;和组 3.设置共享文件夹的权限 4.添加及设置FTP站点 5.配置FTP防火墙支持 6.配置安全组策略 7.客户端测试 踩过的坑说明&#xff1a; 1.添加IIS及FTP服务角色 a.选择【开始】→【服务器…

电流监测芯片SGM8199A2应用电路设计

SGM8199是一系列具有电压输出功能的双向电流监测芯片&#xff0c;用于监测共模电压范围内分流电阻上的压降&#xff0c;而不受电源电压的影响。该器件具有-0.1V至26V的宽共模电压范围输入。低偏移使得在监测电流时允许分流器上的满量程最大压降为10mV。SGM8199系列提供三种固定…

关于vant 的tabbar功能

1、想要实现tabbar页面A&#xff0c;其他的页面B&#xff08;非tabbar页面&#xff09;。 从A页面进入B页面&#xff0c;底部的active选中效果应该被取消掉&#xff0c;但是还是选中A。 按照官网的说法有两个方法 一、根据path路径 二、自定义的model 但是&#xff01;但是…

贪吃蛇项目实践

游戏背景&#xff1a; 贪吃蛇是久负盛名的游戏&#xff0c;它也和俄罗斯⽅块&#xff0c;扫雷等游戏位列经典游戏的⾏列。 实现基本的功能&#xff1a; 贪吃蛇地图绘制 蛇吃⻝物的功能 &#xff08;上、下、左、右⽅向键控制蛇的动作&#xff09; 蛇撞墙死亡 蛇撞⾃⾝死亡 计…

rust学习——栈、堆、所有权

文章目录 栈、堆、所有权栈(Stack)与堆(Heap)栈堆性能区别所有权与堆栈 所有权原则变量作用域所有权与函数返回值与作用域 栈、堆、所有权 栈(Stack)与堆(Heap) 栈和堆是编程语言最核心的数据结构&#xff0c;但是在很多语言中&#xff0c;你并不需要深入了解栈与堆。 但对于…

中间件安全-CVE复现WeblogicJenkinsGlassFish漏洞复现

目录 服务攻防-中间件安全&CVE复现&Weblogic&Jenkins&GlassFish漏洞复现中间件-Weblogic安全问题漏洞复现CVE_2017_3506漏洞复现 中间件-JBoos安全问题漏洞复现CVE-2017-12149漏洞复现CVE-2017-7504漏洞复现 中间件-Jenkins安全问题漏洞复现CVE-2017-1000353漏…

idea设置字体大小快捷键 Ctrl+鼠标上下滑 字体快捷键缩放设置

双击 按住ctrl鼠标滑轮上划放大就好了 这个双击设置为&#xff0c;Ctrl鼠标下滑 字体缩小就好了

手把手创建属于自己的ASP.NET Croe Web API项目

第一步&#xff1a;创建项目的时候选择ASP.NET Croe Web API 点击下一步&#xff0c;然后配置&#xff1a; 下一步&#xff1a;

Adobe Photoshop 基本操作

PS快捷键 图层 选择图层 Ctrl T&#xff1a;可以对图层的大小和位置进行调整 填充图层 MAC: AltBackspace (前景) or CtrlBackspace (背景) WINDOWS: AltDelete (前景) or CtrlDelete (背景) 快速将图层填充为前景色或背景色 平面化图层&#xff08;盖印图层&#xff09…