游戏规则:
让系统随机生成一个0-100的整数,让玩家来猜,玩家猜数字后,系统给予玩家回馈并且统计玩家猜的次数,直到玩家猜对为止。
游戏方法:
1、生成游戏菜单 1. play(进入游戏) 0. exit (退出游戏)
2、使用循环语句,构建游戏框架,使玩家可以进行多次游戏,直到猜对为止。
3、设计游戏具体思路,使系统生成一个随机数,让玩家输入一个数字,然后两个数字对比,根据系统反馈信息,逐渐锁定目标。
一、代码实现:
1.打印菜单:
当我们游戏运行起来的时候,至少先要看见菜单,所以我们首先要做的就是打印菜单。其次游戏要重复玩,所以我们用do....while语句来实现。
#include <stdio.h>
void menu()
{
printf("******************************************\n");
printf("********* 1.play ************\n");
printf("********* 2.exit ************\n");
printf("******************************************\n");
}
int main()
{
do
{
//打印菜单
menu();
} while();
return 0;
}
2. 根据菜单选择:
#include <stdio.h>
void menu()
{
printf("******************************************\n");
printf("********* 1.play ************\n");
printf("********* 0.exit ************\n");
printf("******************************************\n");
}
int main()
{
int input = 0;
do
{
//打印菜单
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while(input);
return 0;
}
3.猜数字的实现:
当我们输入1时进入游戏开始进行猜数字,下面我们来看一下如何用代码实现:
必备知识:C语言中生成随机数的方法:rand函数
下面我们来看一下RAND_MAX有多大:
我们可以看到RAND_MAX代表的数字为0x7fff,转换为十进制为32767.
⭐:需要注意的是调用rand函数之前需要用srand函数来设置随机数生成器,且设置一次就可以。
下面我们来看一下srand函数:
当srand函数里面的参数在不断发生变化时,rand返回的值才会不断的发生变化。我们知道时间在不断的发生变化,而每一个时间都对应一个数字,而我们获得的数字叫做时间戳。那我们如何获取时间戳呢?此时我们需要time函数,下面我们来看一下time函数:
我们可以将空指针(NULL)传入time函数里面:time(NULL).
下面我们来探究一下time_t是什么:
我们可以看到time_t不过是__time64_ttypedef重命名过来的,而__time64_t又是64位整型typedef重命名过来的,所以time函数的返回类型为64位整型。但srand要的参数类型为无符号整型,此时我们只需要强制类型转换即可。
rand函数返回的值的范围为0~32767,而我们要产生的数字范围为0~100,所以我们要把rand返回的值%100再+1.
void game()
{
int guess = 0;
//生成随机数
int r = rand()%100+1; //0~99->1~100
//猜数字
while (1)
{
printf("猜数字:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了!\n");
break;//猜对跳出循环。
}
}
}
🍎:因为随机数生成器只能设置一次,所以将它放入到了主函数中。
4.完整代码呈现:
#include <stdio.h>
#include <stdlib.h>
#iclude <time.h>
void menu()
{
printf("************************\n");
printf("******* 1.play *******\n");
printf("******* 0.exit *******\n");
printf("************************\n");
}
void play()
{
int guess=0;
int r=rand()%100+1;
int counter=0;
while(1)
{
printf("猜数字:\n");
scanf("%d";&guess);
counter++;
if(guess<r)
{
printf("猜小了,重新猜。\n");
}
else if(guess>r)
{
printf("猜大了,重新猜。");
}
else
{
printf("猜对了,真棒哦!");
printf("你一共猜了%d次",counter);
break;
}
}
}
int main()
{
int input=0;
srand=((unsigned int)time(nall));
do
{
menu();
printf("请选择:");
scanf("%d";&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误");
break;
}
}while(input);
return 0;
}
二、二分法实现猜数
如果使用二分法进行猜100以内的任何一个随机数,最多七次就可以正确猜对该随机数。
二分法又可以被称为二分查找,它描述了在有序集合中搜索特定值的过程。广义的二分查找是将问题的规模尽可能的缩小到原有的一半。
程序通过二分法不断缩小猜测范围, 直到猜中n
例如n = 93
程序第一次猜测50, 判断数值太小
第二次猜测75,判断数值太小
第三次猜测87,判断数值太小
第四次猜测93,right
如果93不对,我们还能继续根据反馈缩小范围,最多七次就可以猜对答案