【C语言】贪吃蛇详解(附源码)

一、贪吃蛇实现效果

【C语言】贪吃蛇(控制台)

二、源码

🎈🎈🎈Snake · 残风也想永存/C语言项目 - 码云 - 开源中国 (gitee.com)🎈🎈🎈

三、如何使用C语言去实现一个贪吃蛇?

1.0.贪吃蛇游戏设计

实现一个贪吃蛇游戏,我们需要构建一个清晰的游戏框架并考虑以下几个方面:

1.1. 游戏元素生成与表现
  • 食物生成:通过随机数生成函数,确定食物在游戏窗口内的随机位置。
  • 贪吃蛇表现:利用结构体存储贪吃蛇的信息(如位置、长度、移动方向等),并通过一帧帧的绘制来展现其移动效果。
1.2. 游戏界面设计
  • 窗口大小:设定游戏窗口的尺寸,决定游戏区域的边界。
  • 可移动范围:设定贪吃蛇在游戏窗口内可自由移动的区域。
  • 围墙设计:确保贪吃蛇在触碰到窗口边界时能够识别为撞墙。 元素形状:定义贪吃蛇和食物的形状,以便在界面上绘制。
1.3. 游戏信息管理与打印
  • 贪吃蛇信息存储:使用结构体来存储贪吃蛇的状态信息,包括当前位置、长度、移动速度等。
  • 信息打印:在游戏界面上实时显示当前贪吃蛇的长度(得分)、速度、食物的分值以及帮助信息等信息。
1.4. 游戏逻辑控制
  • 蛇的移动:根据用户的输入或默认方向控制贪吃蛇的移动方向。
  • 状态判断:实时检测(每走一步)贪吃蛇是否撞墙或蛇头是否撞到自身,以及是否吃到食物。
  • 食物分值:设置吃到食物后的分值变化,并更新贪吃蛇的长度。
1.5. 用户交互
  • 移动方向控制:允许用户通过交互设备控制贪吃蛇的移动方向。
  • 移动速度控制:允许用户通过交互设备控制贪吃蛇的移动速度。
  • 游戏状态控制:允许用户通过交互设备控制贪吃蛇的游戏暂停与游戏结束。
1.6.实现注意事项
  • 在实现过程中,需要注意代码的模块化与可读性(我会带你们感受一下,代码的模块化是多么的爽),以便后续的维护和扩展。同时,也要考虑游戏的性能优化,确保流畅的游戏体验。
2.技术要求(win32 API / cmd命令)
2.0.前言
  • win32 API 的函数接口使用需要引头文件<Windows.h>
  • system() 库函数的使用需要引用头文件<stdlib.h>
  • 打印宽字符,必须事先本地化;
2.1.修改控制台大小和名字       

在C语言中,存在一个库函数可以用来执行控制台命令:
int system(const char* command);    

#修改控制台的大小        (这里我将控制台的长设为100,宽设为30)
mode con cols = 100 lines = 30

system("mode con cols=100 lines=30");

#修改控制台的名字        (这里我将控制台名字设为贪吃蛇)
title 贪吃蛇 

system("title 贪吃蛇");

2.2.隐藏控制台光标

2.3.定位光标位置

2.4.修改控制台文字输出颜色

2.5.获取按键信息

更多键值信息:虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn

2.6.宽字符与窄字符
  • 宽字符和窄字符的定义:
  • ASCII是用于信息交换的标准单字节字符编码系统。它最初包含了128个特定字符,每个字符占用一个字节(8位)。这些字符主要是英文字母、数字和一些控制字符。因此,ASCII码对应的字符通常被称为窄字符。
  • 随着C语言使用国家与区域的人越来越多,使用一个char类型来存储已经明显不够用了,所以就引用了多字符(通常是两个字符),也被称为宽字符。
  • 我们可以在控制台上打印以下的宽字符来表示蛇身,蛇头,食物,和围墙

2.7.如何去打印宽字符

注意:很多宽字符在控制台上的打印是窄字符的两倍(如上边打印的特殊符号)

2.8.如何播放音乐(选择)

所需头文件

#include<Windows.h>
#include<mmstream.h>
#pragma comment(lib,"winmm.lib")

播放音乐的函数

MCIERROR mciSendString( LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback );

第二个参数:填 NULL 就行

第三个参数:填 0 就行

第四个参数:填 NULL 就行

第一个参数:对音乐进行的操作

1.L"open 文件名 alias 别名"          #打开音乐文件+取别名

2.L"setaudio 文件名 volume to 音量大小"         #调整音量大小

3.L"play 文件名 repeat"         #播放音乐+重复播放

4.L"stop 文件名"         #停止播放音乐

这是我把此函数的所有功能进行了重新封装:以达到方便使用的功能~

2.9.如何播放音效(选择)

BOOL PlaySound( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound );

第一个参数:你要播放的音效的文件路径

