简单了解C语言后,我们尝试写出一个简单的猜数游戏吧。
游戏名称:
猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏。
游戏规则:
首先由计算机自动给出一个随机数,然后由玩家输入出所猜数字,系统会自动告知玩家所猜数据比实际数据大还是小,之后玩家可以根据系统提示,对所猜数据做出调整后再次输入,直到玩家所猜数据与实际数据相吻合,一轮游戏结束。
思路:
根据游戏规则,不难想到我们需要
- 获取一个随机数;
- 输入所猜数据并且得到反馈(猜大了,猜小了,猜对了);
- 实现可以反复玩的功能;
获取随机数和输入所猜数据得到反馈属于游戏内容,我们首先根据反复玩这个功能去建立游戏基本框架。
我们需要设计一个友好的询问菜单
menu()
界面询问玩家是否进行游戏,而且要实现反复玩的功能,这里肯定需要用到循环,游戏每结束一次,这个询问菜单界面弹出,询问玩家是否进行下一轮游戏还是退出游戏。
#include<stdio.h>
void menu(void) //询问菜单
{
printf("************************\n");
printf("************************\n");
printf("***** 1. play ********\n");
printf("***** 0. exit ********\n");
printf("************************\n");
printf("************************\n");
}
int main()
{
int input;
//菜单栏
do
{
menu(); //调用了询问菜单
printf("请选择:");
scanf("%d", &input); //玩家输入自己的选择
if (input == 1)
{
printf("进行猜数游戏\n");
}
else if(input == 0)
{
printf("退出游戏\n");
break;
}
else
{
printf("请重新输入\n");
}
} while (input);
return 0;
}
效果如下:我们已经基本实现了猜数游戏的框架构造
在上面我们基本实现猜数游戏的整体框架之后,我们需要对猜数游戏
game()
进行设计。
**rand ()**
运用 rand() 函数可以产生随机数,范围在0至RAND_MAX(32767) 之间。
#include<stdio.h>
#include<stdlib.h> //使用rand()函数的头文件
int main()
{
int i;
int a[5] = { 0 };
for (i = 0; i < 5; i++)
{
a[i] = rand();
}
for (i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
return 0;
}
运用rand()函数时,该代码块多次运行结果均相同。这就意味着如果单纯用rand()函数产生随机数时,每轮游戏将产生的随机数是相同的。若要不同,就要在使用rand()函数前使用srand() 函数,先去设置初始化随机数的生成器(生成起点)。
**srand()**
运用 srand() 函数初始化随机数的生成起点,其参数是一个整数。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
int a[5] = { 0 };
srand(100); //这里的参数是随便输入的一个数
for (i = 0; i < 5; i++)
{
a[i] = rand();
}
for (i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
int a[5] = { 0 };
srand(100); //这里的参数是随便输入的一个数
for (i = 0; i < 5; i++)
{
a[i] = rand();
}
for (i = 0; i < 4; i++)
{
printf("%d ", a[i]);
}
return 0;
}
我们发现如果每次 srand() 函数参数都设相同值,rand()所产生的随机数值每次就会一样。
所以 srand() 函数的参数每次都需要发生变化,使每次产生的随机数都不相同。这里就可以用到 时间戳。
**time()**
时间戳是当前计算机时间与计算机起始时间(1970年1月1日00点00分00秒)之间的时间差值秒数。在C语言中用 time() 表示,它的返回值是不断发生变化的。
time_t time (time_t* timer);
这里的返回类型time_t在编译器中的解释为整型。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int i;
int a[5] = { 0 };
srand((unsigned int) time (NULL));
for (i = 0; i < 5; i++)
{
a[i] = rand();
}
for (i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
return 0;
}
我们发现用time()作为strand()参数可以有效解决上面遇到的问题
但是
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int i;
int a[5] = { 0 };
srand((unsigned int) time ( NULL ));
printf("第一次");
for (i = 0; i < 5; i++) //第一次
{
a[i] = rand();
}
for (i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
printf("\n");
printf("第二次 ");
srand((unsigned int)time(NULL));
for (i = 0; i < 5; i++) //第二次
{
a[i] = rand();
}
for (i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
我们发现srand((unsigned int) time ( NULL ))
不可快速频繁调用,因为频繁调用太快时,时间戳的值不会改变,以至于 srand() 参数不会发生变化。在猜数游戏时并不需要在每次生成随机数时都将srand((unsigned int) time ( NULL ))
调用一次,只需要设置一次随机数的起点即可。
了解了以上知识,我们就可以着手写猜数游戏game()
部分。先产生一个随机数,然后输入所猜数据,直到随机数与所猜数据相同,即可退出循环。
void game()
{
int a = 0;
int guess=0;
//srand((unsigned int) time(NULL));在主函数中调用一次即可
//生成一个1到100的随机数
a = rand()%100+1;
//开始猜数字
while (1)
{
printf("请输入你所猜的数字: ");
scanf("%d", & guess);
if (guess > a)
printf("猜大了\n");
else if (guess < a)
printf("猜小了\n");
else
{
printf("恭喜你,猜对了\n");
break; //猜对以后跳出循环
}
}
}
综上,将两部分代码合并起来为:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void menu(void)
{
printf("************************\n");
printf("************************\n");
printf("***** 1. play ********\n");
printf("***** 0. exit ********\n");
printf("************************\n");
printf("************************\n");
}
void game()
{
int a = 0;
int guess=0;
//生成一个1到100的随机数
a = rand()%100+1;
//开始猜数字
while (1)
{
printf("请输入你所猜的数字: ");
scanf("%d", & guess);
if (guess > a)
printf("猜大了\n");
else if (guess < a)
printf("猜小了\n");
else
{
printf("恭喜你,猜对了\n");
break; //猜对以后跳出循环
}
}
}
int main()
{
srand((unsigned int)time(NULL));//用时间戳作为参数,设置随机数的生成起点。
int input;
do
{
menu();// 询问菜单
printf("请选择:");
scanf("%d", &input);
if (input == 1)
{
game();
}
else if(input == 0)
{
printf("退出游戏\n");
break;
}
else
{
printf("请重新输入\n");
}
} while (input);
return 0;
}
运行结果:
game over !