目录
引言:
1.程序思路:
2.代码实现:
2.1.生成游戏菜单:
2.2.构建主函数框架:
2.3.构建游戏函数:
3.游戏源码:
4.程序优化:
优化后源码:
结论:
猜数字游戏是一种非常经典的小游戏,通过让玩家猜一个随机生成的数字来测试其智力和运气。在本篇博客中,博主将通过详细的代码示例来介绍如何使用C语言实现一个简单的猜数字游戏,帮助小伙伴们更好的理解和掌握C语言的基本语法和逻辑控制结构。
猜数字游戏的基本思路是:
- 程序随机生成一个1~100之间的数
- 玩家通过输入猜测的数字来猜测这个数字
- 如果猜小了,就告诉你猜小了
- 如果猜大了,就告诉你猜大了
- 如果猜对了,那就恭喜你,游戏结束
给这个游戏设置一个菜单,玩家选择1为开始游戏,选择0为退出游戏。
void menu()
{
printf("********************\n");
printf("**** 1.play ****\n");
printf("**** 0.exit ****\n");
printf("********************\n");
}
效果显示:
我们希望一盘游戏结束后不过瘾,还可以继续玩,这时候就可以使用do-while循环。然后用switch语句控制继续游戏还是退出游戏,写到这儿我们可以简单测试一下,看我们的代码有没有问题。
int main()
{
int input = 0;
do
{
menu();
printf("请选择(1/0):>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字!\n");
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);
return 0;
}
如果测试没有问题,就可以继续实现里边的细节。接下来我们可以在“猜数字”这儿简单封装一个game()函数,将玩游戏的逻辑包含在里边,回头再在主函数里边调用。我们C语言里边提供了一个生成随机数的函数,叫rand(),它的返回值其实就是一个随机数。感兴趣的伙伴可以在https://legacy.cplusplus.com/这个网站里边了解一下它的基本用法,但是如果我们只是这样写出来,却会发现它每次生成的随机数都是一样的,如下图所示:
如果这样,那这个游戏玩起来可就没意思了,那怎么样才能让它每次生成的随机数都不一样呢,接下来我们可以一起来了解一下这个rand()函数:
- 首先,rand()函数生成的数都是伪随机数(即不是真正的随机数),rand()函数是通过某种算法生成的随机数,所以说这个随机数就不够随机。
- 其次,rand()函数生成的随机数范围是:0~RAND_MAX(32767)。
- rand()函数在生成随机数之前,要使用srand()函数设置随机数的生成器。
一旦srand()函数设置的种子数固定了,那我们生成的随机数就成固定的了。
- 反之,如果我们设置srand()函数的种子数不一样,那么生成的随机数就会不一样。
- 那怎样设置一个随机数的种子呢,其实很简单,只要传进去一个时刻在发生变化的值,那我们的随机数就生成了 。
- 我们知道,计算机上面的时间在时刻发生变化,如果我们能把这个值给它传进去,随机数不就生成了吗。
- 这里,我们就要用到time()函数,它可以返回一个时间戳(顾名思义就是一个数字,可以转换成时间),只要时间在变化,那我们的时间戳就在变化,到这里,我们的game()函数就封装完成了。
void game()
{
//1.生成1~100的随机数
int ret = rand() % 100 + 1;
printf("%d\n", ret);
//2.猜数字
int guess = 0;
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess > ret)
printf("猜大了,请继续猜!\n");
else if (guess < ret)
printf("猜小了,请继续猜!\n");
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}
游戏效果:
附上游戏源码:
#include
#include
#include
void menu()
{
printf("********************\n");
printf("**** 1.play ****\n");
printf("**** 0.exit ****\n");
printf("********************\n");
}
void game()
{
//1.生成1~100的随机数
int ret = rand() % 100 + 1;//生成1~100之间的整数
printf("%d\n", ret);
//2.猜数字
int guess = 0;//存储玩家猜测的数字
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 = 0;
srand((unsigned int)time(NULL));//初始化随机数种子
do
{
menu();
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;
}
上面的程序虽然可以实现猜数字游戏的基本功能,但还有一些可以优化的地方,如下:
- 在程序中添加错误处理机制,防止玩家输入非法字符或超出范围的数字。
- 增加可玩性,例如添加计时功能,记录最高分等。
- 优化代码结构,使程序更加简洁,易读。
#include
#include
#include
#define MAX_NUM 100//最大数字
#define MIN_NUM 1//最小数字
#define MAX_TRIES 10//最大猜测次数
int main()
{
int guess, tries = 0;
srand((unsigned int)time(NULL)); // 初始化随机数种子
int num = rand() % MAX_NUM + MIN_NUM; // 生成随机数
printf("欢迎来到猜数字游戏!\n");
printf("你需要在%d次之内猜出1~%d之间的一个数字。\n", MAX_TRIES, MAX_NUM);
do
{
printf("请输入一个1~100之间的整数:");
if (scanf("%d", &guess) != 1)
{
printf("输入错误,请输入一个整数!\n");
fflush(stdin); // 清空输入缓冲区
continue;
}
if (guess < MIN_NUM || guess > MAX_NUM)
{
printf("输入错误,请输入一个1~100之间的整数!\n");
continue;
}
tries++;
if (guess > num)
{
printf("猜大了,请继续猜!\n");
}
else if (guess < num)
{
printf("猜小了,请继续猜!\n");
}
} while (guess != num && tries < MAX_TRIES);
if (guess == num)
{
printf("恭喜你,猜对了!\n");
printf("你用了%d次猜出了这个数字。\n", tries);
}
else
{
printf("很遗憾,你没有在%d次之内猜对这个数字。\n", MAX_TRIES);
printf("这个数字是%d。\n", num);
}
return 0;
}
- 在上面的程序中,我们首先使用宏定义定义了一些常量,例如最大数字、最小数字、最大猜测次数等。
- 然后,我们在程序开始时输出欢迎信息和游戏规则。
- 在玩家猜测数字的过程中,我们使用了一些错误处理机制,例如使用scanf函数读取输入时检查返回值,以确保输入的是一个整数;使用fflush函数清空输入缓冲区,以避免输入错误的字符导致程序崩溃;使用continue语句跳过错误输入,以便玩家重新输入正确的数字。
- 最后,我们在游戏结束时输出相应的提示信息,并记录玩家猜测的次数和随机数字的值。
效果如下:
猜数字游戏是一种非常有趣的小游戏,通过实现一个简单的猜数字游戏程序,我们可以更好地理解和掌握C语言的基本语法和逻辑控制结构。在实际开发中,我们可以根据具体的需求和场景,对程序进行优化和扩展,以提高游戏的可玩性和用户体验。希望本篇博客能够帮助大家更好地学习和应用C语言,我们下期再见。