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

news2025/2/27 12:50:24

在学习完循环和选择结构之后,我们可以做一个猜数字游戏。在此项目之前,如果还不会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.coloradmin.cn/o/2306885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Failed to start The PHP FastCGI Process Manager.

报错如下&#xff1a; Job for php-fpm.service failed because the control process exited with error code. See "systemctl status php-fpm.service" and "journalctl -xe" for details. 2月 25 21:49:00 nginx systemd[1]: Starting The PHP FastC…

【REST2SQL】15银河麒麟系统下达梦数据库部署REST2SQL

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…

晶体管输出光耦和逻辑输出光耦

晶体管输出光耦&#xff08;非线性&#xff09;和逻辑输出光耦&#xff08;线性&#xff09;的区别&#xff1a; 逻辑输出光耦的电流传输特性曲线是非线性的&#xff0c;适合于开关信号的传输&#xff0c;不适合于传输模拟量&#xff1b; 光电晶体管输出光耦的电流传输特性是线…

绕过过滤order by

一、常见绕过技术 1、注释符截断 利用注释符&#xff08;如 --、#&#xff09;截断后续查询&#xff0c;消除过滤逻辑的影响。 ORDER BY 1-- 若原查询为 SELECT * FROM table ORDER BY 用户输入&#xff0c;注入后可能忽略后续过滤逻辑。 2、大小写混淆/编码绕过 若过滤是大…

面试八股文--数据库基础知识总结(1)

1、数据库的定义 数据库&#xff08;DataBase&#xff0c;DB&#xff09;简单来说就是数据的集合数据库管理系统&#xff08;Database Management System&#xff0c;DBMS&#xff09;是一种操纵和管理数据库的大型软件&#xff0c;通常用于建立、使用和维护数据库。数据库系统…

机试刷题_1614. 括号的最大嵌套深度【python】

1614. 括号的最大嵌套深度 class Solution:def maxDepth(self, s: str) -> int:maxD 0if not s:return maxDstack []for char in s:if char(:stack.append(char)maxD max(maxD,len(stack))elif char) :stack.pop()return maxD

VM虚拟机安装与配置Ubuntu Linux操作系统详细教程~

一、下载VM虚拟机 VMware16.0.zip百度网盘下载链接:https://pan.baidu.com/s/1-l-CcAVNINqhRLSiQ26R7w?pwd=tznn 提取码: tznn 二、软件介绍 VMware(虚拟机)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,通过它可在一台电脑上同…

免费PDF工具

Smallpdf.com - A Free Solution to all your PDF Problems Smallpdf - the platform that makes it super easy to convert and edit all your PDF files. Solving all your PDF problems in one place - and yes, free. https://smallpdf.com/#rappSmallpdf.com-解决您所有PD…

组件注册方式、传递数据

组件注册 一个vue组件要先被注册&#xff0c;这样vue才能在渲染模版时找到其对应的实现。有两种注册方式&#xff1a;全局注册和局部注册。&#xff08;组件的引入方式&#xff09; 以下这种属于局部引用。 组件传递数据 注意&#xff1a;props传递数据&#xff0c;只能从父…

异步fifo学习

FIFO 本质是由 RAM 加上读写逻辑构成的先入先出的数据缓冲器。与 RAM 的区别是 FIFO 没有外部读写地址线&#xff0c;顺序写入顺序读出数据&#xff0c;其数据地址是由内部读写指针自增完成&#xff0c;因此 FIFO 在读写时不需要考虑读写冲突的问题。 根据 FIFO 工作的时钟域&a…

【有啥问啥】All-to-All 通信:原理、实现与应用

All-to-All 通信&#xff1a;原理、实现与应用 一、引言 在分布式计算和并行处理领域&#xff0c;进程之间的通信是至关重要的。All-to-All 通信作为一种高效的通信模式&#xff0c;广泛应用于各种高性能计算和分布式系统中。本文将详细介绍 All-to-All 通信的定义、工作原理…

Python学习第十七天之PyTorch保姆级安装

PyTorch安装与部署 一、准备工作二、pytorch介绍三、CPU版本pytorch安装1. 创建虚拟环境2. 删除虚拟环境1. 通过环境名称删除2. 通过环境路径删除 3. 配置镜像源4. 安装pytorch1. 首先激活环境变量2. 进入pytorch官网&#xff0c;找到安装指令 5. 验证pytorch是否安装成功 四、…

GPT-5倒计时:2025年AI海啸来袭,机器与人类对话临近

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 人工智能&AIGC术语100条 Shelly聊AI-重…

ADC采集的电压误差比较大怎么办?

目录 1、电源噪声和电源不稳定 2、参考电压不稳定或不准确 3、采样电路设计不合理 4、温度影响 5、软件校准和误差修正 6、时钟抖动 ADC&#xff08;模数转换器&#xff09;采集的电压误差可能会受到多种因素的影响&#xff0c;要有效减少误差&#xff0c;需要从硬件和软…

【单片机】MSP430MSP432入门

文章目录 0 前言1 开发方式选择2 CCS和开发相关软件3 Keil开发MSP4324 IAR for 430开发MSP4305 总结 0 前言 最近因为想学DSP&#xff0c;所以把之前卸载的CCS给装回来了&#xff0c;手头也还有之前电赛剩下的MSP430和MSP432的板子&#xff0c;由于年代久远&#xff0c;想着花点…

大模型自动提示优化(APO)综述笔记

自大型语言模型&#xff08;LLMs&#xff09;出现以来&#xff0c;提示工程一直是各种自然语言处理&#xff08;NLP&#xff09;任务中激发期望响应的关键步骤。然而&#xff0c;由于模型的快速进步、任务的多样性和相关最佳实践的变化&#xff0c;提示工程对最终用户来说仍然是…

SOME/IP-SD -- 协议英文原文讲解6

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.3.1 E…

每日Attention学习24——Strip Convolution Block

模块出处 [TIP 21] [link] CoANet: Connectivity Attention Network for Road Extraction From Satellite Imagery 模块名称 Strip Convolution Block (SCB) 模块作用 多方向条形特征提取 模块结构 模块特点 类PSP设计&#xff0c;采用四个并行分支提取不同维度的信息相比于…

Springboot快速接入豆包大模型

背景 突然接到上面的通知&#xff0c;想要在系统里面接入各大模型的能力&#xff0c;我这边随机选了个豆包&#xff0c;然后快速对接了一下&#xff0c;很顺利&#xff0c;一把过&#xff0c;现在文档的快速入门还是很ok的&#xff0c;在此记录一下过程&#xff0c;给宝子们参考…

DeepSeek的安全挑战和安全控制措施

本研究探讨了与 DeepSeek 相关的安全风险&#xff0c;为安全和风险管理领导者提供了有针对性的策略来缓解这些威胁&#xff0c;并提供了可行的措施来加强基于现有安全控制的 AI 保护。 主要发现 了解 DeepSeek 当前的安全状况。DeepSeek的采用激增暴露了关键的安全挑战&…