十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C语言梦开始的地方5:总结之猜数字

C语言梦开始的地方5:总结之猜数字 文章目录C语言梦开始的地方5总结之猜数字随机值与时间戳随机值生成时间戳猜数字代码实现随机数范围游戏菜单实现猜数字代码实现完整代码拓展游戏分享C语言梦开始的地方5总结之猜数字前四章我们了解了 C 语言的三大结构、关键字、操作符以及选择与循环语句。但单纯地学语法很难感受到这些知识点是如何配合使用的。本章我们就将前四章的知识点汇总起来实现一个简单的小游戏猜数字通过实际项目来检验前面的知识。游戏要求电脑自动生成1~100的随机数玩家猜数字猜数字的过程中根据猜测数据的大小给出大了或小了的反馈直到猜对游戏结束随机值与时间戳随机值生成猜数字我们首先让代码来生成一个随机数这样我们才能去猜而不是我们随便输入一个数来猜。C语言也给我们提供了一个函数rand这个函数是可以生成随机数的该函数的原型如下#include stdlib.h int rand(void);该函数生成的随机数是一个伪随机这个随机数的范围是0~RAND_MAX之间这个RAND_MAX的范围大小是根据编译器来定的大部分编译器上是32767。包含在stdlib.h这个头文件中。#includestdio.h#includestdlib.hintmain(){for(inti0;i5;i){printf(%d\n,rand());}return0;}但是运行该程序发现是生成了随机值但是连续运行我们发现随机值是一样的为什么会这样这是因为rand这俩次的随机种子都是一样的rand是确定性伪随机数生成器同样的种子 → 完全相同的完整序列并且你如果运行上述代码得出的结果是和我的大概率是一样的。因为rand的随机种子默认为1所以为了每次都不一样我们需要给rand每次重置它的随机种子同样C语言也提供了该函数srandsrand的函数原型如下void srand (unsigned int seed);它的作用就是每次运行去重置rand函数的随机种子程序中在调用 rand 函数之前先调用 srand 函数通过 srand 函数的参数seed来设置rand函数生成随机数的时候的种子只要种子在变化每次生成的随机数序列也就变化起来了。但是srand需要设置参数如果我们手动的去输入此时使不使用srand都没区别一样每次运行的值都是一样的。所以此时我们除了上述的rand和srand我们还需要一个函数time。时间戳那么我们想要每次都不一样我们就需要用到time函数time函数包含在time.h头文件中该函数的原型如下time_t time(time_t *timer)那么该函数是怎么做到的呢该函数是通过获取时间戳来实现的。timerNULL时得到当前日历时间从1970-01-01 00:00:00到现在的秒数timer时间数值时用于设置日历时间time_t是一个unsigned long类型。如果 timer不为空则返回值也存储在变量 timer中。时间戳是UNIX系统约定的从1970年的1月1日的0点0分0秒开始的时间。Linux和MaxOS就是继承该时间戳Windows内部使用的是从1601-01-01 作基准Win32 FILETIME只是 C 库帮你转换成 Unix 时间戳所以你在 time() 里看到的仍是 1970。配合上述的三个知识点我们去修改之前的代码#includestdio.h#includestdlib.h#includetime.hintmain(){// 因为这里time返回的参数是time_t的所以要强制转换成unsigned int类型srand((unsignedint)time(NULL));for(inti0;i5;i){printf(%d\n,rand());}return0;}猜数字代码实现我们通过上述函数得到了随机值后我们就可以开始来编写猜数字的代码了。首先我们要先分享该项目的代码要怎么来写猜数字的范围我们要在多少要怎么计算游戏开始菜单界面猜数字时给出提示分别是大了小了和找到了找到数字后是否继续游玩还是退出拓展是否需要提升难度比如要给次数如果在一定的次数内没有猜到给出惩罚。随机数范围生成0 ~ 99的随机数范围rand() % 100;生成1 ~ 100的随机范围rand() % 100 1;以此类推游戏菜单实现voidmenu(){printf(****************\n);printf( 1.开始游戏\n);printf( 0.退出游戏\n);printf(****************\n);printf(请选择:);}该代码我们发现不在main函数里面而是一个叫void menu()函数这是C语言的模块化设计也就是C语言的函数比如说该menu是专门负责界面的代码下面还有游戏实现的代码。void的意思就是无序返回值即不需要返回。主要是维护代码的可读性和可维护。后续我们会去系统的了解C语言函数这一章节。不写menu之间放在main函数里面也可以只是不好阅读代码这里我们可以使用goto来完成这种函数调用的方式但是不建议这样。goto在实际开发中使用的很少所以goto我们当时只作了解。这里提醒一点就是goto不能跨函数比如说我们在main函数里面写goto但是标签名在menu函数就会报错。猜数字代码实现主函数部分这里使用do······while是因为我们要去打开游戏才会选择到底玩不玩所以必须循环一次intmain(){intinput0;srand((unsignedint)time(NULL));do{menu();scanf(%d,input);switch(input){case1:game();break;case0:printf(退出游戏\n);break;default:printf(输入有误请重新选择\n);break;}}while(input);return0;}游戏部分voidgame(){intguess0;intret(rand()%100)1;while(1){printf(请输入你猜的数字(1~100):);scanf(%d,guess);if(guessret){printf(猜大了\n);}elseif(guessret){printf(猜小了\n);}else{printf(恭喜你猜对了答案是 %d\n,ret);break;}}}完整代码#includestdio.h#includestdlib.h#includetime.hvoidmenu(){printf(****************\n);printf( 1.开始游戏\n);printf( 0.退出游戏\n);printf(****************\n);printf(请选择:);}voidgame(){intguess0;intret(rand()%100)1;while(1){printf(请输入你猜的数字(1~100):);scanf(%d,guess);if(guessret){printf(猜大了\n);}elseif(guessret){printf(猜小了\n);}else{printf(恭喜你猜对了答案是 %d\n,ret);break;}}}intmain(){intinput0;srand((unsignedint)time(NULL));do{menu();scanf(%d,input);switch(input){case1:game();break;case0:printf(退出游戏\n);break;default:printf(输入有误请重新选择\n);break;}}while(input);return0;}拓展给游戏提高难度#includestdio.h#includestdlib.h#includetime.h#includewindows.hvoidmenu(){printf(****************\n);printf( 1.开始游戏\n);printf( 0.退出游戏\n);printf(****************\n);printf(请选择:);}voidgame(){intguess0;intret(rand()%100)1;intcnt5;while(cnt0){printf(请输入你猜的数字(1~100):);scanf(%d,guess);if(guessret){printf(猜大了\n);}elseif(guessret){printf(猜小了\n);}else{printf(恭喜你猜对了答案是 %d\n,ret);break;}cnt--;}if(cnt0){printf(你失败了正确值是:%d\n,ret);}}intmain(){SetConsoleOutputCP(65001);intinput0;srand((unsignedint)time(NULL));do{menu();scanf(%d,input);switch(input){case1:game();break;case0:printf(退出游戏\n);break;default:printf(输入有误请重新选择\n);break;}}while(input);return0;}这里也可以给一些惩罚比如调用Windows的关机命令或者其他命令或者其他惩罚都可以后续随着我们对C语言的了解深入还可以继续拓展该代码。游戏分享当我们写完该代码时我们想给其他人该怎么办有可能给的人没有C语言的编译环境那么他就无法运行并且我们还要给完整的源代码这和不方便那么有什么办法去解决呢如果你使用的是 Visual Studio切换成Release模式在Visual Studio顶部的工具栏中找到“解决方案配置”下拉菜单将Debug切换为Release。重新生成解决方案点击菜单栏的“生成” - “生成解决方案”。找到 .exe 文件打开你的项目文件夹进入 bin\Release 目录里面就是你需要的.exe文件。如果你使用的是 VSCode在VSCode中你需要通过命令行使用gcc编译器来生成.exe文件。打开终端在VSCode中点击“终端”(Terminal)菜单选择“新建终端”(New Terminal)。切换到代码目录在终端中使用cd命令切换到你的C语言源代码文件.c文件所在的目录。执行编译命令输入以下命令并回车gcc 你的源文件名.c-o你想要的名字.exe完
返回列表