//猜数字游戏
//1. 电脑随机生成一个随机数
//2.猜数字
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("*********************************");
printf("*** 1. play 0. exit ***********");
printf("*********************************");
}
void game()
{
int guess = 0;
// 1. 生成一个随机数
// 拿时间戳来设置时间起点
int ret = rand()%100 +1; // 生成随机数
// 如果将ret = rand();直接放到while里面,会每次循环生成一个数字
// 2. 猜数字
printf("猜数字");
while (1)
{
scanf("%d", &guess);
if (ret > guess)
{
printf("猜小了");
}
else if (ret < guess)
{
printf("猜大了");
}
else
{
printf("恭喜你,猜对了!");
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("\n请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("exit the game\n");
break;
default:
printf("error in this way\n");
break;
}
} while (input);
}
代码如图所示,非常简单有意思的一个小软件,在此尝试回顾本段代码的含义:
首先解释三个第一次遇到的函数 -srand -rand -time()
-srand 函数是随机数发生器的初始化函数(来自百度百科)
-rand 函数是伪随机数发生器,因为每次运行的结果都相同,因此经常配合-srand使用
Remarks: the rand function returns a pseudorandom integer in the range 0 to RAND_MAX.
Use the srand function to seed(设置) the pseudorandom-number generator before calling(调用) rand.
-time() 时间戳函数,返回一个指针,通过时间的不断变化,配合-srand生成真正的随机值
在srand((unsigned int)time(NULL))中,如果使用-srand()返回一个固定值,那么生成的值将会固定,因此我们配合-time()使用,但由于-time()会返回一个time_t类型的指针,因此我们需要用unsigned int强行转换为整型,值得一提的是,time_t在定义中,其实是长整形long类型;另外,-time()需要调用一个指针,我们用NULL(空指针)来代替。因此srand((unsigned int)time(NULL))就完成了。
由此,整个代码最核心的部分,生成一个随机数就已经大功告成了,我们通过控制ret的大小,如代码所示的:
int ret = rand() % 100 + 1;
或者按照自己的意愿确定一个区间,就可以实现。其余内容只不过是对整款代码的添色。
另外值得一提的是在主函数中的do while 语句设置,由于while(input),因此input为真(非零)的时候,会执行循环,所以如果将case 0 换成其他数字,这个界面都会出现bug。
最后
while(1)
{
这里是循环的内容!
}
这样的循环操作对于我这样的小白真的是大开眼界,由于while判断永远为真,只要执行到game();这个函数,这个循环就一定会执行,而不需要任何条件,学习了!
第一次敲出一个互动性代码,还是有点开心,玩了大概10分钟。
最后回顾这篇代码的时候还是有些吃力,对于核心的三个代码的内容还是不怎么清晰,希望自己再接再厉!