先给出我的思维导图:
猜数字的基本要求有四个:
1.有菜单供玩家选择
2.有一百个数字,并且系统会随机给出一个数字让玩家猜。
3.猜错时,系统会给出时猜大还是猜
4.游戏能重复玩耍
写代码的流程及问题的解决
1.创建一个菜单:
建立菜单首先我们考虑使用函数menu。菜单建立如下:
void menu()
{
printf("***********************");
printf("***** 1.paly ********");
printf("***** 0.exit ********");
printf("***********************");
}
其次,我们要考虑到玩家输入不同数字时产生不同的效果,所以我们使用switch分支(switch与ifelse的区别看我的文章)。
然后,为了让玩家能重复玩,且至少玩一次,我们可以考虑用dowhile循环(循环的区别看我的文章)。
具体效果如下:
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("正在退出");
break;
default:
printf("请重新输入");
break;
}
} while (input);
2.有一百个数字,并且系统会随机给出一个数字让玩家猜:
如果要让系统能创造一个随机数,就必须能让系统随时变化,这里我们可以采用时间戳。
首先我们得使用rand函数,这个函数的作用就是产生随机数,但它有个弊端,它产生随机数的依据是在数据库0~RAND_MAX(32767)这里取值。可是当数据库的起点和终点都一样时,系统每次产生的随机数就都相同了。
所以为了改变数据库的起点或终点,我们采用srand函数
srand用法::它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会出现一样的随机数。如:srand(1); 直接使用1来初始化种子。不过为了防止随机数每次重复,常常使用系统时间来初始化,即使用time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即: srand((unsigned)time(&t)); 还有一个经常用法,不需要定义time_t型t变量,即: srand((unsigned)time(NULL)); 直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。(转载自CSDN博主「天糊土」的原创文章)
可即使采用了srand((unsigned)time(NULL)) 仍然可能出问题,也就是这个函数放哪里。
为了增加数字的随机性,我们要把数据库的起点也就是srand((unsigned)time(NULL)) 既要放在rand前,但又不能放在游戏循环内。这样既能防止数字出现规律,又能使数字随机。
3.猜错时,系统会给出猜大了还是猜小了
既然出现了条件分支,那么就要考虑使用if语句了。这里直接给出实例:
while (1)
{
printf("请猜数字\n");
scanf("%d", &guess);
if (guess<ret)
{
printf("猜小了\n");
}
else if (guess>ret)
{
printf("猜大了\n");
}
else
{
printf("猜对了\n");
break;
}
}
接下来只要补充细节,便可完成这个小游戏了。