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

news2024/9/22 19:28:16

前面介绍过很多的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);
     else
         printf("超过次数,游戏结束!\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);
     else
         printf("超过次数,游戏结束!\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);
     else
         printf("不好意思,次数已用完,游戏结束!\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.coloradmin.cn/o/1264322.html

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

相关文章

win系列:电脑设置关闭屏幕和休眠时间不起作用解决方案

电脑设置关闭屏幕和休眠时间不起作用解决方案 一. 笔记本电脑30s自动锁屏&#xff0c;怎么设置都没用?方法一&#xff1a;使用快捷键方法二&#xff1a;开始菜单设置如果需要对锁屏进行背景等的设置&#xff0c;建议你采用这个方法来进行。方法三&#xff1a;控制面板设置怎么…

高等数学零基础篇复习笔记

预备章 零基础高等数学入门知识 第一节 集合、运算与关系 第二节 三角函数与反三角函数 三角函数的公式 反三角函数 第三节 常见不等式及数列 划重点 第一章 函数、极限与连续 第一节 函数及函数的初等特性 特殊函数 反函数 函数的初等特性 ①有界性 ②奇偶性 偶函数图像…

面向对象基础小结

面向对象基础小结 面向对象和面向过程的区别 两者的主要区别在于解决问题的方式不同&#xff1a; 面向过程&#xff1a;是把解决问题的过程拆成一个个方法&#xff0c;通过一个个方法的执行解决问题。面向对象&#xff1a;会先抽象出对象&#xff0c;然后用对象执行方法的方…

03 项目运行

前面两篇文章对项目架构+源码架构做了分析,这篇文章先将服务部署一下,能够让大家有个直观的感受。 组件资源 项目运行的各种组件已经为你准备好了,有需要的直接百度云盘下载: 链接:https://pan.baidu.com/s/1hN6qf20gamMHPmA_qXwsLg提取码:o4k9MySQL数据库创建 找到的…

探索数字化转型项目的基础

从消费品到特种化学品&#xff0c;数字化转型正在各行各业中逐渐普及。然而&#xff0c;尽管使用智能化设备、连接解决方案和数据分析对改造升级制造运营模式有巨大帮助&#xff0c;但起步过程&#xff08;奠定一个良好的基础来支撑工厂的可访问性、可靠性、可维护性、可扩展性…

如何把 Oracle 19C RAC+DG加入到ORACLE EM 13C监控

平时见ORACLE 19c rac single dg的部署很多了&#xff0c;ORACLE em 13c 的安装也很多了,但如何把手工部署的oracle 19c rac dg 添加到em 13c 中去&#xff0c;让EM13C 来实现对RACDG的监控&#xff0c;主要是DG的EM13C的监控&#xff0c;还没有看到&#xff0c;大部分都是直接…

高防CDN可以起到什么作用?

高防CDN相对于普通的CDN加速&#xff0c;除了具备基础的加速功效外&#xff0c;高防CDN在每一节点上均有相应配置的防御功效&#xff0c;不仅具备了隐藏源站不被攻击的优势&#xff0c;也具备了访问加速&#xff0c;多节点防御的功效。随着互联网的不断发展&#xff0c;网络上的…

MOM系统功能清单

什么是MOM系统&#xff1f; MOM系统是制造运营管理&#xff08;Manufacturing Operation Management&#xff09;的缩写。它是指通过协调管理企业的人员、设备、物料和能源等资源&#xff0c;把原材料或零件转化为产品的活动。MOM系统集成了生产计划、库存管理、生产调度、质量…

Haskell 安装 Cairo

背景 Haskell 项目需要使用到柱状图&#xff0c;折线图等&#xff08;demo 代码&#xff09; 步骤&#xff08;默认已安装 stack, cabal, ghcup&#xff09; nameversionstack2.11.1cabal3.8.1.0ghcup0.1.20.0 在 package.yaml 中添加所需依赖 Chart 和 Chart-cairo name:…

Ruoyi-cloud / 若依 SpringCloud服务器部署

1、redis 环境 服务器安装redis &#xff0c;注意 密码 端口 2、mysql 环境 服务器安装 mysql 5.7 以上的版本 代码中的sql 文件夹中有 sql 文件 创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql&#xff08;必须&#xff09;&#xff0c;quartz.sql&#xff08;可选&…

更快更稳的剃须伙伴,DOCO黑刃电动剃须刀体验

现在的电动剃须刀选择很多&#xff0c;我觉得三刀头的旋转式剃须刀很好用&#xff0c;比如我目前用的这款DOCO黑刃剃须刀&#xff0c;在剃须效率、舒适度和易用性等方面都表现不错&#xff0c;很适合日常使用。 这款剃须刀采用磁吸式刀头&#xff0c;这一设计非常方便清洁与更换…

docker容器入门

docker容器入门 1.1 容器介绍 容器技术是一种操作系统级的虚拟化技术&#xff0c;它允许在一个物理或虚拟机上运行多个隔离的应用程序实例&#xff0c;每个实例都被封装在一个独立的容器中。每个容器都包含应用程序及其依赖的运行时环境&#xff0c;如操作系统、库文件和配置…

【代码随想录】算法训练计划35

贪心 1、860. 柠檬水找零 题目&#xff1a; 输入&#xff1a;bills [5,5,5,10,20] 输出&#xff1a;true 思路&#xff1a; 模拟大法 func lemonadeChange(bills []int) bool {//贪心&#xff0c;代码一刷&#xff0c; 感觉要用到hashmap&#xff0c;也不用five, ten : 0…

文件操作在 Python 中的基本用法

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 文件操作是任何编程语言中都至关重要的一部分&#xff0c;Python 提供了简单而强大的文件操作功能&#xff0c;使得读取、写入和处理文件变得非常便捷。本文将详细介绍 Python 中文件操作的基本用法&#xff0c;…

SpringBoot使用动态Banner

SpringBoot使用动态Banner Spring Boot 2.0 提供了很多新特性&#xff0c;其中就有动态 Banner。 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://w…

sizeof 和 strlen的对比及笔试题目

目录 题目1&#xff1a; 题目2&#xff1a; 题目3&#xff1a; 题目4&#xff1a; 题目5&#xff1a; 题目6&#xff1a; 二维数组题&#xff08;重点&#xff09;&#xff1a; 上述题目总结&#xff1a; 若想了解其他的字符函数和字符串函数请移步&#xff1a;深入理解…

Gin投票系统(2)

投票系统 数据库的建立 先分析需求&#xff0c;在sql中建立数据库&#xff0c;关于项目数据库如何建立可以在“goweb项目创建流程分析中看如何去建表” 成功后目前有四个表&#xff1a; vote&#xff0c;user&#xff0c;vote_opt,vote_opt_user 建立数据库&#xff0c;可以…

万字解析设计模式之迭代器模式、备忘录模式

一、迭代器模式 1.1概述 迭代器模式是一种行为型设计模式&#xff0c;它允许在没有暴露其底层表现形式的情况下遍历集合对象。迭代器模式提供一种通用的遍历机制&#xff0c;可以遍历任何类型的集合&#xff0c;包括数组、列表、树等。通过这种模式&#xff0c;可以实现一种通…

微信小程序 老年人心血管健康知识科普系统

本系统的功能有管理员&#xff1a;个人中心&#xff0c;用户管理&#xff0c;热点信息管理&#xff0c;疾病管理&#xff0c;疾病类型管理&#xff0c;治疗管理&#xff0c;治疗类型管理&#xff0c;护理管理&#xff0c;护理类型管理&#xff0c;科普管理&#xff0c;科普类型…

Microsoft Office Exce-筛选后的公式批量复制粘贴为值 并且不乱数据

Microsoft Office Exce-利用选择性粘贴将筛选后的公式结果批量转换为值 1、写好【客单价】公式&#xff0c;并下拉填充 &#xff08;【SKU】、【销售额】、【销售量】这三列都是常量&#xff0c;非公式&#xff09; 2、复制客单价公式到E列 3、筛选数据&#xff0c; 按 Delet…