C语言基础(五)【控制语句与循环综合应用篇猜数字游戏】
文章目录
- 前言
- 一、实现一个猜数字游戏
- 二、游戏实现的步骤
- 1. 随机数生成
- 1.1 rand
- 1.2 srand
- 1.3 time
- 1.4 设置随机数的范围
- 2. 菜单函数的实现
- 3. 游戏函数的实现
- 二、猜数字游戏的实现
- 1. 不限制次数
- 2. 限制次数为 5
- 总结
前言
学习过前面有关控制语句跟循环的相关知识,可以实现一个有趣的猜数字游戏。
一、实现一个猜数字游戏
要求:
1.电脑自动生成 1 ~ 100 的随机数。
2.玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直
到猜对,游戏结束。
3.可增加难度: 玩家只有 5 次机会,如果 5 次都没有猜中,猜数字失败,游戏结束。
二、游戏实现的步骤
1. 随机数生成
1.1 rand
- C语言提供了一个函数叫 rand,这函数是可以生成随机数的,需要包含头文件
语法形式如下:
int rand(void);
示例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
输出结果:
1.
注意:
1.rand 函数返回的是伪随机数(不是真正的随机数),这个随机数的范围是在 0 ~ RAND_MAX 之间,这个RAND_MAX的大小通常是依赖编译器上实现的,但是大部分编译器上是32767。所以说程序两次运行的结果是一样的。
2.rand 函数是对一个叫“种子”的基准值进行运算生成的随机数。因为 rand 函数生成随机数的默认种子是1,所以前面每次运行程序产生的随机数序列是一样的。如果要生成不同的随机数,需要让种子是变化的。
这段文字有蓝是的是的 |
1.2 srand
1.C语言中又提供了一个函数叫 srand,用来初始化随机数的生成器的。
语法形式如下 :
void srand(unsigned int seed);
注意:
在程序中使用 rand 函数生成随机数之前,通常会先调用 srand 函数,并通过传递一个参数(种子)给 srand 来初始化随机数生成器。种子决定了 rand 函数生成随机数序列的起点。如果每次种子都不同,则每次生成的随机数序列也会不同。
1.3 time
1.在程序中一般是使用程序运行的时间作为种子,因为时间时刻在发生变化的。
C语言中有个函数叫 time ,就可以获得这个时间,要包含头文件:time.h
语法形式:
time_t time(time_t* timer);
1.time 函数的作用是获取当前时间,并将其转换为从特定起点(1970年1月1日0时 0分0秒)到当前时刻的秒数差,这个秒数差称为时间戳。
2.time 函数的返回值是 time_t 类型,这是一个能够存储时间戳的类型。
3.如果 timer 是一个非空指针(即指向一个有效的内存地址)time 函数会将当前时间的时间戳返回给调用者。这个时间戳存储在 timer 指针指向的内存位置。
4.如果 timer 是 NULL(空指针),意味着没有提供一个有效的内存地址,time 函数只返回当前时间的时间戳,但不会把时间戳存储在任何地方。
示例:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
// 使用 time 函数的返回值设置种子
// 因为 srand 的参数是 unsigned int 类型,将 time 函数的返回值强制类型转换
srand((unsigned int)time(NULL));
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0
}
输出结果:
1.
2.
注意:
上面程序两次运行的结果不一样,则这段代码能获得真正的随机数
srand 函数是不需要频繁调用的,一次运行的程序中调用一次就够了
1.4 设置随机数的范围
1.如果要生成 0 ~ 99 之间的随机数
rand() % 100; // 余数范围为 0 ~ 99
2.如果要生成 1 ~ 100 之间的随机数
rand() % 100 + 1; // 余数范围为 1 ~ 100
3.如果要生成 100 ~ 200 的随机数
// 余数范围 0 ~ 100,加上 100 后是 100 ~ 200
100 + rand() % (200 - 100 + 1);
4.如果要生成 a ~ b 的随机数
a + rand() % (b - a + 1);
2. 菜单函数的实现
// 定义了一个名为 menu 的函数用来打印选项,void 表示没有返回值
void menu()
{
printf("*******************************\n");
printf("************ 1. play **********\n");
printf("************ 0. exit **********\n");
printf("*******************************\n");
}
3. 游戏函数的实现
// 定义一个名为 game 的函数(没有返回值),用于实现一个猜数字游戏
void game()
{
// r 为一个随机生成 1 ~ 100 的数字
int r = rand() % 100 + 1;
// 用于表示猜测的数字
int guess = 0;
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess > r)
{
// 表示猜测的数字大了
printf("猜大了\n");
}
else if (guess < r)
{
// 表示猜测的数字小了
printf("猜小了\n");
}
else
{
// 猜对数字,则跳出循环
printf("猜对了\n");
break;
}
}
}
二、猜数字游戏的实现
1. 不限制次数
1.完整代码
#include<stdio.h>
#include<stdlib.h> // 包含标准库头文件,可使用 rand() 和 srand() 等函数
#include<time.h> // 包含时间库头文件,可使用时间相关的函数,如 time()
// 定义一个名为 game 的函数(没有返回值),用于实现一个猜数字游戏
void game()
{
// r 为一个随机生成 1 ~ 100 的数字
int r = rand() % 100 + 1;
// 用于表示猜测的数字
int guess = 0;
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess > r)
{
// 表示猜测的数字大了
printf("猜大了\n");
}
else if (guess < r)
{
// 表示猜测的数字小了
printf("猜小了\n");
}
else
{
// 猜对数字,则跳出循环
printf("猜对了\n");
break;
}
}
}
// 定义了一个名为 menu 的函数用来打印选项,void 表示没有返回值
void menu()
{
printf("*******************************\n");
printf("************ 1. play **********\n");
printf("************ 0. exit **********\n");
printf("*******************************\n");
}
int main()
{
int input = 0;
// 设置随机数种子,使用当前时间作为种子,以确保每次运行程序时生成的随机数序列不同
srand((unsigned int)time(NULL));
// 使用 do - while 循环,用于重复显示菜单并处理输入的值,直到选择退出(0)
do {
menu();
printf("请选择:>");
scanf("%d", &input);
// 使用 switch 语句根据输入的值执行不同的操作
switch (input)
{
// 如果输入 1,则调用 game 函数开始游戏
case 1:
game();
break;
// 如果输入 0,打印 "游戏结束",然后跳出循环
case 0:
printf("游戏结束\n");
break;
// 如果输入的值既不是 1 也不是 0,打印错误信息,并重新选择
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
示例:
2. 限制次数为 5
#include<stdio.h>
#include<stdlib.h> // 包含标准库头文件,可使用 rand() 和 srand() 等函数
#include<time.h> // 包含时间库头文件,可使用时间相关的函数,如 time()
// 定义一个名为 game 的函数(没有返回值),用于实现一个猜数字游戏
void game()
{
// r 为一个随机生成 1 ~ 100 的数字
int r = rand() % 100 + 1;
// 用于表示猜测的数字
int guess = 0;
// 用于表示剩余的猜测次数,有 5 次机会
int count = 5;
while (count)
{
printf("\n你还有%d次机会\n", count);
printf("请猜数字:>");
scanf("%d", &guess);
if (guess > r)
{
// 表示猜测的数字大了
printf("猜大了\n");
}
else if (guess < r)
{
// 表示猜测的数字小了
printf("猜小了\n");
}
else
{
// 猜对数字,则跳出循环
printf("猜对了\n");
break;
}
// 每次循环结束时,猜测次数减 1
count--;
}
// 如果循环结束时 count 为 0,说明已经用完了所有猜测次数,打印失败信息和正确的数字
if (count == 0)
{
printf("你失败了,正确的值是:%d\n", r);
}
}
// 定义了一个名为 menu 的函数用来打印选项,void 表示没有返回值
void menu()
{
printf("*******************************\n");
printf("************ 1. play **********\n");
printf("************ 0. exit **********\n");
printf("*******************************\n");
}
int main()
{
int input = 0;
// 设置随机数种子,使用当前时间作为种子,以确保每次运行程序时生成的随机数序列不同
srand((unsigned int)time(NULL));
// 使用 do - while 循环,用于重复显示菜单并处理输入的值,直到选择退出(0)
do {
menu();
printf("请选择:>");
scanf("%d", &input);
// 使用 switch 语句根据输入的值执行不同的操作
switch (input)
{
// 如果输入 1,则调用 game 函数开始游戏
case 1:
game();
break;
// 如果输入 0,打印 "游戏结束",然后跳出循环
case 0:
printf("游戏结束\n");
break;
// 如果输入的值既不是 1 也不是 0,打印错误信息,并重新选择
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
示例:
总结
本篇文章详细介绍了如何使用C语言实现一个简单的猜数字游戏,包括如何使用rand()、srand() 和 time() 函数来生成随机数,使用 do - while 循环跟 switch 语句来进行选择等。