C语言猜数字游戏详解及代码优化

news2025/1/15 19:58:48

目录

引言:

1.程序思路: 

2.代码实现:

2.1.生成游戏菜单:

2.2.构建主函数框架: 

2.3.构建游戏函数: 

3.游戏源码: 

4.程序优化:

🎈优化后源码: 

结论: 


引言:

猜数字游戏是一种非常经典的小游戏,通过让玩家猜一个随机生成的数字来测试其智力和运气。在本篇博客中,博主将通过详细的代码示例来介绍如何使用C语言实现一个简单的猜数字游戏,帮助小伙伴们更好的理解和掌握C语言的基本语法和逻辑控制结构。

1.程序思路: 

猜数字游戏的基本思路是:

  1. 程序随机生成一个1~100之间的数
  2. 玩家通过输入猜测的数字来猜测这个数字
  3. 如果猜小了,就告诉你猜小了
  4. 如果猜大了,就告诉你猜大了
  5. 如果猜对了,那就恭喜你,游戏结束

2.代码实现:

2.1.生成游戏菜单:

给这个游戏设置一个菜单,玩家选择1为开始游戏,选择0为退出游戏。

void menu()
{
	printf("********************\n");
	printf("****   1.play   ****\n");
	printf("****   0.exit   ****\n");
	printf("********************\n");
}

效果显示:

2.2.构建主函数框架: 

我们希望一盘游戏结束后不过瘾,还可以继续玩,这时候就可以使用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;
}

2.3.构建游戏函数: 

 如果测试没有问题,就可以继续实现里边的细节。接下来我们可以在“猜数字”这儿简单封装一个game()函数,将玩游戏的逻辑包含在里边,回头再在主函数里边调用。我们C语言里边提供了一个生成随机数的函数,叫rand(),它的返回值其实就是一个随机数。感兴趣的伙伴可以在https://legacy.cplusplus.com/这个网站里边了解一下它的基本用法,但是如果我们只是这样写出来,却会发现它每次生成的随机数都是一样的,如下图所示:

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

🎈游戏效果:

3.游戏源码: 

🎈附上游戏源码:

#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()
{
	//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;
}

4.程序优化:

上面的程序虽然可以实现猜数字游戏的基本功能,但还有一些可以优化的地方,如下:

  1. 在程序中添加错误处理机制,防止玩家输入非法字符或超出范围的数字。
  2. 增加可玩性,例如添加计时功能记录最高分等。
  3. 优化代码结构,使程序更加简洁,易读。

🎈优化后源码: 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#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语言,我们下期再见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000563.html

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

相关文章

Power Series and Laplace Transforms

See https://math.libretexts.org/Bookshelves/Analysis/Supplemental_Modules_(Analysis)/Ordinary_Differential_Equations/6%3A_Power_Series_and_Laplace_Transforms

计算机毕设之基于Hadoop+springboot的物品租赁系统的设计与实现(前后端分离,内含源码+文档+教程)

该系统基于Hadoop平台&#xff0c;利用Java语言、MySQL数据库&#xff0c;结合目前流行的 B/S架构&#xff0c;将物品租赁管理的各个方面都集中到数据库中&#xff0c;以便于用户的需要。在确保系统稳定的前提下&#xff0c;能够实现多功能模块的设计和应用。该系统由管理员功能…

编译CentOS Stream 8系统的OpenSSHV9.4rpm安装包

目前OpenSSH版本已至9.4&#xff0c;其作为操作系统底层管理平台软件&#xff0c;需要保持更新以免遭受安全攻击&#xff0c;编译生成rpm包是生产环境中批量升级的最佳途径。编译软件包时与当前的运行环境有较大关系&#xff0c;请注意本安装包系在CentOS Stream 8原生系统纯净…

游戏发行平台都有什么服务和功能?

游戏发行平台通常提供一系列服务和功能&#xff0c;以帮助游戏开发商将游戏推向市场&#xff0c;并为玩家提供游戏。以下是一些常见的游戏发行平台服务和功能&#xff1a; 1、游戏发布 发行平台允许游戏开发商将游戏上传到平台上&#xff0c;以供玩家下载和安装。 2、游戏销售…

【C++】构造函数与析构函数概念简介 ( 构造函数和析构函数引入 | 构造函数定义与调用 | 析构函数定义与调用 | 代码示例 )

文章目录 一、构造函数和析构函数引入二、构造函数简介1、构造函数定义2、构造函数调用3、代码示例 - 构造函数定义与调用 三、析构函数简介1、析构函数定义2、析构函数调用3、代码示例 - 析构函数定义与调用 一、构造函数和析构函数引入 在 C 语言中 , 创建对象时 , 需要进行对…

【数据结构】二叉树的链式存储结构

【数据结构】二叉树的链式存储结构 二叉树的存储结构 typedef int BTDataType; // 二叉树的结构 typedef struct BinaryTreeNode {BTDataType data; // 树的值struct BinaryTreeNode *left; // 左孩子struct BinaryTreeNode *right;// 右孩子 } BinaryTreeNode;二…

华为云云服务器云耀L实例评测 | 上手华为云耀L实例:一篇教学文章就够了

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Linux驱动【day2】

