在上一篇博客中,我们简单地介绍了C语言的分支与循环语句。今天我们来进行随机数游戏的进阶与提升。
1.项目演示
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//猜数字游戏
void menu()
{
printf("********************\n");
printf("***** 1. start *****\n");
printf("***** 0. end *****\n");
printf("********************\n");
}
void game()
{
int x = rand()%100+1;
int guess = 0;
while (1)
{
printf("请输入数字:\n");
scanf("%d", &guess);
if (guess < x)
{
printf("小屁孩儿,你猜小了\n");
}
else if (guess > x)
{
printf("小屁孩儿,你猜大了\n");
}
else
{
printf("你猜对了!\n");
break;
}
}
}
int main()
{
srand((unsigned)time(NULL));
int a = 0;
while(1)
{
menu();
printf("请选择:\n");
scanf("%d", &a);
if (a == 1)
{
game();
break;
}
else if (a == 0)
{
printf("退出游戏!\n");
break;
}
else
{
printf("输出无效,请重新输入!\n");
}
}
system("pause");
return 0;
}
首先,看到我们定义了一个menu函数,因为我们不需要它返回任何值,故设定其类型为void,其功能是打印游戏的菜单。接着,进入了该游戏的核心环节,game(同menu函数类型为void的原因)!最后,就是进入main函数进行函数调用了(当然,我们这里也可以将以上的两个函数直接装入主函数中,但是会造成main函数的臃肿,分装有利于可读性的提高)。
2.详细解读
(1). menu函数的实现
是否进入一个游戏取决于玩这个游戏的人,编写者必须给游客选择的权利。
void menu()
{
printf("********************\n");
printf("***** 1. start *****\n");
printf("***** 0. end *****\n");
printf("********************\n");
}
这串代码负责对菜单打印,选择‘1’就是开始游戏,‘0’就是退出游戏。诶,如果输入其他值咋办?等一会在主函数中会提到,这里先不做说明。
(2). game函数的实现
void game()
{
int x = rand()%100+1;
int guess = 0;
while (1)
{
printf("请输入数字:\n");
scanf("%d", &guess);
if (guess < x)
{
printf("小屁孩儿,你猜小了\n");
}
else if (guess > x)
{
printf("小屁孩儿,你猜大了\n");
}
else
{
printf("你猜对了!\n");
break;
}
}
}
这里我们用到了while语句和else if语句,注意到这里的while语句只要没有break就是无限循环的,如想对猜数的次数进行限制,可以参考以下代码:
void game()
{
int x = rand()%100+1;
int guess = 0;
int count = 5;
while (count)
{
printf("请输入数字:\n");
scanf("%d", &guess);
if (guess < x)
{
printf("小屁孩儿,你猜小了\n");
count--;
}
else if (guess > x)
{
printf("小屁孩儿,你猜大了\n");
count--;
}
else
{
printf("你猜对了!\n");
break;
}
}
}
这里我们新增加了一个变量count,负责限制循环的次数。经过上篇文章的学习,我们知道,while()内值为0时为假,不执行{}内的操作。如果没有猜对的话,count会进行自减的操作,通过每次对count的检测,来确定是否进行循环。
因为要生成随机数,所以我们调用了一个rand函数来生成,但是请注意rand函数生成的随机数是伪随机数,你经过VS跑数次之后会发现这个数相差不大。记得包含头文件咯(#include<time.h> #include<stdlib.h>)具体有关rand函数以及下面srand的用法的介绍请参考http://t.csdnimg.cn/0cJB0
当然,他次数用完还没有猜对时,可以告诉他真正的答案是多少 ,这个代码请读者自己去实践一下咯。
(3) . main函数
int main()
{
srand((unsigned)time(NULL));
int a = 0;
while(1)
{
menu();
printf("请选择:\n");
scanf("%d", &a);
if (a == 1)
{
game();
break;
}
else if (a == 0)
{
printf("退出游戏!\n");
break;
}
else
{
printf("输出无效,请重新输入!\n");
}
}
system("pause");
return 0;
}
这里我们首先定义了一个变量,然后调用menu函数输入一个值用以确认是否进行游戏,如果输入值非菜单的值,将会重新进入循环。这里我们可以将代码进行一定程度的优化:
int main()
{
srand((unsigned)time(NULL));
int a = 0;
do
{
menu();
printf("请选择:\n");
scanf("%d", &a);
switch (a)
{
case 1:
{
game();
break;
}
case 0:
{
printf("退出游戏!\n");
break;
}
default:
{
printf("输出无效,请重新输入!\n");
}
}
}while (a);
system("pause");
return 0;
}
使用do…while语句以及switch语句,会大大简化代码。
今天的文章讲了条件分支与循环的实战,在下一篇博客中,我会讲述数组的有关知识,一起加油咯~