C语言:猜数字游戏
C语言:猜数字游戏一.随机数的生成1.rand函数2.srand函数3.time函数二.随机数范围的设置三.实现猜数字游戏游戏要求1.电脑⾃动⽣成1~100的随机数2.玩家猜数字猜数字的过程中根据猜测数据的大小给出大了或小了的反馈直到猜对游戏结束一.随机数的生成玩猜数字游戏首先得要程序生成一个随机数让我们去猜那这个随机数又是从哪里来的呢1.rand函数rand函数是可以⽣成随机数rand函数的使⽤需要包含⼀个头⽂件stdlib.hintrand(void);//函数原型rand函数会返回一个伪随机数在这里可以测试一下如下#includestdio.h#includestdlib.hintmain(){printf(%d\n,rand());printf(%d\n,rand());printf(%d\n,rand());return0;}在这里我们发现多次运行结果都一样这是因为rand函数生成的随机数是伪随机数伪随机数不是真正的随机数而是对一个叫“种子”的基准值进⾏运算⽣成的随机数。rand函数⽣成随机数的默认种⼦是1如果要⽣成不同的随机数就要让种⼦是变化那又如何让让种子变化生成随机种子呢?2.srand函数srand函数是⽤来初始化随机数的⽣成器voidsrand(unsignedintseed);//函数原型程序中在调⽤rand函数之前先调⽤srand函数通过srand函数的参数seed来设置rand函数⽣成随机数的时候的种⼦只要种⼦在变化每次⽣成的随机数序列也就变化起来了。但如果如上述所说生成一个随机数需要另一个随机数这样会相互矛盾那又该如何解决3.time函数使⽤程序运⾏的时间作为种⼦因为时间时刻在发⽣变化的。time函数的使⽤需要包含⼀个头⽂件time.htime_ttime(time_t*timer);//函数原型获得时间time函数的参数timer如果是⾮NULL的指针的话函数也会将这个返回的差值放在timer指向的内存中带回去。如果timer是NULL就只返回这个时间的差值。time函数返回的这个时间差也被叫做时间戳可以网上了解一下time函数返回时间戳time(NULL);//调⽤time函数返回时间戳这⾥没有接收返回值那接下来就可以结合rand、srand和time三个函数写生成随机数的代码如下所示#includestdio.h#includestdlib.h#includetime.hintmain(){//使⽤time函数的返回值设置种⼦//因为srand的参数是unsigned int类型我们将time函数的返回值强制类型转换srand((unsignedint)time(NULL));printf(%d\n,rand());printf(%d\n,rand());printf(%d\n,rand());return0;}我们可以看到多次运行后的随机数不同二.随机数范围的设置1.通过取的随机数rand()与常量取模(%)再加上或减去差值即可设置随机数的范围在这里我们以设置1~100为例rand()%100;//余数的范围是0~99rand()%1001;//%100的余数是0~99,0~99的数字1,范围是1~100100rand()%(200-1001);//余数的范围是0~100加100后就是100~200arand()%(b-a1);//⽣成a~b的随机数三.实现猜数字游戏通过我们现在所学的rand、srand和time三个函数以及之前学的分支与循环语句即可写出该游戏代码。如下所示#includestdio.h#includestdlib.h#includetime.hvoidgame(){intrrand()%1001;intguess0;while(1){printf(请猜数字:);scanf(%d,guess);if(guessr){printf(猜小了\n);}elseif(guessr){printf(猜大了\n);}else{printf(恭喜你猜对了\n);break;}}}voidmenu(){printf(***********************\n);printf(****** 1. play ******\n);printf(****** 0. exit ******\n);printf(***********************\n);}intmain(){intinput0;srand((unsignedint)time(NULL));do{menu();printf(请选择:);scanf(%d,input);switch(input){case1:game();break;case0:printf(游戏结束\n);break;default:printf(选择错误重新选择\n);break;}}while(input);return0;}但是我们在运行的时候会发现这代码会一直运行下去直到你才对为止。由此我们可以对代码进一步改进设置计数器countsum猜错一次count–用if语句判断当count0时跳出循环游戏结束。根据上述逻辑该代码可以改成如下所示#includestdio.h#includestdlib.h#includetime.hvoidgame(){intrrand()%1001;intguess0;intcount5;while(count){printf(还有%d次机会,count);printf(请猜数字:);scanf(%d,guess);if(guessr){printf(猜小了\n);}elseif(guessr){printf(猜大了\n);}else{printf(恭喜你猜对了\n);break;}count--;if(count0){printf(次数用完游戏结束);break;}}}voidmenu(){printf(***********************\n);printf(****** 1. play ******\n);printf(****** 0. exit ******\n);printf(***********************\n);}intmain(){intinput0;srand((unsignedint)time(NULL));do{menu();printf(请选择:);scanf(%d,input);switch(input){case1:game();break;case0:printf(游戏结束\n);break;default:printf(选择错误重新选择\n);break;}}while(input);return0;}纸上得来终觉浅绝知此事要躬行。