C语言编写猜数字游戏及随机数生成方法

文章目录

  • C语言编写猜数字游戏及随机数生成方法
    • 前言
    • 一、猜数字小游戏
      • 内容:
      • 步骤:
      • 代码的实现:
    • 二、随机数生成的方法
    • 总结

前言

对于C语言初学者来说,当我们的翻开课本咕叽咕叽读完C语言概述后,就会紧接着面临C语言控制语句(顺序,选择和循环),然后不约而同都会面临用三大控制语句编写猜数字游戏的问题。这的确是一个比较容易编写的小游戏,但同时也是一个很好练习机会,不仅仅让我们充分利用所学知识完成对程序的编写,同时也引导我们思考如何用C语言生成随机数。


一、猜数字小游戏

内容:

首先我们要了解一下什么是猜数字。顾名思义,就是随机指定一个数字,然后让人猜数,通过反馈的信息(猜大了或者猜小了)来逐渐锁定最终值。

步骤:

定义好我们程序的目标后,我们就要开始对程序进行设计,要有一个明确的步骤。
1.首先我们需要提升游玩者体验,就应该有一个菜单。
2.其次游玩者可能需要循环往复玩这个游戏,我们就应该将游戏放入循环体内。
3.最后才是我们对于游戏具体的设计。在游戏具体设计内,我们需要让系统生成一个随机数,然后让游玩者输入一个数字,通过对二者的比较,反馈信息,以便让游玩者逐渐接近具体目标。

代码的实现:

#define _CRT_SECURE_NO_WARNINGS  //防止sancf报安全性错误
#include<time.h>//time()函数头文件
#include<stdlib.h>//rand(),srand()函数头文件
#include<stdio.h>//printf(),scanf()函数头文件
void menu()//进入游戏对菜单的打印
{printf("***************************\n");printf("******** 1. play **********\n");printf("******** 0. exit **********\n");printf("***************************\n");
}
int main()
{int input = 0;//定义一个变量input,存放用户输入的值do{            //函数可以简单理解为对一段代码的封装。menu();//这是菜单的打印,利用函数可以避免主函数过于冗长printf("请选择(1/0):>");//让用户输入1开始玩游戏,0则退出游戏scanf("%d", &input);switch (input){case 1:game();//游戏具体实现break;case 0:printf("退出游戏\n");break;default:printf("输入错误\n");}} while (input);//0为假,非0为真,真则会重新进入循环体,假则会退出循环体return 0;
}

然后就是对游戏具体实现的思考,首先我们要生成一个随机数,现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数,它们就是rand()和srand()函数。

void game()
{srand((unsigned int)time(NULL));//为rand()函数重新“播种”,使得rand()产生随机值(rand()产生的随机值我们称为“种子”)发生变化  (具体我们在第二节详细解释)int ret = rand()%100+1;//生成的随机值1-100int guess = 0;while (1){printf("请猜数字:>");scanf("%d", &guess);if (guess > ret){printf("猜大了\n");}else if (guess < ret){printf("猜小了\n");}else{printf("猜对了\n");break;}}
}

但实际上我们不太喜欢将rand()和srand()函数放得太近,因为这样子反复运行程序还是容易使得rand()函数产生相近的值,所以我们比较提倡将srand()函数放到主函数中,事实上每次用到rand()函数只需要srand()函数“播种”一次即可。接下来展示就是猜数字游戏所示全部代码:

