分析
猜数字游戏,顾名思义。就是一个人心里默想一个数字,然后我们来猜。当然这个被猜想的数字一定是有范围的。而且一旦被猜者想好后就不能更改。然后我们猜数的一方,根据自己报出的数字,结合被猜者判断后反馈给我们的信息,我们再重新确定范围后再一次猜数。依次循环,知道被猜者反馈给我们猜对了的信息后。猜数游戏才结束。
如果交由计算机来做的话。我们需要先实现规定好猜数范围。利用计算机自己生成的随机数来当做被猜者心中的数值。然后用户输入自己所猜想的数字,计算机通过屏幕反馈信息。直到猜对了,单次的猜数游戏才算结束。
步骤总结
- 确定数值范围,再让计算机生成随机数。
- 用户输入自己所猜想的数。和已经生成的随机数比较,从而影响接下来的过程。.
- 若猜测错误,则通过屏幕反馈信息,并再次要求用户输入数据;
若猜测正确,则结束这次游戏。
以上则是大体思路。具体分布实现过程见下文。
分步实现
第一步
再游戏开始之前,需要通过屏幕提供用户一定的信息。用户可以在这里决定要不要玩这个游戏。
如果玩这个游戏,则开始猜数游戏,如果不玩,则可以关闭改程序。
(如果提供这些信息,用户可能一脸懵逼,毕竟程序是为了让使用者更好的使用,而不是身为床罩这的我们单纯的能自己自娱自乐)
所以我们需要给该程序提供一个主菜单
主菜单MENU1()函数
void MENU1()
{
printf("\t\t\t\t欢迎来到猜数字游戏\n\t\t系统将给出一个100以内的随机数作为答案,供你猜想\n");
printf("\t\t ########################################\n");
printf("\t\t ###### *1:开始游戏 ######\n");
printf("\t\t ###### *2:退出游戏 ######\n");
printf("\t\t ########################################\n");
}
第二步
用户在看到主菜单之后,会根据以获取的信息进行功能选择,由块代码克制,我们至少需要实现两个功能。暨1.实现猜数游戏的运转。2.退出这个游戏。所以我们需要分支语句来进行条件匹配的选择。最好是用的就是switch语句,简单粗暴。
int main()
{
srand((unsigned long)time(NULL));//随机数种子
MENU1();
int a = 0;
while (1)
{
scanf("%d", &a);
switch (a)
{
case 1:PLAY(); goto loop;//break;//goto
case 2:
printf("游戏结束");
return 0;//提前结束主函数,使得游戏退出
default:printf("请输入正确编号\n");
}
loop:break;
}return 0;
system("pause");
}
其中,由于用户看到的功能选项是1和2所以用户一般都会从键盘输入相应的数字,来试图实现对应的功能。所以我们声明一个变量a。使用户的选择赋值到a中,最后通过switch(a)和case搭配来实现相对应的功能的跳转。但是如果用户非要输入除了这1和2以外的数呢,我们就需要提示用户,输入的功能号错误。同时为了避免多次重复输入错误额,我们将其放入到一个死循环中,通过功能1和2的return 和goto来结束main(),非1和2的输入值将永远循环提示用户输入错误,知道功能号对应正确。
第三步
猜数游戏主体
已知数据范围是0-100,所以用户通过不断的试验,在结合程序的结果(用户猜大了,还是猜小了)帮助用户不断调账所猜测数字的区间,最终逼近被猜数字,直到猜测正确。
void PLAY()
{
int n = 0;
do
{
n = rand() % 100 + 1;//膜100+1使得n的范围为【0-100】
int x = 0;
printf("请输入你猜想的数字\n");
scanf("%d", &x);
if (n > x)
{
printf("你所猜的数字%d小了", x);
}
else if (n < x)
{
printf("你所猜的数字%d大了", x);
}
else
{
printf("你所猜的数字%d是正确的\n", x);
MENU2();
int z = 0;
scanf("%d", &z);
if (z == 2){
printf("byebye\n");
break;
}
}
} while (1);
}
在用户才正确后,如果用户想继续玩或者想退出的话,就有需要实现这两项功能。所以我们需要再列出一个小菜单
void MENU2()
{
printf("\t\t ########################################\n");
printf("\t\t ###### *1:再来一局 ######\n");
printf("\t\t ###### *2:退出游戏 ######\n");
printf("\t\t ########################################\n");
}
先关的实现关系在上图play()函数中最后一个else处。因为已经猜数正确,所以这时用户如果输入1的话就不会进入if(z==2)的判定,从而使的break无法执行,从而在play函数中继续循环。
n = rand() % 100 + 1;//膜100+1使得n的范围为【0-100】
这一句是在整个do while循环里面的,所以导致了,循环没做一遍,这条语句都要执行一次。这条语句结合一下这条代码。通过下面这条代码种下一个随机数种子。再使上面那条代码中的rand()生成一个随机数。ok这下随机数已经有了,但是如何确定范围呢。仔细看在rand()后面还有%100+1
这一整句话就是一个随机数膜100+1;从而确定了范围边界是【1,100】(任何int数%100的范围是0-99)
srand((unsigned long)time(NULL));//随机数种子
总结
play函数中的退出时利用goto语句跳转处main()函数中的循环从而结束程序的