大家好,我是一只励志要翻身的小牛,废话少说,下面就给大家介绍第一个C语言小游戏——猜数字小游戏!
一、游戏规则
至于猜数字嘛,见名知意,规则无非就是:玩家反复输入猜的数字直到猜对为止,下面,我们就通过C语言实现一个1-100之间的猜数字游戏,老铁们准备好了吗,发车了!
二、效果展示
三、游戏设计思路
1.游戏交互界面
(1)创建游戏菜单
(2)创建游戏逻辑主体
2.猜数字游戏
(1)电脑生成随机数字
(2)玩家输入数字
(3)判断是否猜对
四、游戏交互界面
1.创建游戏菜单
玩游戏怎么能没有菜单呢,下面我们创建一个简易的菜单供玩家选择:
void menu() { printf("**************************************************\n"); printf("******* 1->play 0->exit ********\n"); printf("**************************************************\n"); }
2.创建游戏逻辑主体
游戏的逻辑的是否完美实现是整个游戏成败的关键,对于这样一个简单的小游戏我们可以这样实现游戏主体逻辑:
int main() { srand((unsigned int)time(NULL));//拿时间戳来设置随机数的生成起始点 int input = 0; do { menu(); printf("请选择:"); scanf("%d",&input); switch (input) {case 1: game();//猜数字游戏 break; case 0: printf("游戏结束\n"); break; default: printf("选择错误\n"); break; } } while (input);//这里用do while 循环是因为这个游戏需要至少进去一次 //特点:先执行,后判断 return 0; }
1、因为游戏是面向用户的,所以这里需要定义并调用菜单函数——menu()
2、因为游戏至少可以进入一次,所以用do-while()循环——代码至少执行一次
注意:while(input)——循环条件input的巧妙之处,C语言中0为假,非0为真,所以这里用户输入1或输入 其他非0数字导致错误,都会再次调出菜单让用户选择,无需增加其他条件。
当然了这里的猜数字游戏函数-game()还未定义,我们接下来我们就需要对 game()函数进行实现:
五、游戏实现
1、随机数生成”三剑客“
我们回到游戏的设计思路,其实猜数字游戏中最重要的一步就是生成随机数,那我们应该如何生成随机数呢?这里C语言为我们提供了随机数生成三剑客:rand--srand--time
(1)随机数生成器:rand函数
rand()函数的属性:int rand (void)——生成随机整数(0-32767)
分析:rand()函数接受参数为空,返回一个int类型的随机整数。头文件-stdlib.h
但是rand()函数真的随机吗?我们下面一探究竟:
#include <stdio.h> #include<stdlib.h> int main() { int i = 5; while (i) { int ret = rand(); printf("%d\n", ret); i--; } return 0; }
执行3次结果:
可以发现,循环5次后,每组的随机数据都一致,因此答案就很明显了,rand()函数是假随机。
(2)随机数发生器的初始化函数:srand函数
那么我们还有没有办法让它真随机呢?办法当然是有的啦,C语言同时为我们提供了一个随机数发生器的初始化函数:srand函数--配合rand函数使用,设置随机数生成起点
srand()函数属性:void srand (unsigned int seed)
分析:srand函数接受一个unsigned int类型,返回空(不需要返回值->设置随机数生成起点),头文件-stdlib.h
执行结果:
可以发现,rand函数生成的随机值随srand函数接受参数变化而变化,要想让rand函数生成一个随机数,srand函数就需要接收一个随机值
(3)获取时间戳:time函数:
那么这个随机值去哪找呢?因为时间是不断变化的,因此我们可以让srand函数接收一个时间戳。 这里引出获取时间戳:time函数:
time函数属性:time_t time (time_t* timer)
分析:time函数接收一个指针类型,返回time_t类型,头文件-time.h
(4)三剑客的”有机结合“ -真随机的实现
1.rand函数的属性:int rand (void)
2.srand函数属性:void srand (unsigned int seed)
3.time函数属性:time_t time (time_t* timer)
了解了“三剑客”各自的属性,就可以开始配置随机数生成器,实现“真随机 ”
//生成随机数的大致逻辑结构 #include<stdlib.h> #include<time.h> int main() { srand((unsigned int)time(NULL)); int ret = rand(); return 0; }
注意:
1、time函数接收指针类型参数,所以传入NULL-空指针
2、srand函数接收unsigned int类型参数 ,所以将time返回类型time_t转换为unsigned int类型
2、玩家输入与判断
玩家输入与判断模块通过简单的while循环语句与if判断语句即可实现,这里就不再分开赘述,代码如下:
void game() { int a = 0; //rand()函数生成一个随机数 int ret = rand() % 100 + 1;//1-100之间的随机数 while (1)//1为真,让他一直循环,直到猜对 { printf("请猜数字:"); scanf("%d", &a); if (a > ret) { printf("猜大了\n"); } else if (a < ret) { printf("猜小了\n"); } else { printf("恭喜你,猜对了!\n"); break; } } }
注意:
1、这里的srand函数放到了主函数中,因为调用一次函数就会设置一个随机数的生成器,不需要重复调用。
2、 rand()%100+1的含义:因为rand生成随机整数范围是(0-32767),所以rand()%100限定了范围(0-99),加1满足(1-100)范围需求。
六、完整代码
#include<stdio.h> #include<stdlib.h> #include<time.h> void menu() { printf("**************************************************\n"); printf("******* 1->play 0->exit ********\n"); printf("**************************************************\n"); } void game() { int a = 0; //rand()函数生成一个随机数 int ret = rand() % 100 + 1;//1-100之间的随机数 while (1)//1为真,让他一直循环,直到猜对 { printf("请猜数字:"); scanf("%d", &a); if (a > ret) { printf("猜大了\n"); } else if (a < ret) { printf("猜小了\n"); } else { printf("恭喜你,猜对了!\n"); break; } } } int main() { srand((unsigned int)time(NULL));//拿时间戳来设置随机数的生成起始点 int input = 0; do { menu(); printf("请选择:"); scanf("%d",&input); switch (input) {case 1: game(); break; case 0: printf("游戏结束\n"); break; default: printf("选择错误\n"); break; } } while (input);//这里用do while 循环是因为这个游戏需要至少进去一次 //特点:先执行,后判断 return 0; }
七、结语
铁汁们,猜数字游戏这点事大家都明白了吗?如果本文对你有所帮助的话,请给博主一个一键三连哦🥰