第二个参数:填 NULL 就行

第三个参数:填 0 就行

四、代码实现(详解)

1.代码实现流程框图

2. 每个板块的逐一实现与讲解
2.1.游戏开始
2.1.0.游戏开始的函数代码

2.1.1.播放音乐

2.1.2.设置控制台信息

2.1.3.打印欢迎界面

2.1.4.初始化围墙

2.1.5.初始化贪吃蛇

蛇的生成起始位置+起始蛇的长度

 

2.1.6.随机生成食物

2.1.7.打印帮助信息

2.2.游戏运行
2.2.0.游戏运行的函数代码

2.2.1.打印得分情况

2.2.2.获取按键情况

2.2.3.蛇的移动(重要)

2.2.4.判断是否撞墙

2.2.5.判断是否撞到自身

2.2.6.贪吃蛇的休眠

Sleep(snake->_SnakeSpeed); 

2.2.7.判断游戏状态

snake->_State == GAME_NORMAL //只需判断这个语句是否为真;

2.3.游戏结束

2.4.菜单代码(实现重复玩功能)

五、问题拓展补充

0.问题介绍

你得保证自己的一切操作是windows控制台上执行的,而不是终端上面,修改方法,上边的横栏右键,点击设置,将windows终端,改为windows控制台即可~

1.终端示意图(错误)

2.控制台示意图(正确)

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

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

相关文章

【04-提升模型性能:集成学习与超参数优化】

文章目录 前言集成学习BaggingBoosting超参数优化随机搜索贝叶斯优化总结前言 在前几篇博文中,我们已经介绍了一些机器学习的基础知识、Scikit-learn的核心工具与技巧,以及如何评估模型性能。本篇博文将重点讲解两个可以显著提升机器学习模型性能的高级策略:集成学习和超参数…

【机器学习】集成学习---投票法(Voting)

一、引言 集成学习&#xff08;Ensemble Learning&#xff09;是机器学习领域中的一种重要策略&#xff0c;它通过结合多个模型的预测结果来提高整体性能。在单个模型容易过拟合或欠拟合的情况下&#xff0c;集成学习能够通过综合多个模型的优点来减少这种风险&#xff0c;从而…

【北京迅为】《iTOP龙芯2K1000开发指南》-第三部分 迅为龙芯开发板快速体验

龙芯2K1000处理器集成2个64位GS264处理器核&#xff0c;主频1GHz&#xff0c;以及各种系统IO接口&#xff0c;集高性能与高配置于一身。支持4G模块、GPS模块、千兆以太网、16GB固态硬盘、双路UART、四路USB、WIFI蓝牙二合一模块、MiniPCIE等接口、双路CAN总线、RS485总线&#…

使用navicate演示在 PostgreSQL 中使用 for 循环语句

