首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【落羽的落羽 C语言篇】分支和循环语句的应用举例——猜数字小游戏

【落羽的落羽 C语言篇】分支和循环语句的应用举例——猜数字小游戏

作者头像
落羽的落羽
发布2025-12-18 18:55:12
发布2025-12-18 18:55:12
3120
举报

一、制定规则

规则如下: 1. 开始运行后玩家需要输入1或2选择开始游戏或退出程序 2. 每局游戏会生成一个1~100的随机数,玩家有五次机会去猜,猜错会显示猜大了还是猜小了。 3. 防止玩家沉迷游戏,一次性最多连玩三把。

二、分步实现思路

1. 随机数的生成

1.1 rand

C语言提供了一个函数rand,使用它需要包括头文件stdlib.h 函数原型为:

代码语言:javascript
复制
int rand (void);

rand可以生成“伪”随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩取决于你的编译器,⼤部分编译器上是32767。

那为什么叫“伪”呢?我们来看看下面的代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}

如果你反复运行几次就会发现,结果总是:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

就懵了,不是说好是随机数吗,怎么两次结果都一样??

在这里插入图片描述
在这里插入图片描述

其实 rand 函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。rand 函数首先对一个叫“种子”的基准值进行运算,算出的“随机数”,而它生成随机数的默认种子是1,所以每次结果都一样。

1.2 srand

C语言中又提供了一个函数叫srand,是用来初始化随机数的生成器的,srand的原型如下:

代码语言:javascript
复制
 void srand (unsigned int seed);

可以看到,srand的参数类型要求是unsigned int

程序中在调用 rand 函数之前先调用 srand 函数,通过 srand 函数的参数seed来设置rand函数生成随机数时的种子。也就是说,如果srand的seed是随机的,rand就能生成随机数。只要种子在时刻变化,每次生成的随机数序列也就变化起来了。

对!“时刻”变化!

1.3 time

那么,我们就可以利用使用程序的时间作为种子。因为“时间”,正是时刻变化的!

在C语言中有一个函数叫 time ,使用它需要包含头文件time.h 它可以获得这个时间,time函数原型如下:

代码语言:javascript
复制
time_t time (time_t* timer);

time函数会返回1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒,返回类型是time_t (本质上就是32位或64位的整型类型)。在本项目中,time函数不需要参数,timer可以设置为NULL 基于此,我们就可以将time函数的返回值赋给srand函数当做seed。这样,seed就是时刻变化的了,具体写法如下:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand( (unsigned int)time(NULL) );
//             ↑
//因为time函数的返回值类型不是srand要求的,所以这里要强制转换

printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());

return 0;
}

这样,每次的数字就不一样了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

nice(/≧▽≦/)

1.4 将随机数控制在1~100

这其实是最简单的一步,每次的随机数除以100得到的余数一定在0到99间,再加一,不就是1~100了吗。

综合以上四条内容:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand( (unsigned int)time(NULL) );

printf("%d\n", rand()%100+1);
printf("%d\n", rand()%100+1);
printf("%d\n", rand()%100+1);

return 0;
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 比较玩家输入的数字和答案的大小

这一步就需要用到分支语句和循环语句了,但也灰常简单。 具体思路就是:定义一个变量(我下面就用a)作为每次玩家输入的数字的储存地址,根据a和答案的大小情况输出“猜到了”或“猜大了”或“猜小了”,循环五次(当然猜对的话就停止)

参考:

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
srand((unsigned int)time(NULL));
int r = rand() % 100 + 1;
int a = 0;
    
for (int turn = 1; turn <= 5; turn++)
  {  
     printf("你猜的数字是:");
     scanf("%d", &a);
     if (a < r) 
      {
         printf("猜小了,你还有%d次机会\n\n", 5 - turn);
      }
     else if (a > r)
      {
         printf("猜大了,你还有%d次机会\n\n", 5 - turn);
      }
     else
      {
         printf("恭喜你,猜对了!\n");
         goto end;
      }
  }
printf("游戏失败o(╥﹏╥)o\n答案是%d\n",r);
end :
return 0;
}

不同的结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ps:为了得到通关的结果截图,我玩了半个小时

在这里插入图片描述
在这里插入图片描述

3. 最多连玩三把

这部分也非常简单,一个大大的循环就彳亍

代码语言:javascript
复制
int round = 0;
do
{
  round++;
  ......
}
while(round<3)

4. 设计一个小菜单

菜单我们可以这样设计:

代码语言:javascript
复制
void menu()
{
printf("-----------------------------------\n");
printf("-----------guess number------------\n");
printf("--------------1.play---------------\n");
printf("--------------2.quit---------------\n");
printf("-----------------------------------\n");
}
//我才不会说\n是看到格式错误才想起来加上的呢!

这里的void menu意思是我们设置了一个叫menu的函数,在后面的代码中我们就可以直接引用menu来打印菜单,最后我们也会将游戏运行的本体封装到一个game的函数里。有关函数的相关详细内容我们之后再讲。

三、完整代码与游戏效果展示

好了,让我们把上面的东西都综合起来!经过一些逻辑上的修改,得到最终结果:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void menu()
{
	printf("-----------------------------------\n");
	printf("-----------guess number------------\n");
	printf("--------------1.play---------------\n");
	printf("--------------2.quit---------------\n");
	printf("-----------------------------------\n");
}

void game()
{
	int r = rand() % 100 + 1;
	int a = 0;

	for (int turn = 1; turn <= 5; turn++)
	{
		printf("你猜的数字是:");
		scanf("%d", &a);
		if (a < r)
		{
			printf("猜小了,你还有%d次机会\n\n", 5 - turn);
		}
		else if (a > r)
		{
			printf("猜大了,你还有%d次机会\n\n", 5 - turn);
		}
		else
		{
			printf("恭喜你,猜对了!ヾ(◍°∇°◍)ノ\n");
			goto end;
		}
	}
printf("游戏失败o(╥﹏╥)o\n答案是%d\n\n\n", r);
end:
;
}

int main()
{
	srand((unsigned int)time(NULL));
	int round = 0;
	int choice = 0;   
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			round++;
			game();
			if (round == 3)
	        printf("阿伟,你玩了三把了,休息一下吧\n");
			break;
		case 2:
			printf("游戏结束\n");
			break;
     default:
			printf("选择错误,请重试\n");
		}
    } while ((round < 3)&&(choice != 2));

return 0;
}

运行结果也是非常的完美

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总之,今天的任务就算圆满完成了,但我的代码也不算简洁,大家学习后一定也可以写出更漂亮的!

感谢阅读

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、制定规则
  • 二、分步实现思路
    • 1. 随机数的生成
      • 1.1 rand
      • 1.2 srand
      • 1.3 time
      • 1.4 将随机数控制在1~100
    • 2. 比较玩家输入的数字和答案的大小
    • 3. 最多连玩三把
    • 4. 设计一个小菜单
  • 三、完整代码与游戏效果展示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档