文章目录
前言
学习过前面有关控制语句跟循环的相关知识,可以实现一个有趣的猜数字游戏。
一、实现一个猜数字游戏
要求:
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;}// 每次循环结束时,猜测次数减 1count--;}// 如果循环结束时 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 语句来进行选择等。