3步实现贪吃蛇

方法很简单,打开页面,复制,粘贴

一.整体思维架构

53bf3be904424253b41d16d68a9202f8.jpg

 我们根据游戏的开始,运行,结束,将整个游戏划分成三个部分。在每个部分下面又划分出多个功能,接下来我们就根据模块一一实现功能。

二.Gamestart

2.1设置窗口大小与窗口名字

由于游戏需要用到控制台窗口,所以我们需要使用一些win32API的相关知识。

首先我们需要调整窗口大小,这里用到了一个mode con的指令,以及给title进行命名,通过调用system来实现

c861712526704fa895ef26d271b9add5.png

 在使用system之前要加上头文件

bb4c857341ec4045a10d454b39fcadea.png

 2.2隐藏屏幕光标

2.2.1 GetStdHandle

GetStdHandle是Windows ApI函数,他用于从一个特定的标准设备(标准输入,标准输出,标准错误)中取得一个句柄,用这个句柄可以操作设备。

8816363624d748e48357769336c3e137.png

 我们通过一个houput指针来接收一份标准输出光标。

2.2.2 GetConsoleCursorInfo

GetConsoleCursorInfo是用来检索有关指定控制台屏幕缓冲区的光标大小和可见性信息。他的参数为一个bool类型。使用时,需要一份handle指针,以及一个相关结构体(包含控制台光标信息)。

cfbdbefcc31b4b7196e2b034ec70a75e.png

 2.2.3 CONSOLE_CURSOR_INFO

这是一个结构体,能够获取有关控制台光标的信息。包括dwSize光标填充的字符单元格的百分比,bVisinle游标的可见性。

ac5ed8d2d6c94cb08e8c29cc214261ad.png

 这里我们将其置为false,就可以隐藏光标。

2.2.4 SetConsoleCursorInfo

设置指定控制台屏幕缓冲区的光标大小和可见性。

6f13b897f07e4e8ca03f6a4ef925e691.png

 我们将指针与检索信息传给其,就能完成光标设置。

2.3 欢迎界面WelcomeToGame

在此之前我们需要制作一个坐标设置的函数。

COORD是Windows API中定义的一个结构体,表示一个字符在控制台屏幕上的坐标。

由此我们可以制作一个定位函数

773ffc24949c4fe4a8fdc837ae93904b.png

 输入x,y的坐标,将光标定位到该处。

我们根据这个函数,以及屏幕的大小,适当调整位置打印相关信息。

a02d5c8ab4164d04956c41482f45926a.png

 这里我们运用到了pause 和cls,使每打印完一次信息就清理屏幕打印下一句信息。

2.4创建地图CreatMap

首先我们定义一下墙体

dbdf847b659d41b8a3cf4abf12fcb6df.png

 为一个□,这个字符号可以在输入法内找到。接着我们开始输入墙体,从0.0开始,在控制台内输入要用到wprintf,输入则需要在类型前加上L。由于控制台的x坐标与y坐标大小不一样的原因,x坐标相较于y坐标的每个单位要小,所以我们的循环中,x坐标处我们每两个一打印。

7fa4d4faede14019ae66cebfb7661a40.png

 2.5创建蛇身InitSnake

2.5.1蛇身结点创建

这里我们用到一个结构体,蛇身需要xy坐标,以及下一个蛇身结点的地址。

40571c82733c425f9f57d7a66a603114.png

 2.5.2蛇的维护结构

一条蛇内要包含蛇头的指针,维护蛇食物的指针,蛇的初始方向,蛇的状态,得分情况,蛇的大小,每走一步需要休眠的时间。

1bfc155c97a54d8eb98b108f9b8d23ce.png

 我们用一个枚举结构体储存蛇的相关状态以及方向控制。

cb449b44f68a462ca684388fd10d5314.png

5dd053b13950417ebfda2eac53f3c876.png 

 2.5.3初始化蛇身

传递一个蛇身结点,初始化为cur。我们先初始化蛇身为5个结点,通过for循环一次malloc出一块空间,结点依次链接。将结点赋给_psnake。

8a061aef29e7462581490d9471e8d4fb.png

 之后我们需要将蛇身打印出来,并且初始化数据。

caad7ef93c4b46ca87e994793a079a6e.png

 2.6创建食物CreateFood

首先我们要保证食物要在地图内部,其次食物不能与蛇身重复。

我们将食物坐标设置为⭐

5eee59bc41a54d148aa8d2be7a0650e2.png

我们可以用x=rand%53+2,y=rand%25+1使得坐标在地图内部,while循环x%2!=0使x坐标恒为2的倍数。

6a83bc66000c4ecbb1930f62c7398ada.png

 完成上述判断后给食物进行初始化

022df84dd3b54c9ea9d9ea43962eeae1.png

 2.7总结Gamestart

cee1d15072b346988a9a2d7cd99a58d6.png

 三. GameRun

3.1右侧打印有效信息PrintHelpInfo

98a6b7f582cf4373816daa6fa64a3a95.png

 3.2 KEY_PRESS

