文章目录
猜数字游戏专题
掌握了前面学习的vlog的知识,尤其是分支与循环,我们可以写一个经典有趣的游戏:猜数字
游戏要求:
1.电脑自动生成1~100的随机数
2.玩家猜数字,程序根据玩家猜的数字,做出猜大了或猜小了的判断,直到玩家猜对为止
1.随机数生成
1.1 rand
rand是C语言中的一种函数,其语法形式为:
int rand (void);
rand 会返回一个随机数,这个随机数的范围在0~RAND_MAX(理论值)之间
使用该函数需要包括头文件**#include <stdlib.h>**
实际上我们多次运行只有 rand 函数的程序会发现,每次打印的随机数都相同,其实只有 rand 函数返回的是一个伪随机数,真正的随机数是无法预测下一个数是多少的, rand 函数是基于一个叫 “种子” 的基准值生成随机数,种子默认值为1,所以我们想生成完全随机的数,要让种子时刻处于变化状态
1.2 srand
srand 也是C语言中的一种函数,其语法形式为:
void srand (unsigned int seed);
srand 会初始化随机数的生成器,调用 rand 函数前要调用 srand 函数,通过 srand 函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了
那也就是说 srand 的种子如果是随机的, rand 就能生成随机数
1.3 time
易知时间是在时刻发生变化的,所以我们可以将时间作为种子来使用
time 就是C语言中的一个时间函数,其语法形式为:
time_t time (time_t* timer);
time 函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的
差值,单位是秒,返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型
time 函数的参数 timer 如果是非NULL的指针的话,函数也会将这个返回的差值放在 timer 指向的内存中带回去,如果 timer 是NULL,就只返回这个时间的差值,time 函数返回的这个时间差也被叫做:时间戳, time 函数的时候需要包含头文件:#include <time.h>
于是完整的生成随机数代码可以这样写:
srand((unsigned int)time(NULL));
printf("%d\n", rand());
srand函数是不需要频繁调用的,⼀次运行的程序中调用⼀次就够了
1.4 随机数的范围
生成0~99之间的随机数:
rand() % 100;//余数的范围是0~99
生成1~100之间的随机数:
rand()%100+1;//%100的余数是0~99,0~99的数字+1,范围是1~100
生成100~200之间的随机数:
100 + rand()%(200-100+1)//余数的范围是0~100,加100后就是100~200
生成a~b之间的随机数:
a + rand()%(b-a+1)
2.猜数字游戏的实现
首先设置主要的菜单界面:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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);
void menu()
{
printf("***********************\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("***********************\n");
}
然后设计主要的猜数字代码:
void game()
{
int r = rand()%100+1;
int guess= 0;
while(1)
{
printf("请猜数字>:");
scanf("%d", &guess);
if(guess < r)
{
printf("猜⼩了\n");
}
else if(guess > r)
{
printf("猜⼤了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
除此之外,丰富游戏玩法我们还可以加上猜的次数,自定义函数game可修改为:
void game()
{
int r = rand() % 100 + 1;
int guess = 0;
int count = 5;
while (count)
{
printf("\n你还有%d次机会\n", count);
printf("请猜数字>:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜⼩了\n");
else if (guess > r)
{
printf("猜⼤了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
count--;
}
if (count == 0)
{
printf("你失败了,正确值是:%d\n", r);
}
}
最后要注意把两个自定义函数 game 和 menu 放在主函数前
或者在主函数前加上 void mean() 和 void game() 进行函数声明 (后面会讲)