c语言实现猜数字经典小游戏(1~100)

举报
luming_02 发表于 2023/10/31 19:54:38 2023/10/31
【摘要】 一.什么是猜数字小游戏在c语言初学者的学习过程中,大多数接触并设计的第一个小游戏就是猜数字,这款小游戏非常的经典,可以锻炼我们对分支语句,循环语句,库函数的理解和使用。也能锻炼我们对于将人类语言转化为计算机语言的能力,即提高我们的编程思维能力。游戏内容:首先生成一个1--100的随机数,但这个数字玩家看不见,然后玩家输入一个数字,编译器进行判断这个数与已生成数字的大小,如果大于生成的随机数,...

一.什么是猜数字小游戏

在c语言初学者的学习过程中,大多数接触并设计的第一个小游戏就是猜数字,这款小游戏非常的经典,可以锻炼我们对分支语句,循环语句,库函数的理解和使用。也能锻炼我们对于将人类语言转化为计算机语言的能力,即提高我们的编程思维能力。

游戏内容:首先生成一个1--100的随机数,但这个数字玩家看不见,然后玩家输入一个数字,编译器进行判断这个数与已生成数字的大小,如果大于生成的随机数,则输出“猜大了”,如果小与生成的随机数,泽输出“猜小了”,如此反复,直到玩家猜的数字与生成的随机数相同,则输出“恭喜你,猜对了”。

二.设计思路

在理解了上述游戏内容的需求后,我们就可以开始着手设计游戏的框架,我们可以分3个模块进行设计。首先,我们需要一个菜单呈现给玩家,以供玩家选择是否开启游戏;其次在玩家选择了进行游戏后,我们需要设计一个生成随机数的程序;最后,在随机数已生成以后,我们需要设计一个逻辑结构去判断玩家的输入与实际上生成的随机数的大小关系,并且把结果反馈给玩家。

三.具体实现

首先我们需要一个函数去打印菜单,给玩家提供选择是否进入游戏。

void screen()
{
	printf("--------------------------\n");
	printf("---------1.Play ----------\n");
	printf("--------------------------\n");
	printf("---------2.Esc  ----------\n");
	printf("--------------------------\n");
}

玩家在看见如上所示的菜单后,就会进行选择,如果选择 1,那么我们就开始游戏;如果选择2,那么就退出游戏;除此之外的输出我们通通认为是非法输入, 这样的选择,本质上是3选1,我们可以使用switch语句,也可以使用多分支的if...else...语句,这里笔者以多分支的if...else...举例(game函数是游戏的具体执行函数,在后文会解释设计过程)

if (input == 1)//选择1,开始游戏
		{
			printf("开始游戏,在1到100中猜数字\n");
			game();//生成随机数,并开始猜
 
		}
		else if (input == 2)//选择2,退出游戏
		{
			printf("退出游戏\n");
			break;
		}
		else//非法输入,重新正确输入
		{
			printf("输入错误,请重试:\n");
		}

实现了这样的选择,我们还得思考,设计游戏不可能只让玩家输入一次啊,玩家在输入不符合要求的数字或者在游玩后还想再玩的话,那我们就需要在主函数中写入一个循环,可以供玩家多次的输入和多次的游玩。我们是需要先进行游戏循环体后再一直重复判断是否进行新的游戏,在这样的情况下,do...while...循环就刚好满足了我们的需求,如下示例:

do
	{
		screen();//打印屏幕菜单
 
		printf("请确认是否开始游戏:\n");
		scanf("%d", &input);//记录玩家的输入选择
 
		if (input == 1)//选择1,开始游戏
		{
			printf("开始游戏,在1到100中猜数字\n");
			game();//生成随机数,并开始猜
 
		}
		else if (input == 2)//选择2,退出游戏
		{
			printf("退出游戏\n");
			break;
		}
		else//非法输入,重新正确输入
		{
			printf("输入错误,请重试:\n");
		}
	} while (input != 2);

生成随机数

我们可以调用c语言中的库函数,rand()函数是可以生成随机数,但是他生成的随机数范围是0到RAND_MAX(在vs编译器中转为十进制就是32767),并且这个函数在使用前会先调用srand()函数来生成随机数的种子,也就是起点,因此,在我们使用rand函数之前,他就已经使用srand()函数生成了一个固定的种子了,所以就会导致了我们的随机数每一次都是一样的。

为了避免以上的问题,我们就需要使用时间戳来作为参数,让我们随机数的种子是一直处于动态变化的(时间戳是从计算机出现后,1970年1月1日开始到目前的时间所经历的秒数,是一个一直出于动态变化的值),那我们就可以使用time函数拿到时间戳,然后生成随机数

srand((unsigned int)time(NULL));//根据时间戳生成随机数的种子
                                //srand的参数是time函数的返回值
                                //time的参数是个空指针,并且将其强制转换为int

为了保证我们生成的随机数在1——100之间,我们可以做以下的操作

int ret=rand() % 100 + 1;//生成随机数,赋值给ret

游戏的判断逻辑

在完成了用户输入界面的设计,随机数生成的设计之后,我们就只需要解决游戏的主体内容,即如何判断玩家猜的数字与随机数的大小关系,玩家猜数字是进行多次猜测的,因此我们肯定需要一个循环,当玩家猜的数字大于随机数就输出“猜大了”,小于随机数就输出“猜小了”不停的判断输入直到玩家猜出正确答案,并且输出“恭喜你猜中了!”,设计如下:

	int guess = 0;//记录猜的值
	while (1)
	{
		printf("请输出一个1到100的数字:\n");
		scanf("%d", &guess);
		if (guess < ret)
			printf("猜小了\n");
		else if (guess > ret)
			printf("猜大了\n");
		else
		{
			printf("恭喜你猜中了!\n\n");
			break;
		}
	}

在解决了各部分的设计需求后,加以组合我们就可以得到最后的完整代码了,当然还有别的设计思路和方法,笔者这里只是简单的举一个例子

完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
void screen()
{
	printf("--------------------------\n");
	printf("---------1.Play ----------\n");
	printf("--------------------------\n");
	printf("---------2.Esc  ----------\n");
	printf("--------------------------\n");
}
 
void game()
{
	//第一步,生成随机数字,范围在1--100之间
	int ret=rand() % 100 + 1;//生成随机数,赋值给ret
	//printf("随机数为%d\n", ret);//测试输出是否正常
 
	//第二步,猜数字
	int guess = 0;//记录猜的值
	while (1)
	{
		printf("请输出一个1到100的数字:\n");
		scanf("%d", &guess);
		if (guess < ret)
			printf("猜小了\n");
		else if (guess > ret)
			printf("猜大了\n");
		else
		{
			printf("恭喜你猜中了!\n\n");
			break;
		}
	}
}
 
 
int main()
{
	int input = 0;//记录选择
	srand((unsigned int)time(NULL));//根据时间戳生成随机数的种子
	do
	{
		screen();//打印屏幕菜单
 
		printf("请确认是否开始游戏:\n");
		scanf("%d", &input);
 
		if (input == 1)//选择1,开始游戏
		{
			printf("开始游戏,在1到100中猜数字\n");
			game();//生成随机数,并开始猜
 
		}
		else if (input == 2)//选择2,退出游戏
		{
			printf("退出游戏\n");
			break;
		}
		else//非法输入,重新正确输入
		{
			printf("输入错误,请重试:\n");
		}
	} while (input != 2);
 
	return 0;
}



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。