要实现的功能
- 生成1-100之间的随机数
- 猜大了,告诉猜大了
- 猜小了,告诉猜小了
- 猜对了,告诉猜对了
让我们先写一个菜单函数吧
void menu()
{
printf("************************\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("************************\n");
}
接着是代码的主体
从主函数写起,我们可以写一个循环,来实现多次玩游戏。这里可以用while
或者do...while
都可以,然后就是用switch...case
语句实现菜单的选择。
在下面的代码中,我们用了choice
作为循环条件,逻辑上更为简便,在你选择输入了0
之后,因为选项内容是结束游戏,所以循环条件为0
时,恰好结束循环,游戏随即退出。
int main()
{
int choice = 1;
do
{
menu();
printf("请选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (choice);
return 0;
}
在这里将choice
初始化为1
或者0
都是没问题的,只不过在用while
循环的时候,因为循环条件只有是非0的时候才能执行,所以不能将choice
初始化为0
。
在写到这里时,先不要急着往下写,不妨先测试一下,看看有没有语法和逻辑上的错误,确定无误后在写接下来的内容
接下来是游戏函数
这是这项程序中最重要而且是最难的部分,我们需要生成一个随机数
在C语言中,有一个生成随机数的函数
rand()
,包含在<stdlib.h>
头文件中。
void game()
{
int ret = rand();
printf("%d\n", ret);
}
该函数会以某种算法生成特定的范围内的数,但是该函数会有一个缺陷,会生成固定的数,先看一下结果。
很明显两次出现的“随机数”结果相同, 这能很好的说明它是不够随机的,那它不就是没用了吗?不是这样的,这个函数想要发挥作用,需要一个与它密切相关的函数———srand()
,此函数可以理解为种子函数
void game()
{
srand(1);
int ret = rand();
printf("%d\n", ret);
}
当函数接收1
时
当函数接收2
时(就是将srand()
括号中写上2)
“种子”即意为源头,当源头相同时,会生成一样的数,就像上面srand()
接收1
或者2
所得到的数字;当源头不同时,srand()
接收1和2所得到的数字不同,rand()
函数用某种算法计算出的”随机值“才会不同。
所以当我们要随机起来,srand()
函数要接受的数字得变化起来。
这里介绍一个工具——时间戳
我们在百度中直接搜索便可找到
时间戳
Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
我们其实这样理解就可以了:它为某一刻的时间赋予了一个编码、代号。(现在只需要知道这么多就可以了,想要深入了解可以自行搜索)时间是不断变化的,我们利用这个就可以实现数字的不断变化,以此来生成随机数。
在C语言中,调用时间戳的函数是
time()
,包含在<time.h>
头文件中
void game()
{
srand((unsigned int)time(NULL));
int ret = rand();
printf("%d\n", ret);
}
我们可以看到,srand()
函数接收unsigned int
类型的数值,我们将其强制转换,time(NULL)
函数携带空指针返回(学识有限,实在无法解释为什么用空指针,大家见谅),返回一个时间戳。
这时我们就可以看到,数字在变换,不过我们仍然可以发现,数字太过相近,当我们按的过快的时候,后面的数字都有可能相同,因为按的过快,时间太接近,时间戳就相近,所以要想解决这个问题,我们需要把”种子“函数srand
搬到game()
函数外面,搬到主函数main
中,srand
在循环外面,game()
在循环中,那么当运行程序的时候,时间戳不会和循环内部同步,就可以生成不同的随机数了。
int main()
{
srand((unsigned int)time(NULL));
int choice = 1;
do
{
menu();
printf("请选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (choice);
return 0;
}
由于我们要生成1-100之间的数字,我们就需要进行一些操作
int ret = rand()%100+1;
,顺便把printf()
屏蔽掉,总不能打印出来要猜的数字把。
然后就是简单的猜数字循环了
void game()
{
int ret = rand()%100+1;
//printf("%d\n", ret);
int x = 0;
while (1)
{
printf("请猜数字:");
scanf("%d", &x);
if (x > ret)
{
printf("猜大了\n");
}
else if (x < ret)
{
printf("猜小了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
完整的代码如下
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//1.菜单
void menu()
{
printf("************************\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("************************\n");
}
//2.生成随机数,猜数字
void game()
{
int ret = rand()%100+1;
//printf("%d\n", ret);
int x = 0;
while (1)
{
printf("请猜数字:");
scanf("%d", &x);
if (x > ret)
{
printf("猜大了\n");
}
else if (x < ret)
{
printf("猜小了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
//3.主函数
int main()
{
srand((unsigned int)time(NULL));
int choice = 1;
do
{
menu();
printf("请选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (choice);
return 0;
}
难免有疏漏,烦请各路大佬指正,感谢感谢!!!