文章目录
- 1. 游戏描述
- 2. 代码结构
- 2.1 菜单函数
- 2.2 游戏函数
- 2.3 主体函数
- 3. 代码实现
1. 游戏描述
- 电脑自动生成一个1-100以内的数字。
- 我们输入一个我们猜的数字。
- 如果我们猜的数字比电脑随机生成的数字大,那么输出(猜大了),反之输出(猜小了)。
- 一直循环到猜到正确的数字为止。
2. 代码结构
2.1 菜单函数
void menu()
{
printf("**********************\n");
printf("******* 1.play *******\n");
printf("******* 0.exit *******\n");
printf("**********************\n");
}
2.2 游戏函数
void game()//猜数字游戏的整个逻辑
{
//1. 电脑产生一个 1~100 的随机数 —> rand:生成随机数的函数
//2. 猜数字
int guess;
int ret = rand() % 100 + 1;//生成一个 1~100 之间的随机数
while (1)//必须要一直循环到猜对为止
{
printf("请输入你猜的数字:");
scanf("%d", &guess);
if (guess > ret)
{
printf("猜大了\n");
}
else if (guess < ret)
{
printf("猜小了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
1. rand 函数
- 生成一个 0 ~ RAND_MAX(0 ~ 32767) 之间的随机值,引用头文件 stdlib.h。
- 但是在调用 rand 函数之前需要先调用 srand 函数(设置随机数的生成器),否则随机生成的数字在每一次游戏的过程中都相同,这就没有意义了。
2. srand 函数
- 设置一个随机的起点,引用头文件 stdlib.h
- 设置一个随机起点,需要使用整型,但由于整型为固定值,随机值也相同,所以我们需要一个每时每刻都在发生变化的值,那就是:时间戳。
- 时间戳:(是计算机当前时间 - 起始时间)所得到的差值就是时间戳,使用时间戳来设置随机数的生成起点,使用时间戳要用 time 函数来获取当前时间,srand 函数返回值为unsigned int 类型,那么要将 time 强制类型转换成 unsigned int 类型,time(NULL)为空指针。
3. time 函数
- 获取当前系统时间,返回一个时间戳;
- 引用头文件 time.h。
4. rand 函数为何要 % 100 + 1 ?
- 因为游戏要我们生成的是 1 ~ 100 之间的数字,但是 rand 函数生成的又是 0~32767 之间的数,所以这时候才需要采用 rand () % 100 + 1的方法;
- 就像任何数 % 2 的余数肯定在 0 ~ 1 之间,% 3 的余数在 0 ~ 2 之间一样,用 rand 函数生成的随机数 % 100 的结果肯定就在 0 ~ 99 之间;
- 让 rand 函数生成的随机数 % 100 之后再 + 1,这样就能确保最终生成的随机数在 1~100 之间了。
2.3 主体函数
int main()
{
int input;
srand((unsigned)time(NULL));
//这条语句必须要放在主函数,不然生成的随机数的值有可能相同。
//不能在每次生成随机数的时候都生成一个起点,整个工程只用生成一次起点就够了。
do //不管怎样都至少要执行一次循环体把菜单给弄出来。
{
menu();//进入选项菜单
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戏开始!\n");game();break;
case 0:
printf("退出游戏!\n");break;
default:
printf("选择错误\n");break;
}
}
while (input);
return 0;
}
3. 代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("**********************\n");
printf("******* 1.play *******\n");
printf("******* 0.exit *******\n");
printf("**********************\n");
}
void game()//猜数字游戏的整个逻辑
{
//1. 电脑产生一个 1~100 的随机数 —> rand:生成随机数的函数
//2. 猜数字
int guess;
int ret = rand() % 100 + 1;//生成一个 1~100 之间的随机数
while (1)//必须要一直循环到猜对为止
{
printf("请输入你猜的数字:");
scanf("%d", &guess);
if (guess > ret)
{
printf("猜大了\n");
}
else if (guess < ret)
{
printf("猜小了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
int main()
{
int input;
srand((unsigned)time(NULL));
//这条语句必须要放在主函数,不然生成的随机数的值有可能相同。
//不能在每次生成随机数的时候都生成一个起点,整个工程只用生成一次起点就够了。
do //不管怎样都至少要执行一次循环体把菜单给弄出来。
{
menu();//进入选项菜单
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戏开始!\n"); game(); break;
case 0:
printf("退出游戏!\n"); break;
default:
printf("选择错误\n"); break;
}
} while (input);
return 0;
}