目录
猜数字游戏是一种非常经典的小游戏,通过让玩家猜一个随机生成的数字来测试其智力和运气。在本篇博客中,博主将通过详细的代码示例来介绍如何使用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(),它的返回值其实就是一个随机数。感兴趣的伙伴可以在cplusplus网站了解一下它的基本用法,但是如果我们只是这样写出来,却会发现它每次生成的随机数都是一样的,如下图所示:

如果这样,那这个游戏玩起来可就没意思了,那怎么样才能让它每次生成的随机数都不一样呢,接下来我们可以一起来了解一下这个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语言,我们下期再见。