这是一个宏,用于检测按键状态,若按键被按下则首位为1,否则则为0

ee41e748fcd54ab7aa9dee9f3ef2681e.png

 3.3主要设计思路

首先我们在右侧打印出游戏相应提示,用KEY_PRESS判断按键,来判断蛇的移动方向以及加速减速,游戏暂停等等。我们用一个do while循环来操作蛇的每一步,每走一步休眠一定时间,直到游戏结束为止。

7c90e7f0b72c407e87a35e27ddac08ec.png

b87098acf5de4c149171a1b8a9fbc1e6.png 

 我们通过控制sleep和weight来实现加速和减速效果。

3.4 蛇的移动SnakeMove

蛇的移动首先要满足不能和原先方向相反移动。蛇头向前走,蛇尾销毁结点。以及蛇的状态,是吃食物,撞墙,自杀。

3.4.1上下左右移动

通过判断按键是否按下,用Switch来进行循环判断,注意x坐标每次移动2个单位。

eb100f8bcbdd4cfda69b2fb4762e7952.png

 3.4.2判断是否有食物

若下一个结点有食物,就将食物与蛇结点相连接,随后打印出整条蛇,改变相应的分数,最后销毁的食物空间,创建一个新的食物。

32be51fb938348ffb2004f8a0f3db2e8.png

 若不是食物,则创建一个新结点放在蛇头出,并与蛇连接,销毁最后一个蛇结点。

5137bc04c76146b5ba71d87efc5fc27d.png

 3.4.3撞墙或自杀

6d75ada302a745bea4a30dd8516c2b60.png

 3.5总结GameRun

756bdc569f7c44678ef02de33f7ddbe6.png

32a6d6e57cae44168c0c2c0a358c5e8c.png 

 四. GameEnd

4.1主要思路

告知死亡原因,并且释放所有结点。

4.2代码实现

6fa505fa697a4cc0a5353ed2dfba0dc9.png

 五.完整代码

5.1 test.c

7425dd7797434efe9b8d3fda7ed48037.png

 5.2 Snake.c

13cb1c345c324cb6a0a63a3f18cb67d9.png deb39b1ca437495fa99cee71fd7e0155.png

ebf1b66c70d947c8a0dd24210319cc7b.png

32590132b224400bb0a672ebb8caa599.png 

fe4862660e8244299105a13f33938140.png 

cf0e67004ba243878c493e9325e7b944.png 

6065636c384d4b2bb6cd26802a74e22f.png 

579ce56792564171b8350194de70b93b.png 

a21e71c69b274cd2b9031eaa6c4bd7c9.png 

a90169002d5145d9abd82ad3129db1d5.png 

4f3e11e6b45c4891b99133c5b41a1c24.png 

09c59871795d404db8d81c6a0c715917.png 

ed31e0071b044fbabc23669963de9ac6.png 

 5.3 Snake.h

7760f8d3e44548cd9315b150a2eb7396.png

f37f6b02f4e94ac8b22cb3357e09e99c.png 

1490e1ce662344db8337e0f85eb0d92b.png 

 

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

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

相关文章

STL序列式容器之list

相较于vector的连续性空间&#xff0c;list相对比较复杂&#xff1b;list内部使用了双向环形链表的方式对数据进行存储&#xff1b;list在增加元素时&#xff0c;采用了精准的方式分配一片空间对数据及附加指针等信息进行存储&#xff1b; list节点定义如下 template<clas…

【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看

文献&#xff1a;蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930. 本文目录 一、前言二、文献阅读-基于深度学习的复杂储层流体性质测井识别2.1 摘要2.2 当前研究不足2.3 本文创新2.4 论文…

(一)- DRM架构

一&#xff0c;DRM简介 linux内核中包含两类图形显示设备驱动框架&#xff1a; FB设备&#xff1a;Framebuffer图形显示框架; DRM&#xff1a;直接渲染管理器&#xff08;Direct Rendering Manager&#xff09;&#xff0c;是linux目前主流的图形显示框架&#xff1b; 1&am…

Java基础-Java中的常用类(上)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 String类 创建字符串 字符串长度 连接字符串 创建格式化字符串 String 方法 System类 常用方法 方…

Istio分布式链路监控搭建:Jaeger与Zipkin

分布式追踪定义 分布式追踪是一种用来跟踪分布式系统中请求的方法&#xff0c;它可以帮助用户更好地理解、控制和优化分布式系统。分布式追踪中用到了两个概念&#xff1a;TraceID 和 SpanID。 TraceID 是一个全局唯一的 ID&#xff0c;用来标识一个请求的追踪信息。一个请求…

探索Python网络请求新纪元:httpx库的崛起

文章目录 **探索Python网络请求新纪元&#xff1a;httpx库的崛起**第一部分&#xff1a;背景介绍第二部分&#xff1a;httpx库是什么&#xff1f;第三部分&#xff1a;如何安装httpx库&#xff1f;第四部分&#xff1a;简单的库函数使用方法1. 发送GET请求2. 发送POST请求3. 超…