mychrdev.c: #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include<linux/uaccess.h> #include<linux/io.h> #include"head.h" unsigned int major; // 保存主设备号 char kbuf[128]{0}; unsigned int…

Stable Diffusion WebUI内存不够爆CUDA Out of memory怎么办?

在我们运行SD的时候,我们经常会爆CUDA Out of memory。 我们应该怎么办呢? 这是因为我们的显存或者内存不够了。 如果你是用cpu来跑图的则表示内存不够,这个时候就需要换个大点的内存了。 如果你是用gpu来跑图的就说明你显存不够用咯,这时候咋办呢? 下面我将一一述说…

企业架构LNMP学习笔记39

MySQL读写分离案例实现&#xff1a; 搭建M-S复制 主从复制的原理&#xff1a;主服务器开启bin-log&#xff08;记录了写操作&#xff09;&#xff0c;从服务器获取到主服务器的bin-log&#xff0c;记录到relay-log中。从服务器在通过异步的线程方式&#xff0c;对于relay-log…

明星为何会偷税?我国的交税政策是?

近几年常常会看到某明星偷税漏税塌房的&#xff0c;从最开始的震惊&#xff0c;到后面的习以为常&#xff1a;很多明星都在偷税漏税啊。那么明星为什么会是偷税漏税的高发区&#xff1f; 交税标准 个人 根据我国的税务相关法律规定&#xff0c;个人收入每月超过5000&#xf…

微服务高可用容灾架构设计

导语 相对于过去单体或 SOA 架构&#xff0c;建设微服务架构所依赖的组件发生了改变&#xff0c;因此分析与设计高可用容灾架构方案的思路也随之改变&#xff0c;本文对微服务架构落地过程中的几种常见容灾高可用方案展开分析。 作者介绍 刘冠军 腾讯云中间件中心架构组负责…

windows本地验证码识别工具

windows本地验证码识别小工具 - 可以用在windows系统中&#xff0c;并可以集成在Java或python程序中 演示视频如下&#xff1a;可用于识别4-7位的字母数字组合的验证码&#xff08;识别准确率在70% - 80%&#xff09;。 验证码识别演示 本项目未开源&#xff0c;如需使用请联…

IntelliJ IDEA 远程调试 Tomcat

准备工作 明确远程服务器的 IP 地址&#xff0c;比如我是&#xff1a;192.168.92.128 关掉服务器防火墙&#xff1a;service iptables stop 本地 Remote Server 配置 添加 Remote Server&#xff0c;如下图 复制 Remote Server 自动生成的 JVM 参数&#xff0c;等下有用&…

透过优衣库秋冬新品巡展,看见服装消费新风尚

这是一个被高温笼罩的夏天&#xff0c;人们想法设法适应季节变换&#xff0c;在这种适应中&#xff0c;尽可能地保持着装之美。 一向走在穿衣风格一线的优衣库&#xff0c;并没有缺席市场更替中涌现的需求&#xff0c;其春夏系列从凉感防晒的功能性服装&#xff0c;到“辣妹T”…

腾讯云2023年云服务器优惠活动价格表

腾讯云经常推出各种云产品优惠活动&#xff0c;为了帮助大家更好地了解腾讯云服务器的价格和优惠政策&#xff0c;下面给大家分享腾讯云最新云服务器优惠活动价格表&#xff0c;助力大家轻松上云&#xff01; 一、轻量应用服务器优惠活动价格表 1、轻量应用服务器&#xff1a;…

稳定的 Glance 来了,安卓小部件有救了!

稳定的 Glance 来了&#xff0c;安卓小部件有救了&#xff01; 稳定版本的 Glance 终于发布了&#xff0c;来一起看看吧&#xff0c;看看这一路的旅程&#xff0c;看看好用么&#xff0c;再看看如何使用&#xff01; 前世今生 故事发生在两年的一天吧&#xff0c;其实夸张了…

数据结构算法刷题(29)动态规划

思路一&#xff1a;回溯&#xff1a;按照选和不选的判断方式&#xff0c;使用回溯来解决这个问题。 class Solution: def rob(self, nums: List[int]) -> int: n len(nums) #数组的长度 def dfs(i): if i<0: #到达边界条件后 return 0 #返回最大金额是0 res max(dfs(i…

医疗环境升级改造,从此温湿度监控不用慌!

在现代医疗环境中&#xff0c;为了确保患者的舒适和康复&#xff0c;温度和湿度的监控和管理变得至关重要。特别是在疗养院这样的医疗机构中&#xff0c;患者的健康与室内环境条件密切相关。温度和湿度的不适当波动可能导致不仅是不适&#xff0c;还可能加剧病情&#xff0c;影…

9月8日上课内容 第一章 rsync远程同步

主从复制总结 redis主从复制 是为了数据冗余和读写分离 在这两种模式中&#xff0c;有两种角色主节点 (master) 和从节点 (slave) &#xff0c;主节点负责处理写的操作&#xff0c;并将数据更改复制到一个或多个从节点。这样我们的主节点负载减轻&#xff0c;从节点可以提供数据…