有趣的代码——猜数字游戏的实现

前面介绍过很多的C语言常识,但是我们都知道“兴趣是最好的老师”,所以,今天我们用之前讲过的一些知识,加上部分新补充的知识点,写一个“猜数字”的小游戏,来丰富我们的编程学习生活,感受来自C语言的趣味性。

目录

1.猜数字游戏的大致流程

2.游戏实现的思路

3.随机数生成

3.1rand

3.2srand

3.3time

3.4随机数范围设置

4.猜数字游戏的代码实现

5.猜数字游戏的优化


1.猜数字游戏的大致流程

首先由计算机产生一个随机数,并给出这个随机数所在的区间,然后由玩家来猜测这个数,如果玩家猜中这个数,则显示成功并结束本轮游戏,如果猜测次数超过8次,则显示猜测失败并结束本轮游戏。

2.游戏实现的思路

我们在写编程题或者小游戏代码时,最重要的就是理清思路——主体是什么?为了实现目的要创建哪些函数?函数的功能都是什么?只有当我们心中有了一个大体的框架,知道该做些什么时,我们才能更高效地编写代码,完成程序设计。

猜数字游戏的算法如下:

1.提供游戏菜单,由玩家选择是否进行游戏:按“1”开始游戏,按“0”推出游戏,按其他则显示“选择错误,请重新选择”。

2.开始游戏后,先初始化猜测次数count = 0;

3.重复执行下述操作,直到count达到8次:

        3.1玩家输入一个数guess(进行猜测);

        3.2count++;

        3.2如果guess等于secret(计算机产生的随机数),跳出循环;否则显示“错了,请重新猜!你还有8-count次猜测次数,请把握好机会!”

4.如果count达到8次,则显示“超过次数,游戏结束!”;否则,显示“恭喜,猜对了!共猜测count次!”

如上面所示,这就是猜数字游戏大体框架的算法呈现。

我们在思考大体框架时不用过多在意具体函数的实现方法,可以先起个能表达其功能的函数名并把它放在需要的位置。(说白了就是先搞一个空壳函数占位置,等到大体框架调试完毕不再有问题后,再去实现这些空壳函数)大体框架代码如下:

#iclude<stdio.h>int main()
{int secret;//随机数怎么建立呢?我们好像暂时也不清楚,那么就先假设一个空壳的,不用在意它。int input;do{    //menu函数在调试大体框架时,也可以是空壳函数menu();//打印游戏菜单。我们建立函数可以让主函数不至于太过冗长,而且增加了代码的可读性,使程序模块化。printf("请选择:>");scanf("%d", &input);switch(input){case 1:guess(secret);//guess是用来猜测并判断是否正确的函数,这里也是空壳函数break;case 0:printf("游戏结束\n");break;default:printf("选择错误,请重新选择\n");break;}}while(input);return 0;
}

上面的guess函数就是个空壳函数,我们可以在把主体框架完成后再去实现。而guess函数的功能就是:

①guess(玩家猜测数)= secret,则显示“恭喜,猜对了!同猜测count次!”;

②guess(玩家猜测数)!= secret,则显示“错了,请重新猜!你还有8-count次猜测机会,请把握好机会!”

guess函数的代码实现如下:

void guess(int secret)
{int guess= 0, count = 0;do{printf("请输入一个整数>:");scanf("%d", &guess);count++;if(guess == secret) break;else pritnf("错了,请重新猜!你还有%d猜测次数,请把握好机会\n",8-count);}while(count<8);if(count < 8)printf("恭喜,猜对了!共猜测%d次!\n",count);elseprintf("超过次数,游戏结束!\n");}

menu函数的代码实现如下:

void menu()
{printf("***********************\n");printf("****** 1. play ******\n");printf("****** 0. exit ******\n");printf("***********************\n");
}
3.随机数生成

上面我们已经把大体框架和空壳函数都实现,按照正常情况我们的代码已经完成了,只需要调试使其能正常运行即可,但是在这个游戏中我们还需要补充一个新的知识点——随机数的生成。

3.1rand

C语言提供了随机数生成函数rand,该函数返回0~RAND_MAX的一个随机整数,RAND_MAX是在头文件stdlib.h中定义的符号常量,其值与机器字长和编程环境有关,一般为2^15-1或2^31-1。

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());printf("%d\n", rand());return 0;
}

大家可以测试两次上面的数据,然后大家会发现随机数的建立到这一步还没有结束。😏

