C语言实现猜数字游戏
一. 游戏要求
从上面可以得出,我们写的代码需要包括:随机数的生成和猜数字的过程(循环)两个部分,接下来让我们看一下要怎么做吧!
二. 知识补充
2.1 rand
C语言提供了一个函数 rand ,可以生成随机数,要包含头文件: stdlib.h
函数原型:
1 int rand ( void ) ;
rand 函数会返回一个伪随机数,该随机数范围在0~RAND_MAX(大部分编译器上是32767)之间
让我们来使用一下这个函数:
#include <stdio.h>
#include <stdlib.h>int main()
{printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());return 0;
}
我们可以看出,生成的三个数字是随机的,但当我们再次运行的时候发现,运行结果依旧是上面的内容,因此我们说 rand 生成的数是伪随机的。伪随机数并不是真正的随机数,它是通过某种算法生成的随机数,真正的随机数应该是无法预知下一个数字是多少的
rand 函数是对一个叫 “ 种子 ” 的基准值进行运算生成的随机数,前面之所以会产生相同的数字,是因为 rand 函数生成随机数的默认种子是 1 ,若要每次生成不同的随机数,就要让种子发生变化
下面让我么来看看怎么改变种子的值吧~
1.2 srand
C语言中提供了一个函数 srand ,用来初始化随机数的生成器
函数原型:
1 void srand (unsigned int seed) ;
让程序在调用 rand 函数之前先调用 srand 函数,通过 srand 函数的参数 seed 来设置 rand 生成随机数时的种子。只要种子变化,那每次生成的随机数序列也就会随之变化
比如:
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>int main() int main()
{ {srand(1); srand(2);printf("%d\n", rand()); printf("%d\n", rand());printf("%d\n", rand()); printf("%d\n", rand());printf("%d\n", rand()); printf("%d\n", rand());return 0; return 0;
} }
//41 //45
//18467 //29216
//6334 //24198
这样通过每次修改 srand 函数的参数 seed 就可以让每次输出的随机数不同。那么问题来了,每次在生成随机数之前还需要我们传进去一个值,那这样生成的数字还算真正意义的随机数吗?让我们看一下怎么解决这个问题吧~
1.3 time
函数原型:
1 time_t time (time_t * timer) ;
time 函数会返回1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是 time_t 类型的,本质上是32位或64位的整型类型
time函数的参数 timer 如果是 非NULL 的指针的话,函数也会将这个返回的差值放在 timer 指向的内存中带回去;如果 timer 是 NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳
time函数的使用需要包含头⽂件: time.h
如果只让 time 函数返回时间戳,就可以写:
time (NULL) ; //调用time函数返回时间戳,这里没有接收返回值
看看效果吧:
#include <stdio.h>
#include <stdlib.h>int main()
{srand((unsigned int)time(NULL));printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());return 0;
}
这样每次运行出来的数字就不一样啦
此时我们回顾一下题目,游戏规则要求我们生成的随机数范围是1~100,因此我们还需要研究一下怎么保证每次生成的随机数在这个范围里面
1.4 设置随机数范围
rand () % 100 ;
rand () % 100 + 1;
3. 生成100~200的随机数:
100 + rand () % (200 - 100 + 1);
综上,生成a~b之间的随机数:
a + rand () % (b - a + 1);
三. 思路梳理
游戏嘛,我们首先要来个菜单:
void menu()
{printf("**********************\n");printf("*** 1.开始游戏 ***\n");printf("*** 0.退出游戏 ***\n");printf("**********************\n");
}
玩家根据菜单选择是否开始游戏,这时我们给出一个循环,每一局结束后都会询问玩家是否继续玩:
由于在游戏开始之前,也要咨询玩家是否开始游戏,因此我们在这里用 do while 循环
int input = 0;
do
{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("开始猜数字\n");break;case 0:printf("游戏结束,欢迎下次再玩\n");break;default:printf("选择错误,请重新选择\n");break;}
} while (input);
如果玩家选择开始游戏,那么接下来我们就要设计猜数字的过程了:
生成一个随机数让玩家开始猜,每次猜后给出提示:猜大了 or 猜小了 or 猜对了,没猜中则继续猜,猜中则本局结束
void game()
{int ret = rand() % 100 + 1;int guess = 0;printf("请猜数字:>\n");while (1){scanf("%d", &guess);if (guess < ret){printf("猜⼩了\n");}else if (guess > ret){printf("猜⼤了\n");}else{printf("恭喜你,猜对了\n");break;}}
}......srand((unsigned int)time(NULL));
当然,我们还可以设置猜数字的次数......,来让游戏变得更好玩
四. 代码实现
根据上面的分析,让我们来看一下完整的代码演示吧:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>void menu()
{printf("**********************\n");printf("*** 1.开始游戏 ***\n");printf("*** 0.退出游戏 ***\n");printf("**********************\n");
}void game()
{//生成随机数int ret = rand() % 100 + 1;printf("%d\n", ret);//猜数字int guess = 0;int count = 6;printf("游戏开始,请猜数字:>\n");printf("你一共有6次机会\n");while (count){scanf("%d", &guess);if (guess > ret){printf("猜大了\n");}else if (guess < ret){printf("猜小了\n");}else{printf("恭喜你,猜对了\n");break;}count--;printf("你还有%d次机会\n", count);}if (count == 0){printf("很遗憾,机会用完了,正确数字是%d\n", ret);}
}int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:> ");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("本次游戏结束,欢迎下次再来玩\n");break;default:printf("选择错误,请重新输入\n");break;}} while (input);return 0;
}
结语
通过本文,你将对C语言的输入输出、循环控制、函数运用、随机数生成等内容有更好的了解,在设计程序的过程中还可以锻炼你的思维能力,不断提升自己。如果你对游戏有其他优化建议,欢迎在评论区留言讨论~