C语言程序设计第7天/猜数字游戏与个人解析

发布时间:2026/7/22 10:50:04
C语言程序设计第7天/猜数字游戏与个人解析 猜数字游戏电脑自动生成1~100的随机数玩家猜数字猜数字的过程中根据猜的数字大小给出大了或小了的反馈直到猜对游戏结束。流程图代码实现#includestdio.h #includestdlib.h //生成随机数函数头文件 #includetime.h //time时间戳头文件 void game(){ //将游戏逻辑和过程封装进函数game int input_num 0; //将用户猜的数字储存 int r rand() % 100 1; //随机生成1-100中的一个数 printf(Please type a number\n); do { int ret scanf(%d,input_num); if(ret ! 1) { while(getchar() ! \n); printf(Wrong input! Please enter num\n); continue; //执行完不退出循环跳过这一轮重新输入 }if (input_num 101) { printf(You gave up!\n); return; // 直接退出 game 函数 }else if (input_num r){ printf(The entered number is smaller than it\n); //如果小于生成的随机数则提示小了 }else if (input_num r){ printf(The entered number is bigger than it\n); //如果大于生成的随机数则提示大了 } } while (input_num ! r); //输入的数字不等于随机数时循环到上面重新输入数字 printf(Congratulations on beating it!\n); //答对了 printf(Do you want to go again?\n); } int main(){ srand((unsigned int) time (NULL)); //将time返回的时间戳强制转换为int类型给srand使srand生成的种子每次都不一样 int input 0; do { printf(--------------\n); printf(----1.play----\n); printf(----0.eixt----\n); printf(-Please enter-\n); printf(--------------\n); scanf(%d,input); //选择1或0 switch (input) { case 0: printf(Exit Game byebye!\n); break; case 1: printf(Start Game\n); game(); //玩游戏的函数 break; default: printf(Error, please choose 1 or 0 again\n); //用户输入非1或0的数据提示错误重新输入; break; } } while (input); return 0; }项目场景1我发现如果用户按错了输入成其他字符或字母时程序会出现死循环我试图解决这个情况问题描述问题当运行时我在猜数字阶段输入非整型后程序自动循环一句话“The entered number is smaller than it”原因分析可能是由于输入非整型后scanf读取失败a留在缓冲区返回0后判断为The entered number is smaller than it。小于随机数同时scanf不会把错误字符从缓冲区移除导致无法重新输入数据而无限循环可以加入一段重制scanf的代码解决方案加入了一段判定是否为异常数据的if语句但其中的语句并没有学过项目场景2我希望在进行猜数字的过程中用户可以随时退出于是添加新的if判断是否需要退出程序问题描述问题输入101后无法退出原因分析检查了代码都没有问题可能是exe文件还是旧版解决方案新建了一个c语言文件将代码复制过去运行发现没问题判断为exe文件未及时更新中断所有进程重新编译运行可以使用了随机数生成rand函数使用C语言中的rand函数可以生成随机数int rand(void)使用rand函数与srand函数前需要包含一个头文件stdlib.h而rand函数生成的随机数其实是一个伪随机数范围在0~RAND_MAX之间RAND_MAX的大小依赖编译器大部分编译器上是32767printf(rand num:%d,rand()); //带括号为rand生成的随机数printf(rand num:%d,rand); //不带括号为rand这个函数在内存中的地址之所以运行时不带括号的每次都不一样看着更像随机数的原因是现代操作系统使用了地址空间布局随机化每次程序启动时操作系统故意把函数、变量加载到内存中的不同位置就像每次搬家时把家具摆在不同房间一样。这样做是为了安全防止黑客通过固定地址发起攻击比如缓冲区溢出攻击而带括号的rand生成的就像上面说的是伪随机数。它是基于“种子”计算得出。如果你不调用srand()设置种子C语言默认种子是1。种子相同 → 算法相同 → 生成的随机数序列完全相同。所以每次运行程序时rand()输出的随机数都是一样的。那么如何让rand()的种子变化可以使用srand函数。srand函数为rand()函数设置随机数生成器的“种子”。#include stdlib.hvoid srand(unsigned int seed);void这个函数什么都不返回不会像scanf一样返回0和非0srand函数名全称是“seed Rand”设置随机的种子unsigned int意为调用这个函数时必须要传一个unsigned int类型的数字非负整数seed表示你传进来的数字会被当做种子使用可以传任何的unsigned int 值如0、100、99999、time(NULL)返回的时间戳、123等在rand函数中的用法srand((unsigned)time(NULL));可以理解为time(NULL)↓返回当前时间戳如 1698765432类型 time_t↓(unsigned)强制转换↓转成 unsigned int如 1698765432可能截断↓srand(1698765432)↓种子被存入内部全局变量↓之后每次调用 rand()都从这个种子开始推算在用srand设置好种子后rand函数不需要做任何修改或接收额外参数。每次运行程序时调用rand()的时候就会根据srand的种子自动计算好。time函数使用time函数前需要添加time.t头文件在学习过程中通常是使用程序运行的时间作为种子因为时间是时刻在变化的。那么可以使用time函数#include time.htime_t time(time_t *timer);time_t返回值类型时间戳从1970年1月1日到现在的秒数time函数名time_t*timer参数一个指向time_t的指针可以传NULL只取返回值time函数的参数timer 如果是非NULL的指针的话函数也会将这个返回的差值放在timer指向的内存中带回去。如果timer是 NuLL就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。时间戳从某个固定的时间点开始到现在一共经过了多少秒或毫秒题外理解getchar在项目场景1中我使用了while(getchar() ! \n);来进行进一步的程序完善while(getchar() ! \n);这句话的意思当getchar读取的字符不是回车符时就执行循环。while((c getchar()) ! \n);给这段代码加上变量的话就可以保存读到的字符图解执行代码后getchar的特性是读取并返回字符是否存储取决于自己有没有添加变量存储读取的字符scanf的特性是根据格式读取并存储失败的会留在缓冲区这两个函数刚好可以补齐短板。

相关新闻

最新新闻

日新闻

周新闻

月新闻