目录
一. 游戏规则
电脑会随机生成1-100范围内一个数,这个数对玩家是不可知的,玩家需要做的是猜一下数字是多大,并在键盘上输入所猜想的数字,电脑会根据玩家输入的数字给出以下提示:
a> 如果猜大了,电脑会提醒猜大了,继续猜
b> 如果猜小了,电脑会提醒猜小了,继续猜
c>如果猜对了,恭喜你,猜对了,结束游戏
成功猜对数字,即玩完一把游戏后,程序不会结束,可以选择继续玩,或者退出游戏。
二. 知识储备
这个小游戏的实现,需要大家掌握while,do while循环语句,if else多分支语句,switch选择语句,以及函数的调用。此外,在下文中我还会对代码中用到的rand函数和srand函数进行简单讲解。
三. 代码实现
3.1 代码理解
对于这个小游戏,在开始玩时首先会进入游戏菜单,因此要先在屏幕上打印出游戏菜单。下面是打印菜单的函数。
//游戏菜单
void menu()
{
printf("**************************\n");
printf("**********1.play**********\n");
printf("**********0.exit**********\n");
printf("**************************\n");
}
根据游戏菜单,选择1开始游戏或者选择0退出游戏,通过switch选择语句来实现。因为一局游戏在结束之后并不会退出程序,所以需要通过循环语句来对整个过程进行循环,直到玩家输入0退出游戏为止。
do
{
//打印游戏菜单
menu();
printf("请选择:>");
scanf("%d", &i);
switch (i)
{
case 1:
game();
break;
case 0:
break;
default:
break;
}
} while (i);
当玩家输入1时,开始游戏,电脑会生成一个对玩家不可见的随机数,通过rand以及srand函数来实现,玩家则将自己所猜的数字通过键盘输入到电脑,电脑会根据玩家输入的数字给与提示,直到玩家猜对结果。玩完一局后,屏幕上会继续显示游戏菜单,由玩家选择继续下一把游戏或者退出游戏。
//游戏主体
void game()
{
int n = 0;
int num = rand() % 100 + 1;//生成一个1-100范围内的随机数
printf("请在键盘上输入您所猜的数字:>");
while (1)
{
scanf("%d", &n);
if (n > num)
printf("猜大了,继续猜。\n");
else if (n < num)
printf("猜小了,继续猜。\n");
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}
3.2 rand函数srand函数理解
在游戏中,电脑生成随机数是由rand函数和srand函数共同实现的,调用这两个函数需要包含头文件<stdlib.h>。在c语言中,rand函数可以用来产生随机数,但并不是真正意义上的随机数。它是返回介于 0 和 RAND_ MAX 之间的伪随机整数。这个数字是由一个算法生成的,该算法每次调用它时都返回一个显然不相关的数字序列。该算法是使用一个种子来生成序列,当计算机正常开机后,这个种子的值是固定的,因此产生的伪随机整数也是固定的,除非你为了改变这个值破坏了系统。为了初始化的值不同,C语言提供了srand函数。下面用代码展示单独rand函数生成的随机数:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 0;
int random_num = 0;
for (i = 0;i < 5;i++)
{
random_num = rand() % 100 + 1;//生成1-100的随机数
printf("%d ", random_num);
}
return 0;
}
经过在vs编译器上的多次运行,发现rand函数每一次生成的随机数都相同 ,因此要配合srand函数一起使用。
int rand( void );
void srand( unsigned int seed );
rand函数每次调用前都会查询是否调用过srand(seed),是否给seed设定了一个值,如果没有,种子的值就默认为1,直接用 1 来初始化种子,那生成的随机数每次就会重复,为了防止生成的随机数重复,一般使用时间戳作为时间种子,采用系统时间来初始化,使用time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数。time函数需要包含头文件<time.h>
如果我们两次调用srand函数设置随机数种子之间的时间间隔不超过1s,这会导致我们重置随机数种子,从而等价于使用了一个固定的随机数种子。那么这两次调用最后生成的随机数就是相同的。所以,一定不要将srand写在生成随机数的循环中。
下面是猜数字游戏的完整代码。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//猜数字游戏
//1.电脑会随机生成一个数
//2.猜数字
//a> 猜大了,提醒猜大了,继续猜
//b> 猜小了,提醒猜小了,继续猜
//c> 猜对了,恭喜你,猜对了,结束游戏
//3.玩完一把不过瘾可以继续玩,不用退出程序
//游戏菜单
void menu()
{
printf("**************************\n");
printf("**********1.play**********\n");
printf("**********0.exit**********\n");
printf("**************************\n");
}
//游戏主体
void game()
{
int n = 0;
int num = rand() % 100 + 1;//生成一个1-100范围内的随机数
printf("请在键盘上输入您所猜的数字:>");
while (1)
{
scanf("%d", &n);
if (n > num)
printf("猜大了,继续猜。\n");
else if (n < num)
printf("猜小了,继续猜。\n");
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}
int main()
{
int i = 0;
srand((unsigned)time(NULL));
do
{
//打印游戏菜单
menu();
printf("请选择:>");
scanf("%d", &i);
switch (i)
{
case 1:
game();
break;
case 0:
break;
default:
break;
}
} while (i);
return 0;
}