#define _CRT_SECURE_NO_WARNINGS  //防止sancf报安全性错误
#include<time.h>//time()函数头文件
#include<stdlib.h>//rand(),srand()函数头文件
#include<stdio.h>//printf(),scanf()函数头文件
void game()
{int ret = rand()%100+1;//生成的随机值1-100int guess = 0;while (1){printf("请猜数字:>");scanf("%d", &guess);if (guess > ret){printf("猜大了\n");}else if (guess < ret){printf("猜小了\n");}else{printf("猜对了\n");break;}}
}
void menu()//进入游戏对菜单的打印
{printf("***************************\n");printf("******** 1. play **********\n");printf("******** 0. exit **********\n");printf("***************************\n");
}int main()
{int input = 0;//定义一个变量input,存放用户输入的值srand((unsigned int)time(NULL));//为rand()函数重新“播种”,使得rand()产生随机值(rand()产生的随机值我们称为“种子”)发生变化  (具体我们在第二节详细解释)do{            //函数可以简单理解为对一段代码的封装。menu();//这是菜单的打印,利用函数可以避免主函数过于冗长printf("请选择(1/0):>");//让用户输入1开始玩游戏,0则退出游戏scanf("%d", &input);switch (input){case 1:game();//游戏具体实现break;case 0:printf("退出游戏\n");break;default:printf("输入错误\n");}} while (input);//0为假,非0为真,真则会重新进入循环体,假则会退出循环体return 0;
}

代码运行截图:

二、随机数生成的方法

接下来我们对刚刚展示的利用C语言生成随机数做一个具体解释。
现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数,它们就是rand()和srand()函数。
然后我们用MSDN软件查看一下对于rand()和srand()函数的表述:

1.int rand( void )
Generates a pseudorandom number(生成伪随机数)

The rand function returns a pseudorandom integer in the range 0 to RAND_MAX(rand函数返回一个范围为0到RAND_MAX的伪随机整数)(C语言规定RAND_MAX值为32767)
此时我们编写一个代码尝试一下:

void main(void)
{int i;for (i = 0; i < 10; i++)printf("%d ", rand());printf("\n\n\n\n");
}

不难发现运行两次后,会重复出现一样的数字,这就违背了我们想要随机的本意。实际上,rand() 函数产生的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为“种子”,种子和随机数之间的关系是一种正态分布关系,种子在每次启动计算机时是随机的,但是一旦计算机启动以后它就不再变化了;也就是说,每次启动计算机以后,种子就是定值了,所以根据公式推算出来的结果(也就是生成的随机数)就是固定的。


返回MSDN软件继续查看关于rand()函数描述:
Use the srand function to seed the pseudorandom-number generator before calling rand.(在调用rand之前,使用srand函数为伪随机数生成器播种)

2.void srand( unsigned int seed )
Sets a random starting point.(设置随机起点)

而要让 srand()函数随机播种,我们则必须让参数是一个随机值,这就产生悖论。所以前辈们在实际开发中,就用时间作为参数,只要每次播种的时间不同,那么生成的种子就不同,最终的随机数也就不同。而要得到时间则又引出了另一个函数time()函数

3.time_t time( time_t *timer )
Gets the system time.(获取系统时间。)

time()函数返回类型为time_t,time_t 实际在C语言中被定义为长整型,而srand()函数参数为unsigned int(无符号整形),所以要强制类型转换,而且不需要为time()函数设置参数,故用空指针NULL代替。

最后我们得到srand()函数设置随机数起点写法

srand( (unsigned int)time( NULL ) );

最后我们试验一下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main(void)
{int i;srand((unsigned int)time(NULL));for (i = 0; i < 10; i++)printf("  %6d\n", rand());
}


总结

希望能够对你有所帮助,因为我也是第一次尝试写技术性博客,如有问题,烦请指正,谢谢你的阅览。