下面是我的代码两次运行结果,大家品一品

我们可以看到虽然一次运行中产生的5个数字是相对随机的,但是下一次运行程序生成的结果和上一次一模一样,这就说明有点问题。 如果再深入了解一下,我们就不难发现,其实rand函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数,而真正的随机数的是无法预测下一个值是多少的。

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

3.2srand

C语言提供了库函数srand初始化随机种子,例如可以调用库函数time得到当前的系统时间,将当前系统时间作为随机种子。

srand函数的原型为:

void srand (unsigned int seed);

程序中在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随 机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。那也就是说给srand的种子是如果是随机的,rand就能生成随机数;在生成随机数的时候又需要一个随机数,这就矛盾了,该怎么解决呢? 

3.3time

C语言提供一个函数time,用来获得系统时间。

time函数的原型为:

time_t time (time_t* timer);

time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型 。

time函数的时候需要包含头文件:time.h

综合上面三个函数及介绍,则随机数生成代码实现为:

srand((unsigned int)time(NULL));//初始化随机种子
rand( );//产生随机数
3.4随机数范围设置

既然是随机数,那么就会从0~RAND_MAX中随机生成一个数字,那我们能猜对吗?😀答案是显然的,别说是八次机会,就是八十次都不一定能猜对。所以,为了照顾玩家的游戏体验,我们也必须设置随机数的范围,让它更为科学和合理。

如果我们要生成0~99之间的随机数,方法如下:

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

如果我们要生成1~100之间的随机数,方法如下:

rand()%100+1;//%100的余数是0~99,0~99的数字+1,范围是1~100

 如果我们要生成a~b之间的随机数,方法如下:

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

4.猜数字游戏的代码实现

前面的准备工作已经做完了,那么就整合所有模块,一起来见证我们努力的成果吧!

