当前位置: 首页 > article >正文

C语言实战项目(1)---------->猜数字游戏

在学习完循环和选择结构之后,我们可以做一个猜数字游戏。在此项目之前,如果还不会C语言的if语句、switch语句等组成选择结构的语句,while循环、for循环、do-while循环等组成循环结构的语句。可以参考我之前的博客:

C语言(7)------------>if语句  CSDN

C语言(10)------------->switch语句 CSDN

C语言(11)------------->while循环  CSDN

C语言(12)--------->for循环  CSDN

C语言(13)------------>do-while循环 CSDN

C语言番外篇(3)------------>break、continue CSDN

在本篇文章中,我将介绍一个猜数字游戏,除了使用了C语言的选择和循环结构外,还使用到了rand函数和srand函数和time函数。函数章节暂时还没有讲解,但是这里不影响我们做出一个猜数字游戏,我都会对这些函数进行介绍以及如何使用。

猜数字的实现流程大致如下:

菜单的设计----->进入游戏信息的提示---->选择游戏是否进行------>进入游戏----->猜数字游戏的实现

为了让读者体会到设计的过程,我将抽丝剥茧般地讲解,所以整个文章的末尾将给出全部的源代码。

一、菜单的设计

我们常见的游戏菜单进入界面是有开始游戏键和退出游戏键,在本程序中输入数字1表示开始游戏,输入数字0表示退出游戏。

参考代码: 

#include <stdio.h>

int main()
{
		printf("***********************\n");
		printf("******* 1 .PLAY  ******\n");
		printf("******* 0 .EXIT  ******\n");
		printf("***********************\n");
	return 0;
}

运行结果:

二、 进入游戏信息的提示

使用printf函数提示输入数字,并使用scanf函数输入数字。

参考代码: 

#include <stdio.h>


int main()
{
	int input = 0;

	//使用do-while循环的原因是因为游戏界面至少会显示一次
	do
	{
		//菜单的设计
		printf("***********************\n");
		printf("******* 1 .PLAY  ******\n");
		printf("******* 0 .EXIT  ******\n");
		printf("***********************\n");

		//选择信息
		printf("请选择:>\n");
		scanf("%d", &input);

	} while (input);//使用input作为循环条件的原因是因为当我们输入了0,也就是退出游戏,恰好用于结束循环条件
	return 0;
}

运行结果:

三、游戏的进入与退出

 使用scanf函数输入数字,选择是否进入游戏。

输入1进入游戏,输入0退出游戏。输入1和0外的数字将提示输入错误重新输入数字。

当输入的数字是0,循环条件为假跳出循环,同时实现了结束游戏的目的。

 参考代码: 

#include <stdio.h>


int main()
{
	int input = 0;

	//使用do-while循环的原因是因为游戏界面至少会显示一次
	do
	{
		//菜单的设计
		printf("***********************\n");
		printf("******* 1 .PLAY  ******\n");
		printf("******* 0 .EXIT  ******\n");
		printf("***********************\n");

		//选择信息
		printf("请选择:>\n");
		scanf("%d", &input);
		//进入模式
		switch (input)
		{
			case 1:
				printf("开始游戏\n");
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	} while (input);//使用input作为循环条件的原因是因为当我们输入了0,也就是退出游戏,恰好用于结束循环条件
	return 0;
}

运行结果:

四、游戏逻辑的实现 

 实现猜数字游戏逻辑前我们先介绍一下三个函数 rand、srand、time。

(1)rand函数

rand函数定义在stdlib.h中,使用time函数需要引用此头文件。它用于产生伪随机数字,但是此随机数字是基于种子1产生的。当我们运行两次后生成的数字是一样的。生成的伪随机数字的范围是0~0x7fff。而0x7fff这个数字就是32767,这个可以使用16进制计算出来。也可以在程序中打印出来。

参考代码:

#include <stdio.h>
#include <stdlib.h>


int main()
{
	printf("%d\n", RAND_MAX);
	return 0;
}

运行结果:

rand函数使用参考代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int ret = 0;
	ret=rand();
	printf("%d\n",ret);
	ret = rand();
	printf("%d\n", ret);
	ret = rand();
	printf("%d\n", ret);
	ret = rand();
	printf("%d\n", ret);
	return 0;
}

第一次运行:

 第二次运行:

 我们可以看到两次运行结果产生的随机数字确实是一样的。

(2)time函数

time函数定义在time.h中,使用time函数需要引用此头文件。

它的返回类型是time_t,本质上是32位或64位的整型。返回的是一个时间戳。

它的参数是一个指针。即 time_t* timer

(3)srand函数

刚刚的例子中,大家可能好奇的是为什么要介绍time函数呢?这个就和我们的srand函数有关系了。srand函数的参数用于输入一个unsigned类型的种子。我们知道种子要是随机的才好,时间是一直流动的。所以时间戳一定不会重复。用time函数恰好能够解决我们的问题。

我们可以尝试一下使用srand函数之后的rand函数生成的随机数字。

参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	srand((unsigned int)time(NULL));
	int ret = 0;
	ret=rand();
	printf("%d\n",ret);
	ret = rand();
	printf("%d\n", ret);
	ret = rand();
	printf("%d\n", ret);
	ret = rand();
	printf("%d\n", ret);
	return 0;
}

