1. 游戏描述:
a. 电脑产生一个随机数(1~100)
b. 玩家猜数字
c. 得到反馈:猜大了or猜小了
d. 猜到数字,游戏结束
2. 实现难点
2.1 生成随机数 :rand()
C语言中的库函数 rand() 能为我们解决这一问题,下面是该函数的基本介绍
声明:
int rand(void);
作用: 返回一个范围在 0 到 RAND_MAX 之间的伪随机数。使用: 实际情况中通常用做随机生成某个区间的数,与 % 模号配合使用可以达到控制范围的效果。
/* 举例:输出 0 到 49 之间的 5 个随机数 */
for( i = 0 ; i < 5 ; i++ )
{
printf("%d\n", rand() % 50);
}
/* 举例:输出 1 到 50 之间的 5 个随机数 */
for( i = 0 ; i < 5 ; i++ )
{
printf("%d\n", rand() % 50 + 1);
}
使用该函数,能生成伪随机数,意思是其返回的结果看似随机,但多次运行后我们很快就可以发现,这个伪随机值是同一串值。这样的结果,在很多实际问题的处理上会导致随机值并不随机。
2.2 真正的随机数:srand()
srand() 函数,在一些地方也被称作随机数发生器,在 rand() 函数前使用
声明:
void srand(unsigned int seed);
作用: 配合 time() 函数设置时间戳,解决 rand() 函数生成值每次都是固定顺序的问题。
参数: seed 是一个整型值,用于伪随机数生成算法播种。
/* 随机数发生器的初始化 */
srand((unsigned) time(NULL));
/* 输出 0 到 49 之间的 5 个随机数 */
for( i = 0 ; i < 5 ; i++ ) {
printf("%d\n", rand() % 50);
}
2.3 时间戳:time()
time() 函数,可以返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。
声明:
time_t time(time_t *seconds);
作用: 设置时间戳。
参数: seconds 是指向类型为 time_t 的对象的指针,用来存储 seconds 的值。
返回类型: time_t 本质上也是一个整形。
返回值: 以 time_t 对象返回当前日历时间。如果 seconds 不为空,则返回值也存储在变量 seconds 中。
简单说来,srand() 函数要求上传整形参数,time() 函数的返回值time_t本质上就是整形,用 (unsigned) 进行强制类型转换不影响使用,并且是一个一直在变动的值。所以,这两个函数搭配起来,刚好能使得 rand() 函数生成真正的随机值。
3. 代码
// 1. 游戏菜单
void menu()
{
printf("****************************\n");
printf("********* 猜数字 *********\n");
printf("********* play-1 *********\n");
printf("********* exit-0 *********\n");//0为假,做do-while循环,条件为假结束程序
printf("****************************\n");
}
// 2.游戏逻辑
void game()
{
// a.生成 1~100 之间的随机数
// 随机数 %100 生成的是 0~99 间的随机数,+1则为1~100
int random_num = rand()%100+1;
// b. 玩家输入所猜数字
int i = 0;
while (1)
{
printf("请输入所猜测数字(1-100):>");
scanf("%d", &i);
// c. 判断是否猜对
if (i < random_num)
printf("猜小了\n");
else if (i > random_num)
printf("猜大了\n");
else
{
printf("猜对啦!\n");
break;
}
}
}
// 3. 主程序
int main()
{
int input = 0;
do
{
menu();
srand((unsigned)time(NULL));
printf("请选择1/0:>");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while(input);
return 0;
}