1、简单循环示例 do $$ beginfor cnt in 1..10 loopraise notice cnt: %, cnt;end loop; end; $$ navicate中执行 2、循环查询 do $$ declare_record record; beginfor _record in (SELECT version,description FROM flyway_schema_history ORDER BY installed_rank desc li…

JavaScript:js实现在线五子棋人机(人人)对弈

在线五子棋人机对弈 全部使用前端技术,使用HTML,CSS以及JS进行实现. 棋盘在后端就是一个15*15的二维数组 页面设计 页面设计的比较粗糙 主要使用js自带的canvas画布进行绘画 HTML代码如下: <div class"outer"><canvas id"canvas" height&qu…

软件设计师-基础知识科目-计算题汇总1

1. 位运算&#xff1a; 略 2. 进制转换&#xff1a; 3. 计算内存存储容量&#xff1a; 前置概念&#xff1a;** 内存地址是16进制。 16进制后面的加上的字母H&#xff0c;表示数字为16进制。内存地址编址的单位是Byte&#xff0c;1K 1024B&#xff0c;1024用16进制表示为400H …

C语言 流程图与伪代码 缩减

本文 我们来说说流程图 伪代码和代码缩进 这些可以让我们在后面书写复杂逻辑时 不会感到 繁琐或逻辑混乱 流程图(Flowchart) 是用以算法、工作流或流程的一种框图表示&#xff0c;它以不同类型的框代表不同种类的步骤&#xff0c;每两个步骤之间则以箭头连接。 流程图是程序…

【UE C++】打印输出的两种方式

目录 一、UE_LOG 二、调试屏幕信息 一、UE_LOG 定义&#xff1a; UE_LOG 是一个将格式化消息记录到日志文件中的宏。 用法&#xff1a; UE_LOG(LogTemp, Warning, TEXT("Hello World")); 第一个输入参数 LogTemp 是提供给 DEFINE_LOG_CATEGORY 宏的类别名称。你…

OpenAIGPT-4.5提前曝光?

OpenAI GPT-4.5的神秘面纱&#xff1a;科技界的震撼新篇章 在人工智能的世界里&#xff0c;每一次技术的飞跃都不仅仅是一次更新&#xff0c;而是对未来无限可能的探索。近日&#xff0c;科技巨头OpenAI似乎再次站在了这场革命的前沿&#xff0c;其潜在的新产品——GPT-4.5 Tur…

使用gdb调试遇到No symbol table is loaded. Use the “file“ command.怎么办?

问题排查 出现下面问题&#xff0c;通常是没有处于调式模式环境下&#xff0c;所以我们需要在gcc指令后加 【-g】。 因为&#xff0c;我么的gcc编辑器默认是动态链接&#xff0c;而且是realese发布版本。 想要解决也很简单 主要思路就是在gcc -g。 在makefile文件如下进行修改即…

Unity | 集成 Protobuf(proto 转 cs 插件及序列化与反序列化)

1. 添加 dll 1. 下载 protobuf 源码 根据需要下载 protobuf 指定版本的源码&#xff0c;这里以 v3.21.12&#xff08;protobuf-csharp-3.21.12.zip&#xff09;为例&#xff1a; 下载地址&#xff1a;「https://github.com/protocolbuffers/protobuf/releases」 2. 下载 Vis…

常见内网代理工具及其应用

常见内网代理工具 1. 正向代理&#xff1a;Squid原理示例 2. 反向代理&#xff1a;Nginx原理示例 3. SOCKS代理&#xff1a;Shadowsocks原理示例 零基础入门学习路线视频配套资料&国内外网安书籍、文档网络安全面试题 常见的内网代理工具包括多种类型&#xff0c;如正向代理…

自从用上电路仿真软件后,我才领悟到的4大奥秘

在电子工程领域&#xff0c;电路仿真软件已成为设计师们不可或缺的得力助手。自从我开始使用这款软件&#xff0c;它不仅极大提升了我的工作效率&#xff0c;还让我领悟到了许多前所未有的知识。今天&#xff0c;就让我来分享自从用上电路仿真软件后&#xff0c;我才知道的4件事…

【分享】WinRAR软件如何压缩文件?

WinRAR是一款功能强大的压缩文件管理工具&#xff0c;支持多种压缩文件格式&#xff0c;那如何使用WinRAR来压缩文件呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 压缩方法&#xff1a; 首先&#xff0c;安装好WinRAR工具&#xff0c;然后选中需要压缩的文件或文件夹…

OSPF的学习笔记

1.OSPF &#xff08;1&#xff09;链路状态路由协议的路由信息并不是像距离矢量路由协议那样(邻居告诉的)&#xff0c;通过收集自身以及邻居发出的LSA(原材料)&#xff0c;并LSA放到指定仓库里面(LSDB)&#xff0c;通过SPF算法&#xff0c;以自己为根计算到达网络每个节点的最优…

手机图片制作动态gif怎么做?不能错过的好用网站!

现在手机可是人人不离手的&#xff0c;而且手机上的很多软件功能已经逐渐取代了电脑。有时候我们想要把手机中的照片变成有动态效果的gif动图还不想下载软件的时候&#xff0c;就可以用Gif在线制作网站&#xff0c;不用下载软件&#xff0c;手机电脑都能在线操作。非常的方便小…

小孩近视用白炽灯好吗?分享多款央视推荐的护眼台灯

很多家长关心&#xff0c;小孩近视用白炽灯好吗&#xff1f;首先肯定是不太建议的&#xff0c;虽说白炽灯价格便宜&#xff0c;显色较好&#xff0c;不过光线会比较集中刺眼&#xff0c;而且由于是发热发光&#xff0c;也存在一定的安全隐患&#xff0c;更重要的是光衰现象会比…

Linux Docker下载镜像更改默认存储位置/usr/lib/docker

用于解决docker默认存储位置磁盘空间不足&#xff0c;切换存储位置 1、执行下面命令查看 现在docker的存储位置 docker info | grep "Docker Root Dir" 1.2、如果之前已经下载过镜像可以用mv命令把原来的镜像复制到新的地址 mv /var/lib/docker /data/docker 2、…

考研日常记录(upd 24.4.24)

由于实在太无聊了 &#xff0c; 所以记录以下考研备考日常 &#xff0c; 增加一点成就感 &#xff0c; 获得一点前进动力。 文章目录 2024.4.18 周四课程情况&#xff1a;时间规划&#xff1a; 2024.4.19 周五课程情况&#xff1a;时间规划&#xff1a; 2024.4.20 周六2024.4.2…

【Shell】循环结构——for和while循环实例

Shell可以重复地执行特定的指令&#xff0c;直到特定的条件被满足为止。这重复执行的一组指令就叫做循环 特点&#xff1a; 首先&#xff0c;循环条件中使用的变量必须是已初始化的&#xff0c;然后在循环中开始执行每次在循环开始时进行一次测试重复地执行一个代码块 循环实例…