[C语言]猜数字游戏
文章目录
- 一、游戏思路揭秘
- 二、随机数生成大法
- 1、初探随机数:rand函数的魔力
- 2、随机数种子:时间的魔法
- 3、抓住时间的精髓:time函数
- 三、完善程序
- 四、游戏成果
- 1、游戏效果
- 2、源代码
一、游戏思路揭秘
猜数字游戏,这个听起来就让人心跳加速的小游戏,它的核心奥秘在于随机数。游戏的过程就像是一场寻宝探险:生成宝藏(随机数),玩家根据提示一步步接近宝藏,直到最终发现它。如果猜对了,那就是一场胜利的欢呼;如果猜错了,游戏会像个耐心的导师,告诉你 “猜大了” 或 “猜小了” ,然后鼓励你继续尝试,直到你找到那个神秘的数字。
二、随机数生成大法
1、初探随机数:rand函数的魔力
在C语言的神秘宝库中,有一个叫rand的函数。它的魔力就是:每次你呼唤它,它都会变出一个新的随机数来。不信?那我们就来试试看:
#include <stdio.h>
#include <stdlib.h>int main()
{for(int i = 0; i < 10; i++)//重复试几次{int random = rand();//这里生成随机数printf("%d ",random);//先打印出来看看}return 0;
}
接下来运行几次测试一下,会得到重复的运行结果:
41 18467 6334 26500 19169 15724 11478 29358 26962 24464
哎呀,怎么每次运行结果都一样啊?还好我们测试了一下,这是一个好习惯,可以避免无法预料的结果。
那怎么解决呢?当然是查文档啦:文档地址。
由以上文档可知:rand函数的随机值是由一个算法生成的,该算法在每次调用它时都会返回一个明显不相关的数字序列。该算法使用种子来生成序列,该序列应使用srand方法初始化为某个唯一值。
2、随机数种子:时间的魔法
那我们再看看srand方法:文档地址。
要得到真正的随机数,我们需要给rand函数一个种子,这个种子每次都要不一样。那用什么来做种子呢?时间!时间就像流水,永远在变,用它来做种子,随机数就会像魔法一样变化无穷。
3、抓住时间的精髓:time函数
在C语言中,有一个time函数,它能获取当前的时间戳。时间戳就像是一个时间的指纹,每个时刻都有它独特的印记。
好,那我们就用时间来给rand函数设置种子,看看真正的随机数是怎么诞生的:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main()
{srand(time(NULL));//用时间设置种子for(int i = 0; i < 10; i++){int a = rand();printf("%d ",a);}return 0;
}
运行几次程序,得到以下输出:
22820 1628 32269 9569 7902 21478 16516 18171 16466 6404
哈哈,看,这次随机数真的变魔术一样变出来了!每次运行结果都不一样,太棒了!
三、完善程序
现在,我们已经掌握了随机数的奥秘,那就来打造一个完美的猜数字游戏吧!这个游戏将是一个if、switch、while、for、do…while、goto语句的完美结合:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>//显示游戏菜单
void menu()
{printf("**********************************\n");printf("*********** 1.play *************\n");printf("*********** 0.exit *************\n");printf("**********************************\n");
}//游戏主逻辑
void game()
{int random_num = rand() % 100 + 1;//生成1到100之间的随机数int input = 0;//用户输入的猜测数字int num = 0;//记录用户猜测的次数while (1)//无限循环{printf("请输入猜的数字(1-100):");scanf("%d", &input);//读取用户输入//清空输入缓存,防止输入错误导致的问题for (int i = getchar(); i != '\n'; i = getchar());num++;//猜测次数加1if (input > random_num){if (num >= 10)//如果猜测次数超过10次goto byby;//跳转到游戏结束标签system("cls");printf("猜大了!\n");}else if (input < random_num){if (num >= 10)goto byby;system("cls");printf("猜小了!\n");}else{system("cls");printf("恭喜你,猜了%d次就猜对了!\n", num);getchar();//等待用户按下回车键system("cls");return;//返回主函数}}
byby:system("cls");printf("很遗憾,你没有在规定次数内猜到%d,游戏结束!\n", random_num);//游戏结束提示getchar();system("cls");
}int main()
{int input = 5;//用户输入的选择srand((unsigned)time(NULL));//初始化随机数种子do{menu();//显示菜单printf("请选择(1/0):");scanf("%d", &input);//清空输入缓存,防止输入错误导致的问题while (getchar() != '\n')input = 2;switch (input)//根据用户选择执行不同操作{case 1://选择1system("cls");printf("开始游戏!\n");getchar();//等待用户按下回车键system("cls");game();break;case 0://选择0system("cls");printf("退出游戏!\n");break;default:system("cls");printf("选择错误!\n");//输入错误,提示用户重新输入getchar();system("cls");break;}} while (input);//当用户选择0时退出循环return 0;//程序正常结束
}
这个游戏就像是一个小小的编程世界,里面充满了分支和循环的魔法。如果你还不太熟悉这些控制语句,那就快去查查资料,学学它们的魔法吧!学会了这些,你就能更好地掌握这个游戏,甚至还能打造出更多属于你的编程小宇宙呢!
四、游戏成果
1、游戏效果
经过一系列的开发与调试,游戏的最终效果已经呈现。现在,你可以尽情享受猜数字的乐趣了:
2、源代码
为了方便大家学习和交流,游戏的源代码已经在Gitee上开源。你可以通过以下链接访问并下载源代码:传送门。