#include<stdio.h>
#include <stdlib.h>
#include <time.h>//记得检查所需的函数头文件都引用没有哦 void menu()
{printf("***********************\n");printf("****** 1. play ******\n");printf("****** 0. exit ******\n");printf("***********************\n");
}void guess(int secret)
{int guess = 0, count = 0;do{printf("请输入一个整数>:");scanf("%d", &guess);count++;if(guess == secret) break;else printf("错了,请重新猜!你还有%d猜测次数,请把握好机会\n\n",8-count);}while(count<8);if(count < 8)printf("恭喜,猜对了!共猜测%d次!\n",count);elseprintf("超过次数,游戏结束!\n");}int main()
{srand((unsigned int)time(NULL));int input = 0;srand((unsigned int)time(NULL));do{    int secret = rand() %100;//生成0~99之间的随机数 //menu函数在调试大体框架时,也可以是空壳函数menu();//打印游戏菜单。我们建立函数可以让主函数不至于太过冗长,而且增加了代码的可读性,使程序模块化。printf("请选择:>");scanf("%d", &input);switch(input){case 1:guess(secret);//guess是用来猜测并判断是否正确的函数,这里也是空壳函数break;case 0:printf("游戏结束\n");break;default:printf("选择错误,请重新选择\n");break;}}while(input);return 0;
}

上面的代码进行了细微的调整——把rand的随机种子初始化放在do之前,然后把随机数的生成放在do…while语句中,这样我们每一轮游戏所猜的数字都是不同的,且不必重复初始化随机种子。

5.猜数字游戏的优化

我们玩几局就会发现,虽然限制了随机数的范围,但想在8次机会中猜对还是有些难度,所以为了我们亲爱的玩家,我们就再降低难度——当他们猜完数字后,给他们提示:“猜大了”或者“猜小了”

优化后的代码如下:

#include<stdio.h>
#include <stdlib.h>
#include <time.h>//记得检查所需的函数头文件都引用没有哦 void menu()
{printf("***********************\n");printf("****** 1. play ******\n");printf("****** 0. exit ******\n");printf("***********************\n");
}void guess(int secret)
{int guess = 0, count = 0;do{printf("请输入一个整数>:");scanf("%d", &guess);count++;if(guess == secret) break;else if(guess > secret){if(count != 8) printf("猜大了,请重新猜!你还有%d猜测次数,请把握好机会\n\n",8-count);else printf("可惜最后还是猜大了\n");}	else{if(count != 8) printf("猜小了,请重新猜!你还有%d猜测次数,请把握好机会\n\n",8-count);else printf("可惜最后还是猜小了\n");}}while(count<8);if(count < 8)printf("恭喜,猜对了!共猜测%d次!\n",count);elseprintf("不好意思,次数已用完,游戏结束!\n");}int main()
{srand((unsigned int)time(NULL));int input = 0;srand((unsigned int)time(NULL));do{    int secret = rand() %100;//生成0~99之间的随机数 //menu函数在调试大体框架时,也可以是空壳函数menu();//打印游戏菜单。我们建立函数可以让主函数不至于太过冗长,而且增加了代码的可读性,使程序模块化。printf("请选择:>");scanf("%d", &input);switch(input){case 1:guess(secret);//guess是用来猜测并判断是否正确的函数,这里也是空壳函数break;case 0:printf("游戏结束\n");break;default:printf("选择错误,请重新选择\n");break;}}while(input);return 0;
}

猜数字小游戏到这里算是结束喽,不知道大家学习的过程辛苦不辛苦,反正我是痛并快乐着的🙂🙂🙂

关于猜数字的更多玩法和可能性,就全权交由聪明的大家了。当然大家有啥好想法又不想一个人搞的,也可以在评论区发出来,大家一起交流交流,研究研究。

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

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

相关文章

Java高级技术(反射:获取类的构造器)

一&#xff0c;常用方法 二&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;获取全部构造器 &#xff08;2&#xff09;&#xff0c;获取某个构造器 &#xff08;3&#xff09;&#xff0c;实验类 三&#xff0c; 初始化对象 四&#xff0c;案例

【数据结构】——堆排序

前言&#xff1a;我们已经学习了堆以及实现了堆&#xff0c;那么我们就来给堆进行排序。我们怎么来进行排序呢&#xff1f;这一次我们就来解决这个问题。 如果我们堆排序要求排序&#xff0c;我们是建立大堆还是小堆呢&#xff0c;如果我们建的小堆的话&#xff0c;那我们在排序…

js小技巧|如何提取经过Function函数混淆了的代码

关注它&#xff0c;不迷路。 本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请联系作者立即删除&#xff01; 1.需求 星友发过来一个混淆代码&#xff0c;打开一看&#xff0c;长这…

“前端已死”?从ChatGPT与低代码平台看未来编程之路

每隔一段时间&#xff0c;“前端已死”的论调就会如潮水般重新涌现&#xff0c;引发行业内外的热议。这种论调背后&#xff0c;除了对于新技术&#xff0c;如ChatGPT、GPT-4对前端开发者影响的担忧&#xff0c;还反映了人们对于技术变革的焦虑。 作为前端开发者&#xff0c;我坚…

查理·芒格留给我们的 84 条名言

你好&#xff0c;我是 EarlGrey&#xff0c;喜欢翻译点东西&#xff0c;偶尔写写代码。 点击下方卡片关注我&#xff0c;一起向上进击&#xff0c;提升自我。后台回复关键词“电子书”&#xff0c;送你一份我收藏的电子书合集。 *** 查理芒格&#xff08;Charlie Munger&#x…

@RequestMapping

目录 作用&#xff1a; 位置&#xff1a; 属性 1.value 2.method 3.params 4.header 作用&#xff1a; 该注解是一个用来处理请求地址映射的注解。 位置&#xff1a; 可用于映射一个请求或一个方法&#xff0c;可以用在类或方法上。 用于方法上&#xff0c;表示在类的…

检验科LIS系统源码,LIS系统,检验数据分析,生成检验报告

检验科LIS系统源码&#xff0c;全套LIS系统商业项目源码 LIS是HIS系统的一个重要的组成部分&#xff0c;其主要功能是将检验的实验仪器传出的检验数据经分析&#xff0c;生成检验报告&#xff0c;通过网络存储在数据库中&#xff0c;这样医生能够方便、及时的看到患者的检验结果…

第22章 NIO编程

在本章中需要掌握NIO中的缓冲区的作用&#xff0c;并理解缓冲区中的数据处理模型&#xff0c;掌握Channel的作用&#xff0c;并结合缓冲区实现数据I/O操作&#xff0c;理解文件锁的作用&#xff0c;并且掌握字符编码处理支持类的使用&#xff0c;掌握Reactor设计模型&#xff0…

CSS特效021:蛇形左右扭动的效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

新手老师如何管理班级的日常工作

作为一名新手老师&#xff0c;管理班级的日常工作可能会是一项挑战&#xff0c;但以下是一些可能有用的建议&#xff1a; 建立良好的班级文化 班级文化是班级氛围的重要组成部分&#xff0c;对于学生的学习和成长具有重要影响。作为老师&#xff0c;要积极营造一种积极向上、团…

电脑IP地址怎么修改?http代理ip设置方法有哪些?

在互联网时代&#xff0c;我们的网络已经成为我们生活、工作和学习中不可或缺的一部分。有时候&#xff0c;为了保护我们的隐私或者突破网络限制&#xff0c;我们需要修改电脑的IP地址。那么&#xff0c;电脑IP地址怎么修改呢&#xff1f;http代理ip设置方法有哪些呢&#xff1…

怎么检测电脑电源?电脑电源检测系统软件如何助力?

电源是电脑的重要组成部分&#xff0c;为电脑提供稳定电源&#xff0c;保证电脑正常工作。但是在电脑实际使用过程中总会遇到各种各样的问题和故障&#xff0c;比如无法开机&#xff0c;因此电脑电源检测是非常重要的测试内容。 如何测试电脑电源? 1. 用万用表检测 a. 将万用表…

linux命令解析神器

遥想刚迈入职场时&#xff08;当时的工作环境&#xff0c;需要频繁使用linux&#xff0c;登录设备后台操作&#xff09;&#xff0c;偶然间听到我的领导和其他同事说 &#xff1a;“XXX&#xff0c;多学一学。大佬们太厉害了&#xff0c;太低级的问题不要直接问&#xff0c;你登…

HarmonyOS将程序下载并运行到真机上 (华为手机为例)

前面的文章 我们讲到过一些关于这个预览器的操作 可以在上面看到我们代码的一个整体效果 但其实 这边可以真实的运行在我们自己的手机上 因为你这个预览器再好 还是和实际的手机环境有所偏差 首先 我们要设置一下手机 我们在设置中 找到 关于手机 然后 这下面 有一个 Harmo…

Redis学习文档

目录 一、概念1、特征2、关系型数据库和非关系型数据库的区别3、键的结构4、Redis的Java客户端5、缓存更新策略5.1、概念5.2、代码 6、缓存穿透6.1、含义6.2、解决办法6.3、缓存空值代码举例6.4、布隆过滤器代码举例 7、缓存击穿7.1、概念7.2、解决办法7.3、互斥锁代码举例7.4、…

[PyTorch][chapter 2][李宏毅深度学习-Regression]

前言&#xff1a; Regression 模型主要用于股票预测,自动驾驶,推荐系统等领域. 这个模型的输出是一个scalar。这里主要以下一个线性模型为基础 它是神经网络的基础模块&#xff0c; 目录&#xff1a; 总体流程 常见问题 Numpy 例子 PyTorch 例子 一 总体流程 1 : 建…

智慧工地解决方案,Spring Cloud智慧工地项目平台源码

智慧工地一体化信息管理平台源码&#xff0c;微服务架构JavaSpring Cloud UniApp MySql 智慧工地云平台是专为建筑施工领域所打造的一体化信息管理平台。通过大数据、云计算、人工智能、物联网和移动互联网等高科技技术手段&#xff0c;将施工区域各系统数据汇总&#xff0c;建…

15.Docker-Compose的概念理解及安装

1.Docker-Compose是什么&#xff1f; Docker-Compose是实现对Docker容器集群的快速编排的工具软件。它是Docker官方开源的一个工具软件&#xff0c;可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件docker-compose.yml.写好多个容器间的调用关系&#x…

京东大数据(京东运营数据采集):2023年10月京东牛奶乳品行业品牌销售排行榜

鲸参谋监测的京东平台10月份牛奶乳品市场销售数据已出炉&#xff01; 10月份&#xff0c;牛奶乳品整体销售上涨。鲸参谋数据显示&#xff0c;今年10月&#xff0c;京东平台上牛奶乳品的销量将近1700万&#xff0c;同比增长1%&#xff1b;销售额将近17亿&#xff0c;同比增长约5…

C语言常见算法

算法&#xff08;Algorithm&#xff09;&#xff1a;计算机解题的基本思想方法和步骤。算法的描述&#xff1a;是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述&#xff0c;包括需要什么数据&#xff08;输入什么数据、输出什么结果&#xff09;、采用什么结构、使…