写一个猜数字游戏,要求如下:
1,自动产生一个1-100之间的随机数
2,猜数字
a. 猜对了,就会恭喜你,游戏结束
b. 猜错了,会告诉你猜大了,还是猜小了,继续猜,直到猜对
3,游戏可以一直玩,除非退出游戏
目录
解析:首先我希望玩完一把不过瘾,能再来一把,并且一开始就能玩,所以采用do while结构
int main(void)
{
do
{
} while ();
return 0;
}
do while 怎么写?
打印一个菜单:menu()
并且定义这个menu()函数,设定1 ——玩游戏,0 —— 退出游戏
声明一个input,让玩家选择玩还是不玩
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{
printf("*************************\n");
printf("******** 1.play *********\n");
printf("******** 0.exit *********\n");
printf("*************************\n");
}
int main(void)
{
int input = 0;
do
{
menu(); //打印菜单
printf("请选择:>"); //选择玩还是不玩
scanf("%d", &input);
} while ();
return 0;
}
如果玩家选择0,结束游戏
如果玩家选择1,开始游戏
如果玩家输入既不是0也不是1,提示玩家选择错了,重新选择
这时候用 switch语句来判断 input 的选择
do while 结构的while(),括号里放input,这是因为:
switch 里面如果选择1,就会开始游戏,猜完之后break跳出 switch,就会在 while那里进行判断,1为真,所以会继续执行do语句——继续游戏;
如果switch 里面选择0,while这里判断0为假,所以不会再次执行do语句——游戏结束;
同理,如果玩家选择其他非0数,while也会判断为真,继续执行do语句。
define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{
printf("*************************\n");
printf("******** 1.play *********\n");
printf("******** 0.exit *********\n");
printf("*************************\n");
}
int main(void)
{
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);
return 0;
}
到此,基本框架搭好了。下面开始优化猜数字的过程。
把猜数字的过程实现放到一个函数game()里面去。
1, 首先要生成一个随机数
怎么生成随机数呢?有一个库函数 rand(), 它需要一个头文件#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void menu()
{
printf("*************************\n");
printf("******** 1.play *********\n");
printf("******** 0.exit *********\n");
printf("*************************\n");
}
void game() //猜数字游戏的实现
{
//1.生成随机数
int ret = rand();
printf("%d\n", ret);
}
int main(void)
{
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);
return 0;
}
此时,rand()函数返回了一个0-32767之间的数字,但是每一次重新打开游戏,跳出来的随机数都和上一次重新打开游戏的时候是一样的,不够随机。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void menu()
{
printf("*************************\n");
printf("******** 1.play *********\n");
printf("******** 0.exit *********\n");
printf("*************************\n");
}
void game() //猜数字游戏的实现
{
//1.生成随机数
int ret = rand();
srand(100); //将生成器设置为一个固定的数
printf("%d\n", ret);
}
int main(void)
{
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);
return 0;
}
如果用srand()函数把生成器设置成一个固定数,则一局游戏中每次跳出来的数都是一样的,对比见下图:
所以给到srand()的不是固定数,是一个随机值,才能生成一个随机值。
怎么给到srand()一个随机数呢?
把时间也就是时间戳作为参数传给srand()
时间戳,像邮戳一样,是个时间点,是某个时间相较于计算机的起始时间差值,换算成以秒为单位的一个数字。
怎么获取时间戳?
用库函数 —— time()函数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("*************************\n");
printf("******** 1.play *********\n");
printf("******** 0.exit *********\n");
printf("*************************\n");
}
void game() //猜数字游戏的实现
{
//1.生成随机数
srand((unsigned int)time(NULL)); //time()函数有参数的,这里不用它的参数,传入空值NULL
//time() 需要引用头文件 #include<time.h>
//把time()函数的返回类型强制改为unsigned int(srand的返回类型)
int ret = rand();
//srand(100); //这是错的,srand()需要一个变的量,才能生成随机值
printf("%d\n", ret);
}
int main(void)
{
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);
return 0;
}
此时运行程序可以看到,随机值还是不够随机。这是因为srand()确实要在rand()之前调用,但是这个随机数起点的设置srand()也被带入了循环,玩一次游戏重新设置一次。频繁地设置随机数起点会导致随机数不够随机。
实际上整个游戏srand()只需要设置一次就可以了。所以把srand()放到主函数循环的外面。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("*************************\n");
printf("******** 1.play *********\n");
printf("******** 0.exit *********\n");
printf("*************************\n");
}
void game() //猜数字游戏的实现
{
//1.生成随机数
int ret = rand();
//srand(100); //这是错的,srand()需要一个变的量,才能生成随机值
printf("%d\n", ret);
}
int main(void)
{
int input = 0;
srand((unsigned int)time(NULL)); //time()函数有参数的,这里不用它的参数,传入空值NULL
//time() 需要引用头文件 #include<time.h>
//把time()函数的返回类型强制改为unsigned int(srand的返回类型)
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;
}
此时生成的随机数就比较随机,但是它的范围是0-32767,题目是要求0-100。
先让 int ret = rand() 这个已经生成的随机数模100,rand()%100,余数是0-99,然后+1,范围就变成0-100。这时候生成的随机数就是0-100之间。生成的随机数不能给玩家看,所以把printf("%d\n", ret);注释掉了
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("*************************\n");
printf("******** 1.play *********\n");
printf("******** 0.exit *********\n");
printf("*************************\n");
}
void game() //猜数字游戏的实现
{
//1.生成随机数
int ret = rand() % 100 + 1;
//%100的余数是0-99,然后+1,范围变成0-100
//printf("%d\n", ret);
}
int main(void)
{
int input = 0;
srand((unsigned int)time(NULL)); //time()函数有参数的,这里不用它的参数,传入空值NULL
//time() 需要引用头文件 #include<time.h>
//把time()函数的返回类型强制改为unsigned int(srand的返回类型)
//srand(100); //这是错的,srand()需要一个变的量,才能生成随机值
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;
}
2,猜数字
随机数生成搞了,下面开始优化猜数字步骤
猜数字可能猜好多次,这里用个while循环,每一次猜前都提示一下,printf("请猜数字:>“),这时候需要输入一个值,用scanf(),猜的数字需要存起来,所以声明一个变量guess。
如果玩家猜的数guess < 随机数ret,告诉玩家猜小了;
如果玩家猜的数guess > 随机数ret,告诉玩家猜大了;
如果玩家猜的数guess = 随机数ret,告诉玩家猜对了,这时候break跳出去。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("*************************\n");
printf("******** 1.play *********\n");
printf("******** 0.exit *********\n");
printf("*************************\n");
}
void game() //猜数字游戏的实现
{
//1.生成随机数
int ret = rand() % 100 + 1;
//%100的余数是0-99,然后+1,范围变成0-100
//printf("%d\n", ret);
//2.猜数字
int guess = 0;
while (1) //值为真,可一直猜
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main(void)
{
int input = 0;
srand((unsigned int)time(NULL));
//time()函数有参数的,这里不用它的参数,传入空值NULL
//time() 需要引用头文件 #include<time.h>
//把time()函数的返回类型强制改为unsigned int(srand的返回类型)
//srand(100); //这是错的,srand()需要一个变的量,才能生成随机值
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;
}
总结思路
先写出主框架:do while 循环,然后来到game()函数,生成随机数。
随机数怎么生成?调用rand()函数,而调用rand()之前又需要调用srand(),调用srand()的时候需要用到库函数time(),这样就生成了随机数,这个随机数 ret % 100 + 1就设置好了随机数的范围。
然后开始猜数字,猜的话1次可能要猜很多次,所以用了while循环去猜。
注意事项:猜大猜小的提示信息不能给错。在while循环外部先生成随机数,不能每猜一次都重新生成一个随机数,不然这样永远也猜不对。