vue使用List.reduce实现统计

需要对集合的某些元素的值进行计算时&#xff0c;可以在计算属性中使用forEach方法 1.语法&#xff1a;集合.reduce ( ( 定义阶段性累加后的结果 , 定义遍历的每一项 ) > 定义每一项求和逻辑执行后的返回结果 , 定义起始值 ) 2、简单使用场景&#xff1a;例如下面…

层归一化和批归一化

层归一化是针对某一样本的所有特征&#xff0c;批归一化是针对所有样本的某一特征。 计算公式&#xff1a;&#xff08;当前值 - 均值&#xff09;/ 标准差。 作用&#xff1a;缓解梯度消失和梯度爆炸的问题&#xff0c;并提高网络的泛化性能。 为什么Transform和BERT中使用层归…

vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果

说明 vue路由切换时&#xff0c;当前页面左侧和右侧容器分别从两侧滑出&#xff0c;新页面左右分别从两侧滑入 效果展示 路由切换-滑入滑出效果 难点和踩坑 现路由和新路由始终存在一个页面根容器&#xff0c;通过<transition>组件&#xff0c;效果只能对页面根容器有效…

docker 安装之 windows安装

文章目录 1: 在Windows安装Docker报19044版本错误的时候&#xff0c;请大家下载4.24.1之前的版本&#xff08;含4.24.1&#xff09;2: Desktop-WSL kernel version too low3: docker-compose 安装 (v2.21.0)4: 配置镜像源 1: 在Windows安装Docker报19044版本错误的时候&#xf…

【GPTs】Gif-PT:DALL·E制作创意动图与精灵动画

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;Gif-PT主要功能适用场景优点缺点 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; 使用Dalle生成用户请求的精灵图动画&#…

FastGPT部署通义千问Qwen和智谱glm模型|OneAPI配置免费的第三方API

继这篇博客之后 从零开始FastGPT本地部署|Windows 有同学问&#xff0c;不想在多个平台申请API-Key&#xff0c;不好管理且要付费&#xff0c;有木有白嫖方案呀&#xff1f; 答&#xff1a;有啊。用硅基流动。 注册方法看这篇 【1024送福利】硅基流动送2000万token啦&#xff0…

JsonCpp

参考文档&#xff1a;https://zhuanlan.zhihu.com/p/374319504 json是一种轻量级数据交换格式&#xff0c;易于阅读和编写&#xff0c;也易于机器解析和生成。使用json格式可以方便地在各个系统之间传递数据。在c中&#xff0c;有许多开源的json库可以进行json的处理。比如&am…

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕&#xff1a;printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾&#xff1a; VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序C语言概念之旅&#xff1a;解锁关…

XXL-JOB相关面试题

分布式任务调度-xxl-job 任务量大&#xff0c;分片执行 定义cron表达式灵活 定时任务失败了&#xff0c;重试和统计 xxl-job路由策略有哪些&#xff1f; 轮询 故障转移 分片广播:**广播触发对应的集群中所有机器执行一次任务,同时系统自动传递分片参数,**可以根据分片参数开发…

华东师范大学数学分析第五版PDF习题答案上册及下册

“数学分析”是数学专业最重要的一门基础课程&#xff0c;也是报考数学类专业硕士研究生的专业考试科目。为了帮助、指导广大读者学好这门课程&#xff0c;编者编写了与华东师范大学数学科学学院主编的《数学分析》(第五版)配套的辅导用书&#xff0c;以帮助读者加深对基本概念…

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH&#xff08;广义自回归条件异方差&#xff09;模型计算VaR&#xff08;风险价值&#xff09;时&#xff0c;方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…

基于YOLOv8深度学习的智慧课堂学生专注度检测系统(PyQt5界面+数据集+训练代码)

本研究提出了一种基于YOLOv8深度学习的智慧课堂学生专注度检测系统&#xff0c;旨在实现对课堂中学生专注度的实时分析与评估。随着智慧教育的快速发展&#xff0c;学生的课堂表现和专注度成为评估学习效果的重要因素之一。然而&#xff0c;传统的专注度评估方法往往依赖于主观…

如何在 Ubuntu 上安装 Emby 媒体服务器

Emby 是一个开源的媒体服务器解决方案&#xff0c;它能让你整理、流媒体播放和分享你的个人媒体收藏&#xff0c;包括电影、音乐、电视节目和照片。Emby 帮你集中多媒体内容&#xff0c;让你无论在家还是在外都能轻松访问。它还支持转码&#xff0c;让你能够播放各种格式的内容…

HarmonyOS 如何获取设备信息(系统、版本、网络连接状态)

文章目录 前言一、引入模块和基本设备信息的获取二、设备硬件和系统版本信息的获取三、获取安全相关的设备信息四、获取网络状态信息五、完整 Demo 代码1. 导入所需模块2. 获取设备基本信息代码解析 3. 检测网络连接状态4. 执行函数 总结 前言 HarmonyOS 提供了一个强大的 API…