【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.hqwc.cn/news/144988.html

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

相关文章

如何处理前端文件上传?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【网络编程】应用层——HTTP协议

文章目录 一、HTTP协议简介二、认识URL三、HTTP协议格式1. HTTP请求协议格式2. HTTP响应协议格式 三、构建HTTP请求和响应四、HTTP的方法五、HTTP的状态码六、HTTP常见的Header七、Cookie和Session 一、HTTP协议简介 HTTP 协议 是 Hyper Text Transfer Protocol&#xff08;超文…

专业安卓实时投屏软件:极限投屏(QtScrcpy作者开发)使用说明

基本介绍 极限投屏是一款批量投屏管理安卓设备的软件&#xff0c;是QtScrcpy作者基于QtScrcpyCore开发&#xff0c;主要功能有&#xff1a; 设备投屏&控制&#xff1a;单个控制、批量控制分组管理wifi投屏adb shell快捷指令文件传输、apk安装 更多功能还在持续更新。 极…

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

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

『C++ - 模板』之模板进阶

文章目录 模板进阶非类型模板参数类型模板参数与非类型模板参数的不同 模板的特化全特化偏特化全特化与偏特化的区别 模板的分离编译解决办法 总结 模板进阶 非类型模板参数 类型模板参数与非类型模板参数的不同 类型模板参数非类型模板参数 ​ 类型模板参数一般用来设置模…

RK3568平台 GPIO子系统框架

一.gpio 子系统简介 gpio 子系统顾名思义&#xff0c;就是用于初始化 GPIO 并且提供相应的 API 函数&#xff0c;比如设置 GPIO为输入输出&#xff0c;读取 GPIO 的值等。gpio 子系统的主要目的就是方便驱动开发者使用 gpio&#xff0c;驱动 开发者在设备树中添加 gpio 相关信…

互联网Java工程师面试题·Java 面试篇·第五弹

目录 79、适配器模式和装饰器模式有什么区别&#xff1f; 80、适配器模式和代理模式之前有什么不同&#xff1f; 81、什么是模板方法模式&#xff1f; 82、什么时候使用访问者模式&#xff1f; 83、什么时候使用组合模式&#xff1f; 84、继承和组合之间有什么不同&#…

Lake Formation 和 IAM 之间的区别与联系

IAM 和 Lake Formation 都是 AWS 上的权限管理服务,且默认都是自动开启并生效的,只是如果你没有特别配置过它们,可能感觉不到它们的存在,特别是Lake Formation(后文简写为 LF),通常情况下都是“透明”的,但它确实在每次请求时进行了权限检查。本文会详细介绍一下两者之…

【LeetCode力扣】234 快慢指针 | 反转链表 | 还原链表

目录 1、题目介绍 2、解题思路 2.1、暴力破解法 2.2、快慢指针反转链表 1、题目介绍 原题链接&#xff1a; 234. 回文链表 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1]输出&#xff1a;true 示例 2&#xff1a; 输入&am…

解决使用WebTestClient访问接口报[185c31bb] 500 Server Error for HTTP GET “/**“

解决使用WebTestClient访问接口报[185c31bb] 500 Server Error for HTTP GET "/**" 问题发现问题解决 问题发现 WebTestClient 是 Spring WebFlux 框架中提供的用于测试 Web 请求的客户端工具。它可以不用启动服务器&#xff0c;模拟发送 HTTP 请求并验证服务器的响…

2023最新UI酒桌喝酒游戏小程序源码 娱乐小程序源码 带流量主

2023最新UI酒桌喝酒游戏小程序源码 娱乐小程序源码 带流量主 修改增加了广告位&#xff0c;根据文档直接替换&#xff0c;原版本没有广告位 直接上传源码到开发者端即可 通过后改广告代码&#xff0c;然后关闭广告展示提交&#xff0c;通过后打开即可 无广告引流 流量主版…

Jupyter Notebook 设置黑色背景主题

Jupyter Notebook 设置黑色背景主题 # 包安装 pip install jupyterthemes -i https://mirrors.aliyun.com/pypi/simple pip install --upgrade jupyterthemes # 查看可用主题 jt -l # monokai暗背景&#xff0c;-f(字体) -fs(字体大小) -cellw(占屏比或宽度) -ofs(输出段的字…