C语言编写猜数字游戏及随机数生成方法相关推荐

  1. c语言编写猜数字游戏

    #include<stdio.h> #include<stdlib.h> #include<time.h>int main() {int num = 0;int r ...

  2. c语言程序设计 猜数字,C语言程序设计(猜数字游戏)报告.doc

    C语言程序设计(猜数字游戏)报告 <高级语言程序设计>课程设计 题目:班级:09R3 学生姓名:谢泽雄 学生学号:200931000622 指导老师:提交时间:华南农业大学信息(软件)学院 ...

  3. 用二分法编写猜数字游戏(含:猜电脑随机数,和用户自己想的数字)python

    目录 #什么是二分法 #用二分法猜电脑随机数 #用二分法猜用户所想的数 1.什么是二分法? 对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点 ...

  4. c语言编程题猜数字游戏6题,c语言编程—猜数字游戏.doc

    c语言编程-猜数字游戏 计算机实习报告 面向过程编程 用C语言求解实际问题 一.问题描述 游戏类第15个任务--猜数字游戏 计算机从0-9这10个数字中任意选择n个不重复数字(n≤10)组成一个5位数 ...

  5. python编写猜数字游戏

    一.猜数字游戏介绍 猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩. 二.猜数字游戏规则 先解释标 ...

  6. 【C语言】第一个C语言项目——“猜数字”游戏(内附源码)

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello米娜桑,这里是君兮_,今天又抽空为大家更新我们的主线0基础C语言啦!鉴于最近讲解了非常多的选择语句与循环语句,咱们今天就来讲讲 ...

  7. 冰豹lua驱动设置_通过编写“猜数字”游戏学习 Lua | Linux 中国

    通过编写一个简单的游戏来认识 Lua,它是一种动态类型的.轻量级的.高效的.可嵌入的脚本语言. 来源:https://linux.cn/article-13000-1.html 作者:Seth Ken ...

  8. 用python做C语言的猜数字游戏,[Python3 练习] 007 简单的猜数字小游戏

    题目:简单的猜数字小游戏 (1) 描述 程序随机生成一个数字,玩家用键盘输入所猜数字,在规定次数内猜对为胜. (2) 要求 程序随机生成一个 1 到 100 的自然数 有 7 次机会去猜 机会用尽之前 ...

  9. 【C语言】-猜数字游戏

    目录 一.猜数字游戏 1.什么是猜数字游戏? 2.怎么实现猜数字游戏? 1>.分析需要的功能 2>.随机数的产生 3>.system()函数 4>.总代码 二.猜数字游戏+关机 ...

最新文章

  1. 问题-[Delphi]MainFrame.pas(4340): E2036 Variable required
  2. 使用Xtrabackup进行MySQL备份
  3. iOS开发点击UIButton实现UIView的旋转
  4. 查找域内所有的Windows Server 2012 R2的服务器,并区分出哪些是物理机,那些是虚拟机...
  5. [深度学习-实践]条件生成对抗网络cGAN的例子-Tensorflow2.x Keras
  6. pomelo mysql_pomelo连接mySQL
  7. LeetCode Online Judge 题目C# 练习 - Search in Rotated Sorted Array II
  8. excel打开2个独立窗口_喜欢用华为手机拍照,记得打开这2个开关,能让照片更加清晰...
  9. 语音合成技术及国内外发展现状
  10. Matlab数字图像处理——图像增强
  11. JS动态添加Html
  12. SAS用proc means和proc univariate求数据的样本均值、中位数、四分位数、样本方差、极差、变异系数、二阶、三阶和四阶中心矩、偏度、峰度、标准差和对数据进行正态性检验
  13. pip install使用豆瓣库
  14. 多级放大电路的耦合方式
  15. Maya如何切换中英文
  16. 阿里图标库在旧有的iconfont中添加新的图标
  17. 语法最简单的微博通用爬虫weibo_crawler
  18. Android之AsyncTask源码分析(第五篇:execute方法只能执行一次的原因)
  19. 教育平台项目后台管理系统:视频讲解
  20. android定位软件开发,android gps定位app源码(GpsTracker)

热门文章

  1. docker安装Yearning
  2. 嵌入式系统导论-DOL开发环境配置
  3. Linux服务器怎样上传下载文件
  4. Python中的错误是什么,Python中有哪些错误
  5. 科学记数法怎么做iPhone计算机上运用,怎么把科学计数法直接打开
  6. 介绍Spring Batch 中Tasklet 和 Chunks
  7. python 粒子群_Python实现粒子群算法的示例
  8. 机器学习--聚类算法(无监督学习)--K-Menas/BIRCH/CURE/DBSCAN/MDCA算法理论
  9. 【阿旭机器学习实战】【7】岭回归基本原理及其λ的选取方法
  10. Python基础必掌握的return语句用法和实践详解