用c语言实现猜数字游戏
目录
前言一、预期实现猜数字游戏的功能二、具体思路讲解1.总体思路2.菜单功能的实现 3.主函数部分的实现4.游戏game()函数的代码实现5.总程序代码三.常见错误前言对于c语言初学者来说用c语言实现猜数字游戏是基本的问题,本篇文章会细致的讲解如何用代码来实现猜数字游戏。希望读者在阅读本篇博客前学习玩分支与循环和最基本的c语言语法知识。
提示:以下是本篇文章正文内容,下面案例可供参考
一、预期实现猜数字游戏的功能1:什么是猜数字游戏
猜数字游戏顾名思义是电脑随机生成一个数字,让玩家来猜。如果没猜对,电脑会提示玩家猜大了还是猜小了,玩家可以多次尝试,直到玩家猜对了本次游戏就结束。
2:预期效果
在实现猜数字的基础上,玩家如果觉得不过瘾可以选择再来一次,如果玩腻了,也可以选择退出游戏
二、具体思路讲解1.总体思路为了实现游戏的基本功能,我们应该有一个游戏菜单,通过菜单玩家可以选择是进入游戏还是退出游戏,且为了可以使该游戏可以反复玩,这个过程应该是一个循环,选择退出游戏时就打破这个循环。为了使代码具有条理性我们定义唯一的主函数,然后按功能写子函数,让每一个子函数都有其意义。综上我们需要打印菜单模块的一个子函数和游戏实现(包括电脑生成随机数和玩家可以循环多次猜数字的功能)的子函数,不妨把是否选择进入游戏放在主函数里。
2.菜单功能的实现因为我们把选择过程放在主函数里,所以菜单功能十分简单。代码示例如下
voidmenu(){printf("*****欢迎来到猜数字游戏***** ");printf("********1:进入游戏********* ");printf("********0:退出游戏********* ");printf("**************************** ");} 3.主函数部分的实现因为程序从主函数开始运行,到主函数结束时结束,所以主函数应该起到搭建整个游戏基本框架的功能。主函数不仅要实现是否选择进入游戏还应该合理引用menu()和game()使整个程序形成有机的整体。
intmain(){srand((unsigned)time(NULL));//定义一个随机生成数,注意不能把它放在循环语句中,否则会使生成的数字不够随机intinput=0;do{menu();printf("请输入你的选择:");scanf("%d",&input);if(input==1){game();//选择玩游戏则调用game()函数进行游戏功能的实现}elseif(input==0){printf("游戏已经退出");break;//因为while判断条件,所以此句非必须}else{printf("您输入的是无效指令,请重新输入 ");//因为只有1和0才有意义,但玩家可能输入其它数字,此处应给提示}}while(input!=0);return0;}4.游戏game()函数的代码实现在game()中我们要实现两个功能1:电脑随机生成一个1-100之间的随机数。2:玩家进行猜数字游戏,其中c语言实现生成随机数的原理复杂,需先定义一个随机数生成起点,再用rand()函数进行生成随机数。
代码如下:
voidgame(){//1:实现1-100之间的随机数的生成intrandom_num=rand()%100+1;//rand()是随机数生成函数需要搭配srand((unsigned)time(NULL))使用//2:进入玩家猜数字环节while(1){intguess=0;//guess中储存的是玩家猜测的数字printf("请输入猜测的数字:");scanf("%d",&guess);if(guessrandom_num)printf("猜大了 ");else{printf("恭喜你猜对了 ");break;//为了防止死循环,若猜对了应打破循环}}}其中game需引用的头文件是#include
srand((unsigned)time(NULL))需引用的头文件是#include
5.总程序代码如下:
#define_CRT_SECURE_NO_WARNINGS1#include#include#include//游戏规则//1:电脑随机生成一个1-100之间的数字//2:玩家进行猜数字电脑会提示猜大了或者猜小了直到玩家猜对游戏结束//3:游戏可以重复玩,即玩家玩完一把后可选择再玩一把或者是直接退出voidmenu(){intinput=0;printf("*****欢迎来到猜数字游戏***** ");printf("********1:进入游戏********* ");printf("********0:退出游戏********* ");printf("**************************** ");}voidgame(){//1:实现1-100之间的随机数的生成intrandom_num=rand()%100+1;//rand()是随机数生成函数需要搭配srand((unsigned)time(NULL))使用//2:进入玩家猜数字环节while(1){intguess=0;//guess中储存的是玩家猜测的数字printf("请输入猜测的数字:");scanf("%d",&guess);if(guessrandom_num)printf("猜大了 ");else{printf("恭喜你猜对了 ");break;//为了防止死循环,若猜对了应打破循环}}}intmain(){srand((unsigned)time(NULL));intinput=0;do{menu();printf("请输入你的选择:");scanf("%d",&input);if(input==1){game();}elseif(input==0){printf("游戏已经退出");break;}else{printf("您输入的是无效指令,请重新输入 ");}}while(input!=0);return0;}三.常见错误1.再game()中把随机数语句段放在while循环中,导致在游戏过程中,每猜一次随机数变化一次,导致如果第一次猜不对,就一直猜不对。
2.在game()中每次猜数字后if判断条件写错,导致原本猜大了电脑显示猜小了,原本猜小了显示猜大了,这样除非第一次猜对否则永远猜不对。
本人是c语言初学者,可能会存在一些错误,还望各位大牛即时指正,在此谢过各位。
c语言随机数生成1到100
问题描述编制100以内两个整数(随机产生)的加法运算练习程序。
分析变量四个整型变量:分别表示两个加数、两个和(计算机和人算结果)一个布尔变量(或整型也可):表示运算结果是否正确整型:表示题目总数量,答对题目数
库和函数C语言printf()输出函数scanf()输入函数rand()在“stdlib.h”中。每调用一次rand()函数,可以产生一个0-32767之间的随机数(2-2).一般情况下,要想得到[a,b]区间的随机数,可以使用表达式a+rand()%(b-a)srand()随机数种子,种子不同产生的随机数不同
pythonrandom()库(1)random():用来产生[0.0,1.0)之间的随机数(2)seed(a=None):初始化随机数种子(3)randint(a,b):随机产生一个[a,b]的整数time库(1)time():获取当前时间
源程序C语言#include#includeintmain(){inta,b,c1,c2,socres=0,num=0;while(1){a=rand()%100;//随机生成第一个加数b=rand()%100;//随机生成第二个加数c1=a+b;//正确的和num+=1;//题号//printf("num:%d",num);printf("%d.%d加%d等于?",num,a,b);scanf("%d",&c2);//用户输入的计算结果if(c2==c1){printf("你真棒,答对了!n");socres++;}elseprintf("哎呀,你答错了呢。正确答案是%dn",c1);printf("截止目前,您一共回答了%d道题目,答对了%d道题目,正确率为%.2f%%n",num,socres,(float)socres/num*100);}return0;}运行发现每次程序运行产生的随机数都是固定的,属于“伪随机随”。需要利用time.h引入一个种子,以保证每次播种产生的随机数是不同的。
http://c.biancheng.net/view/2043.html完善后的代码为:
#include#include#includeintmain(){inta,b,c1,c2,socres=0,num=0;while(1){srand((unsigned)time(NULL));//随机数种子a=rand()%100;//随机生成第一个加数b=rand()%100;//随机生成第二个加数c1=a+b;//正确的和num+=1;//题号//printf("num:%d",num);printf("%d.%d加%d等于?",num,a,b);scanf("%d",&c2);//用户输入的计算结果if(c2==c1){printf("你真棒,答对了!n");socres++;}elseprintf("哎呀,你答错了呢。正确答案是%dn",c1);printf("截止目前,您一共回答了%d道题目,答对了%d道题目,正确率为%.2f%%n",num,socres,(float)socres/num*100);}return0;}python#coding:gbkimportrandomimporttimenum,socres=0,0whileTrue:random.seed(time.time())#利用时间生成当前时间的随机数种子num+=1a=random.randint(0,99)#第一个加数b=random.randint(0,99)#第二个加数c1=a+b#正确的和c2=int(input("{}.{}+{}=?".format(num,a,b)))#格式化输入,用户的计算结果ifc2==c1:print("你真棒,答对了!")socres+=1else:print("哎呀,你答错了呢。正确答案是"+str(c1))print("截止目前,你一共回答了"+str(num)+"道题目,答对了"+str(socres)+"道题目,正确率为"+str(round(float(socres/num*100),2))+"%")#print("截止目前,您一共回答了{}道题目,答对了{}道题目,正确率为{}%".format(num,socres,round(float(socres/num*100),2)))#作用和上一行一样项目链接:https://www.yuque.com/wendellberry/codepractice
视频讲解:B站搜索“啥都想学的温德尔”
公众号:微信搜索“啥都想学的温德尔”
微信扫我更多精彩C++随机数之线性同余发生器
1.随机数随机数,也即“随机选择的数”,是在一个有限数集上的一个一致分布的随机序列。随机数在许多方面有应用,如仿真、抽样、数值分析、计算机程序、娱乐等方面都有所应用。计算机用确定算法计算出来的随机数系列是伪随机数,并不是真正的随机数,但是其具有随机数的统计特征,如均匀性、独立性等。在上世纪初,冯诺伊曼建议用平方,然后取结果中间的数据作为随机数(平方取中法)。结果看起来修似乎是随机的,但是很多人对此质疑。实际上这并不是好的随机方法,尤其是针对一些短循环序列。
2.线性同余序列2.1.概念后来,有人发明了线性同余方程,用此方程生成的一组序列,随机效果不错。线性同余方程生成的序列,被称为线性同余序列。线性同余序列在一个周期内重复出现。并且方程中有四个魔数(常数),但是这四个魔数,对随机的效果影响巨大。线性同余发生器(Linearcongruentialgenerator,LCG)用于生成随机序列。LCG定义:Xn+1=(aXn+c)mod mX_{n+1}=(aX_{n}+c)mod;mXn+1=(aXn+c)modm
X是随机数序列m,0if(N%i==0)//i能被j整除,N不是质数{returnfalse;}}returntrue;}互质
boolisrp(inta,intb){if(a//两个正整数中,只有其中一个数值为1,两个正整数为互质数returntrue;}else{//求出两个正整数的最大公约数while(1){intt=a%b;if(t==0){break;}else{a=b;b=t;}}if(b>1){//如果最大公约数大于1,表示两个正整数不互质returnfalse;}else{//如果最大公约数等于1,表示两个正整数互质returntrue;}}}所有质因数
classQualityFactor{public:vectorm_vInt;public:voidQFContract(longa)//用短除法对合数进行分解{while(a>1){for(inti=2;ia=a/i;if(std::find(m_vInt.begin(),m_vInt.end(),i)==m_vInt.end())m_vInt.push_back(i);break;}}}}};所有质因数整除
intMaxCommondMultiple(constvector&_vInt,BOOL_bFour,int_nSrc){intnCommonMultiple=1;while(nCommonMultiplenCommonMultiple*=*it;if(_bFour&&(nCommonMultiple%4!=0)){continue;}BOOLbFind=TRUE;for(autoit=_vInt.begin();it!=_vInt.end();++it){if(nCommonMultiple%*it!=0){bFind=FALSE;break;}}if(bFind){returnnCommonMultiple;}}}return0;}随机数函数staticintseed=0;intrandom(inta,intb,intm){seed=(seed*a+b)%m;returnseed;}输入最大周期长度m,即可以根据上述函数生成相应的a和c。
2.4.其他2.4.1.标准库randm、a、c、X是一级相关数,选定m之后,同样会有很多组对应的a、c、X。不同的数据,对应的随机数分布是不一样的。随机效果也是大大不同。理论上m选择的范围越方,其效果越好。而VS实现的std::rand()即是采用线性同余方程实现的。
*/int__cdeclrand(void){_ptiddataptd=_getptd();return(((ptd->_holdrand=ptd->_holdrand*214013L+2531011L)>>16)&0x7fff);}其周期较小,所以随机效果不是特别好。另外其中的几个常数,是经常大量实验选择的,是随机效果相对较好的一组数。
2.4.2.自定义rand什么时候需要自定义rand()呢?例如我要取0-10之间的随机数,并且每次不能相同,且可以取完一个周期。一般情况下我们会使用“洗牌”算法,即在数据序列中,依次取出一个数与后面的随机取的数交换,即可以达到效果。标准库提供了std::shuffle实现此功能。
std::vectorv={0,1,2,3,4,5,6,7,8,9,10};std::shuffle(v.begin(),v.end(),std::default_random_engine(0));大多数时候,我们使用上面的方法,可以得到效果非常好的随机序列。但是如果我需要一个0-0xFFFFFFFF之间的随机序列呢?此时就不方便使用构造一个巨大的数据序列之后,再调用洗牌函数打乱数据。因为数据序列的内存消耗巨大。此时,就需要使用一个自定义周期长度为0xFFFFFFF的rand()函数了。即,我们选定m=0xFFFFFF,根据三个条件调用相应的函数求出相应的m、c、X。但是因为参数的可能性太多,随机性差异巨大,需要经过大量实验,才能选择一组较好的数据组合供使用。示例代码
2.4.3.最佳随机数线性同余发生器一直是随机数生成的主要方式,但是其随机效果不是特别好。C++11引入了梅森旋转演算法的随机数引擎,是目前效果最好的随机算法。std::default_random_engine默认即使用梅森旋转演算法。也可以直接使用梅森旋转演算法引擎std::mt19937。