猜字谜游戏
我们可以用代码写一下有趣的游戏,比如猜数字。
游戏要求:
1.电脑自动生成1-100的随机数;
2.玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直至猜对,游戏结束。
1.随机数生成
要想进行游戏,我们首先要能产生随机数。那么,如何产生随机数呢?
1.1 rand 函数
C语言提供了一个叫rand的函数,可以用来生成随机数,该函数原型如下:
1 int rand (void);
rand返回的随机数范围在0~RAND_MAX之间,这个RAND_MAX的大小是靠编译器实现的,大部分编译器上是32767。
使用rand函数时需要包含头文件:stdlib.h
但是需要注意,rand函数会返回伪随机数。伪随机数不是真正的随机数,而是通过某种算法生成的随机数。rand函数是对一个叫“种子”的基准值进行运算生成的随机数。rand函数生成随机数的默认种子是1,因此程序每次运行时,rand函数产生的随机值的结果是一样的,如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
我们可以看到两次的运行结果一致。如果要生成不同的随机数,就要让种子变化。
1.2 srand 函数
srand函数用来初始化随机数的生成器,原型如下
1 void srand (unsigned int seed);
程序在调用rand函数前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数也就变化了。只要srand所设置的种子随机,那么rand就能生成随机数。问题在于,如何让种子发生变化呢?
1.3 time 函数
在程序中,我们一般是使用程序运行的时间作为种子,因为时间是时刻在变化的。
C语言中的time函数就能获得这个时间,time 原型如下:
1 time_t time (time_t* timer);
time函数会返回当前的日历时间,返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型,time_t类型本质上是32位或者64位的整型类型。
如果time_t的参数timer是非NULL的指针,函数也会将这个返回的差值放在timer指向的内存中带回去。
如果timer是非空指针,就只返回这个时间的差值。time函数返回的这个时间差也被叫做时间戳。网上可以找到查询时间戳的网站,感兴趣的可以用网站换算一下。
time函数需要包含头文件:time.h
只是让time函数返回时间戳,可以这样写:
1 time(NULL);//调用time函数返回时间戳,这里没有接收返回值
特别注意:srand函数只需调用一次,所以放在主函数中就行了。
不能把srand函数放在自定义函数中,否则srand函数调用多次,每一次都先设置基准值,生成的随机数可能会一样或者十分接近。
由此,猜数字游戏的关键几个函数我们就都掌握了。
1.4 设置随机数的范围
rand生成的随机数从0~32767,范围实在太大,按照这个范围,我们很难猜出正确的答案。所以,我们必须限制随机数的大小。
如果我们要生成0~99的随机数,方法如下所示:
1 rand()%100;//余数的范围是0~99
一个数字模上100所得的余数结果只能是0~99。
如果生成1~100的随机数,如下:
1 rand()%100+1//%100的余数是0~99,再+1,范围是1~100
如果要生成100~200的随机数,则
1 100 + rand()%(200-100+1)//括号内是101,则余数是0~100,再加上100,范围是100~200
由上述可知,生成a~b的随机数的公式:
1 a + rand()%(b-a+1)
了解这些,我们就可以成功限制随机值的范围,猜数字游戏就可以正式开始实现了。
2.猜数字游戏的实现
首先,我们先写一个主函数。
这里非常适合使用do while循环,do while循环在判断前就会执行一次,而我们在玩猜数字游戏时需要先输入再判断,至少需要执行一次。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
//将time强制类型转换,time虽然返回的是整型类型,但编译器不认识
int r = 0;
srand((unsigned int)time(NULL));
do
{
printf("***********************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("***********************\n");
printf("请选择:>");
scanf("%d", &r);
switch(r)
{
case 1:
printf("猜数字游戏\n");
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
} while (r);
return 0;
}
这里我们会发现主函数太臃肿了,我们可以把前4个打印游戏菜单的printf函数移到自定义函数中去。并且case1中无法实现猜数字,我们需要再自定义一个函数,用来实现猜数字的过程。
如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
int r = rand() % 100 + 1;//生成随机数,并让随机数的范围在1—100之间
int math = 0;//输入的数值
while (1)
{
printf("请猜数字>");
scanf("%d", &math);
if (math > r)
printf("输大了\n");
else if (math < r)
printf("输小了\n");
else
{
printf("恭喜你,猜数字成功\n");
break;
}
}
}
void menu()//游戏菜单
{
printf("***********************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("***********************\n");
}
int main()
{
//将time强制类型转换,time虽然返回的是整型类型,但编译器不认识
int i = 0;//赋值游戏开始输入的值
srand((unsigned int)time(NULL));//设置基准值,使种子变化
do
{
menu();//游戏菜单
printf("请选择:>");
scanf("%d", &i);
switch(i)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
} while (i);
return 0;
}
由此,我们就基本完成了实现猜数字游戏的代码。
当然,为了给游戏增加难度,我们可以给猜数字游戏加上猜数字的次数限制,这里我设置为5次,如果5次猜不出,则游戏失败。如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
int r = rand() % 100 + 1;//生成随机数,并让随机数的范围在1—100之间
int math = 0;//输入的数值
int count = 5;//可猜数字的次数为5次
while (count)
{
printf("你还有%d次机会\n", count);
printf("请猜数字>");
scanf("%d", &math);
if (math > r)
printf("输大了\n");
else if (math < r)
printf("输小了\n");
else
{
printf("恭喜你,猜数字成功\n");
break;
}
count--;
}
if(count==0)
printf("你失败了,正确的答案是%d\n", r);
}
void menu()//游戏菜单
{
printf("***********************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("***********************\n");
}
int main()
{
//将time强制类型转换,time虽然返回的是整型类型,但编译器不认识
int i = 0;//赋值游戏开始输入的值
srand((unsigned int)time(NULL));//设置基准值,使种子变化
do
{
menu();//游戏菜单
printf("请选择:>");
scanf("%d", &i);
switch(i)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
} while (i);
return 0;
}
这样,一个有趣的猜数字游戏就完成了。