文章目录
一.概要
在我们初步了解C语言,掌握了C语言常见概念,数据类型和变量以及分支和循环就可以掌握下面这段有趣的小游戏 -- 猜数字游戏
二.整体架构流程
以下是完成猜数字游戏所需要的要素:
1.电脑自动生成一到一百的随机数。
2.玩家猜数字的过程中,程序需要根据玩家给出的数据大小判断并输出“猜大了”或者“猜小了”,直到猜对,游戏结束。
三.完成代码所需知识
1.C语言中的rand函数概念
在C语言中,rand函数是用于生成伪随机数的标准库函数,它定义在<stdlib.h>头文件中。rand函数可以返回一个介于0到RAND_MAX之间的整数,其中RAND_MAX是一个宏,定义了rand函数能够返回的随机数的最大值,其值至少为32767。
2.rand函数的使用方法
以下为rand的函数原型:
int rand(void)
rand函数不接受任何参数,直接调用即可返回一个随机数。在程序中首次调用rand函数之前,通常需要调用srand函数来设置随机数生成器的种子。srand函数接受一个unsigned int类型的种子值,常见的做法是使用当前的时间作为种子,这样可以确保每次程序运行时种子的值不同,从而生成不同的随机数序列。
3.srand函数的作用
srand函数用于初始化随机数生成器,其原型如下:
void srand(unsigned int seed);
通过传递不同的种子值给srand函数,可以控制随机数序列的起始点。如果不调用srand函数或者多次调用srand函数使用相同的种子值,rand函数将产生相同的随机数序列。
4.time函数(时间戳)的配合使用
以下为time的函数原型:
time_t time(time_t* timer)
为了避免重复的随机数序列,通常会使用time函数提供的当前时间作为种子。time函数的原型定义在<time.h>头文件中,它返回一个表示自1970年1月1日以来经过的秒数的time_t类型值。在使用time函数时,可以传入一个指向time_t类型变量的指针,如果不需要修改时间值,可以传入NULL。
有关时间戳的详细内容请于下面网址跳转到我的往期博客:
5.“真正”的随机数示例代码
以下是一个简单的示例,展示了如何在C程序中使用rand和srand函数生成随机数:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
// 使用当前时间作为随机数生成的种子
srand((unsigned int)time(NULL));
// 生成一个随机数
int randomNumber = rand();
// 输出随机数
printf("Generated random number: %d\n", randomNumber);
return 0;
}
在上述代码中,srand函数使用time(NULL)获取的当前时间作为种子,然后rand函数用于生成一个随机数,该随机数随后被打印出来。每次运行程序时,由于当前时间的不同,生成的随机数序列也会不同。
6.如何设置随机数的范围
①生成0~99之间的随机数
rand() % 100
//余数的范围是0~99
②生成1~100之间的随机数
rand() % 100 + 1
//余数的范围是1~100
③生成100~200之间的随机数
rand() % (200 - 100 + 1)
//余数的范围是100~200
四.猜数字游戏代码实现
在掌握了以上知识点,相信你对如何写一个真正的猜数字游戏有了一定思路,这里我建议你可以先尝试去实现你的代码,然后再来和我的代码对照,这样你的收获才会真正的落袋为安。
以下为我的猜数字游戏代码:
//猜数字游戏
//请于1~100之间进行猜测
//为了避免在使用某些函数(如scanf等)时可能出现的安全警告,定义这个宏。在某些编译器中,如果不定义这个宏,使用这些函数可能会提示警告信息。
#define _CRT_SECURE_NO_WARNINGS 1
//包含标准输入输出头文件,用于使用printf、scanf等函数
#include <stdio.h>
//包含标准库函数头文件,用于使用rand、srand等函数
#include <stdlib.h>
//包含时间相关的头文件,用于使用time函数来获取时间作为随机数生成的种子
#include <time.h>
//函数声明,声明menu函数,该函数用于显示游戏菜单
void menu();
//函数声明,声明game函数,该函数用于实现猜数字的游戏逻辑
void game();
//主函数,程序的入口点
int main()
{
//定义一个整型变量input,用于存储用户的菜单选择输入
int input = 0;
//使用当前时间作为随机数生成器的种子。time函数返回从1970年1月1日00:00:00到当前时刻的秒数,srand函数根据这个种子来初始化随机数生成器,这样每次运行程序时生成的随机数序列会不同
srand((unsigned int)time(NULL));
//使用do - while循环,先执行一次循环体,然后根据循环条件决定是否继续循环
do
{
//调用menu函数,显示游戏菜单
menu();
//提示用户进行选择,并接收用户输入的菜单选项数字
printf("请选择:》");
scanf("%d", &input);
//使用switch语句根据用户的输入进行不同的操作
switch (input)
{
case 1:
//如果用户输入1,调用game函数开始猜数字游戏
game();
break;
case 0:
//如果用户输入0,打印游戏结束的提示信息
printf("游戏结束了。");
break;
default:
//如果用户输入的不是0或1,打印选择错误的提示信息,要求用户重新选择
printf("选择错误,请重新选择。");
break;
}
} while (input);
//主函数结束,返回0表示程序正常结束
return 0;
}
//menu函数的定义,用于显示游戏菜单
void menu()
{
//打印游戏菜单的界面,包括游戏选项
printf("*********************************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("*********************************\n");
}
//game函数的定义,用于实现猜数字的游戏逻辑
void game()
{
//使用rand函数生成一个1到100之间的随机数。rand函数返回一个介于0到RAND_MAX之间的整数,通过取余100再加1的操作,得到1到100之间的随机数,这个随机数将作为要猜测的目标数字
int ret = rand() % 100 + 1;
//定义一个整型变量guess,用于存储用户猜测的数字
int guess = 0;
//使用while循环,只要条件为真(这里是永远为真的1)就一直循环,直到猜对数字后通过break语句跳出循环
while (1)
{
//提示用户猜数字,并接收用户输入的猜测数字
printf("请猜数字:》");
scanf("%d", &guess);
//如果用户猜测的数字小于目标数字,打印猜小了的提示信息
if (guess < ret)
{
printf("猜小了\n");
}
//如果用户猜测的数字大于目标数字,打印猜大了的提示信息
else if (guess > ret)
{
printf("猜大了\n");
}
//如果用户猜测的数字等于目标数字,打印恭喜猜对的提示信息,并通过break语句跳出循环
else
{
printf("恭喜你猜对了。\n");
break;
}
}
}
五.小结
1.创造“真正”随机数方面
①伪随机数的局限性
在C语言中,通常的rand函数产生的是伪随机数。它依赖于一个种子值,在相同种子下会生成相同的随机数序列,这并非真正意义上的随机。
②改善随机数生成的方法
Ⅰ对于C初学者,虽然难以实现完全“真正”的随机数,但可以通过合理设置srand函数的种子来改善。例如,使用time(NULL)作为种子,能在每次程序运行时得到不同的随机数序列。
Ⅱ可能提及一些高级的、超出初学者范围的方法概念,如利用硬件特性或更复杂的算法来获取更接近真正随机的数。
2.猜数字游戏代码方面
①游戏逻辑
Ⅰ猜数字游戏的核心逻辑是程序生成一个随机数(在一定范围内),玩家尝试猜测这个数字。
Ⅱ每次玩家猜测后,程序根据玩家输入的数字与随机数的大小关系给出提示(大了、小了或者猜对了)。
②代码实现要点
Ⅰ对于C初学者,这个游戏是很好的练习机会。
Ⅱ代码会涉及到基本的头文件<stdio.h>(用于输入输出操作),<stdlib.h>和<time.h>(用于随机数相关操作)。
Ⅲ程序中会有初始化随机数生成的部分(如srand((unsigned int)time(NULL));),然后是循环结构(如while循环)来持续获取玩家的猜测并进行比较判断,还会用到条件判断语句(如if - else)来处理不同的比较结果。
③学习意义
有助于初学者理解C语言中的输入输出、控制结构(循环和条件判断)、函数调用(如rand、srand、time函数)等基本概念,同时体会随机数在实际编程中的应用。