第一次运行结果:

 第二次运行结果:

我们可以发现,这个时候生成的随机数字是不一样的了。 

介绍完这三个函数后,我们来实现游戏逻辑。

参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	int input = 0;
	

	//使用do-while循环的原因是因为游戏界面至少会显示一次
	do
	{
		//菜单的设计
		printf("***********************\n");
		printf("******* 1 .PLAY  ******\n");
		printf("******* 0 .EXIT  ******\n");
		printf("***********************\n");

		//选择信息
		printf("请选择:>\n");
		scanf("%d",&input);

		//进入模式
		switch (input)
		{
			case 1:
				printf("开始游戏\n");

				srand((unsigned int)time(NULL));
				//用于产生rand函数的随机种子

				int ret=rand()%100+1;//用于产生1~100的数字

				//用户输入数字
				while (1)
				{
					printf("请猜数字:>\n");
					int guess = 0;
					scanf("%d", &guess);

					//判断数字是否相等
					if (guess > ret)
					{
						printf("猜大了\n");
					}
					else if (guess < ret)
					{
						printf("猜小了\n");
					}
					else
					{
						printf("恭喜您,猜对了\n");
						break;
					}
				}
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	} while (input);//使用input作为循环条件的原因是因为当我们输入了0,也就是退出游戏,恰好用于结束循环条件
	return 0;
}

 运行结果:

 为保证游戏公平,随机种子应当放在do-while循环前面。因为srand的随机种子是根据时间戳实现的。

参考代码:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	int input = 0;


	//用于产生rand函数的随机种子
	srand((unsigned int)time(NULL));

	//使用do-while循环的原因是因为游戏界面至少会显示一次
	do
	{
		//菜单的设计
		printf("***********************\n");
		printf("******* 1 .PLAY  ******\n");
		printf("******* 0 .EXIT  ******\n");
		printf("***********************\n");

		//选择信息
		printf("请选择:>\n");
		scanf("%d",&input);

		//进入模式
		switch (input)
		{
			case 1:
				printf("开始游戏\n");

				
				

				int ret=rand()%100+1;//用于产生1~100的数字

				//用户输入数字
				while (1)
				{
					printf("请猜数字:>\n");
					int guess = 0;
					scanf("%d", &guess);

					//判断数字是否相等
					if (guess > ret)
					{
						printf("猜大了\n");
					}
					else if (guess < ret)
					{
						printf("猜小了\n");
					}
					else
					{
						printf("恭喜您,猜对了\n");
						break;
					}
				}
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	} while (input);//使用input作为循环条件的原因是因为当我们输入了0,也就是退出游戏,恰好用于结束循环条件
	return 0;
}

 运行结果:

其实菜单和游戏逻辑的实现也可以封装成一个函数,这样使得代码更加方便阅读。考虑部分读者没有学习过C语言的函数的部分,此部分可以选择性查看。

参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


void Menu()
{
	printf("***********************\n");
	printf("******* 1 .PLAY  ******\n");
	printf("******* 0 .EXIT  ******\n");
	printf("***********************\n");
}

void Game()
{
	int ret = rand() % 100 + 1;//用于产生1~100的数字
	while (1)
	{
		printf("请猜数字:>\n");
		int guess = 0;
		scanf("%d", &guess);

		//判断数字是否相等
		if (guess > ret)
		{
			printf("猜大了\n");
		}
		else if (guess < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜您,猜对了\n");
			break;
		}
	}
}

int main()
{
	int input = 0;

	//用于产生rand函数的随机种子
	srand((unsigned int)time(NULL));

	//使用do-while循环的原因是因为游戏界面至少会显示一次
	do
	{
		//菜单的设计
		Menu();

		//选择信息
		printf("请选择:>\n");
		scanf("%d",&input);

		//进入模式
		switch (input)
		{
			case 1:
				printf("开始游戏\n");
				Game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	} while (input);//使用input作为循环条件的原因是因为当我们输入了0,也就是退出游戏,恰好用于结束循环条件
	return 0;
}

运行结果:


http://www.kler.cn/a/562754.html

相关文章:

  • Redis面试题----为什么要做Redis分区?
  • 基于springboot+vue的人工智能领域复合型人才校企协同培养管理系统
  • Python基于Django和Vue的校园互助平台(附源码、文档说明)
  • 【Uniapp-Vue3】点击将内容复制到剪切板
  • 使用 LangChain 和 Milvus 构建测试知识库
  • 【Jenkins】一种灵活定义多个执行label节点的jenkinsfile写法
  • Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(八)
  • 物联网综合实训室建设方案的探讨(职业院校物联网综合实训室建设方案)
  • Pytorch实现之浑浊水下图像增强
  • DeepSeek + 数据分析:让数据洞察更智能、更高效
  • 技术改变生活新趋势
  • RAG-202502
  • 解密ZAB协议:Zookeeper一致性的核心实现
  • WebSocket简单介绍 并接入deepseek
  • Golang `testing`包使用指南:单元测试、性能测试与并发测试
  • LeetCode热题100- 字符串解码【JavaScript讲解】
  • more than one owned sequence found.
  • 26.[前端开发-JavaScript基础]Day03-循环语句
  • 蓝桥杯 五子棋对弈
  • 对 flask 框架中的全局变量 request 探究