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

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 

 

相关文章:

3步实现贪吃蛇

方法很简单,打开页面,复制,粘贴 一.整体思维架构 我们根据游戏的开始,运行,结束,将整个游戏划分成三个部分。在每个部分下面又划分出多个功能,接下来我们就根据模块一一实现功能。 二.Gamesta…...

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

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

MySQL之联合查询

前文我们了解到了数据库设计的范式要求,故生活中很多相互关联的数据被拆分开来,但彼此之间通过某种条件链接,此文联合查询就是通过多表之间的连接关系,来查询我们想要的数据,即 《联合查询》 1. 联合查询简介 1.1 为什…...

[C/C++] 定位新表达式 placement new

在C中,表达式 new (ptr) T(); 展示了一种特殊的内存分配和对象构造方式,这被称为定位新表达式(placement new)。 通常,当我们使用 new 关键字时,它会在堆上动态分配内存,并调用相应的构造函数来…...

【MySQL】MySQL的笛卡尔积现象是什么?简单说说

笛卡尔积好像是个科学家,也是个学术概念,在MySQL中表示交叉连接,即:匹配一切所有的可能 举例如下: 准备两张表 【employee表】 emp_idlast_namedept_id1Smith12Johnson2 【department表】 dept_iddepartment_nam…...

《InsCode AI IDE:编程新时代的引领者》

《InsCode AI IDE:编程新时代的引领者》 一、InsCode AI IDE 的诞生与亮相二、独特功能与优势(一)智能编程体验(二)多语言支持与功能迭代 三、实际应用与案例(一)游戏开发案例(二&am…...

微搭低代码私有化部署搭建教程

目录 1 下载远程工具2 查看服务器配置3 下载部署包4 安装部署包5 系统登录总结 最近微搭推出了私有化部署版本,正好官方赠送了我一台云服务器,练习一下部署的过程,本篇作为一个实践的记录 1 下载远程工具 一般我们使用的是云服务器&#xff…...

【在Linux世界中追寻伟大的One Piece】多路转接epoll(续)

目录 1 -> epoll的工作方式 1.1 -> 水平触发(Level Triggered)工作模式 1.2 -> 边缘触发(Edge Triggered)工作模式 2 -> 对比LT与ET 3 -> 理解ET模式和非阻塞文件描述符 4 -> epoll的使用场景 5 -> epoll示例 5.1 -> epoll服务器(LT模式) 5.2…...

【不写for循环】玩玩行列

利用numpy的并行操作可以比纯用Python的list快很多,不仅如此,代码往往精简得多。 So, 这篇来讲讲进阶的广播和花哨索引操作,少写几个for循环()。 目录 一个二维的例题 一个三维的例题 解法一 解法二 更难的三维例题…...

【Nginx】反向代理Https时相关参数:

在Nginx代理后台HTTPS服务时,有几个关键的参数需要配置,以确保代理服务器能够正确地与后端服务器进行通信。一些重要参数的介绍: proxy_ssl_server_name:这个参数用于指定是否在TLS握手时通过SNI(Server Name Indicati…...

第 17 章 - Go语言 上下文( Context )

在Go语言中,context包为跨API和进程边界传播截止时间、取消信号和其他请求范围值提供了一种方式。它主要应用于网络服务器和长时间运行的后台任务中,用于控制一组goroutine的生命周期。下面我们将详细介绍context的定义、使用场景、取消和超时机制&#…...

Android Framework AMS(16)进程管理

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…...

STM32设计防丢防摔智能行李箱

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展,嵌入式系统、物联网技术、智能设备…...

【异常解决】Linux shell报错:-bash: [: ==: 期待一元表达式 解决方法

博主介绍:✌全网粉丝21W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

ML 系列: 第 23 节 — 离散概率分布 (多项式分布)

目录 一、说明 二、多项式分布公式 2.1 多项式分布的解释 2.2 示例 2.3 特殊情况:二项分布 2.4 期望值 (Mean) 2.5 方差 三、总结 3.1 python示例 一、说明 伯努利分布对这样一种情况进行建模:随机变量可以采用两个可能的值&#…...

Webpack 1.13.2 执行 shell 命令解决 打印时没有背景色和文字颜色的问题

这是因为 Webpack 1.13.2 不支持新的插件钩子 API。Webpack 1 的插件系统使用的是 plugin 方法,而不是 Webpack 4 中的 hooks。 在 Webpack 1 中,你可以使用以下代码来确保 sed 命令在打包完成后执行: const { exec } require(child_proce…...

C++构造函数详解

构造函数详解:C 中对象初始化与构造函数的使用 在 C 中,构造函数是一种特殊的成员函数,它在创建对象时自动调用,用来初始化对象的状态。构造函数帮助我们确保每个对象在被创建时就处于一个有效的状态,并且在不传递任何…...

POI实现根据PPTX模板渲染PPT

目录 1、前言 2、了解pptx文件结构 3、POI组件 3.1、引入依赖 3.2、常见的类 3.3、实现原理 3.4、关键代码片段 3.4.1、获取ppt实例 3.4.2、获取每页幻灯片 3.4.3、循环遍历幻灯片处理 3.4.3.1、文本 3.4.3.2、饼图 3.4.3.3、柱状图 3.4.3.4、表格 3.4.3.5、本地…...

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

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

树的直径计算:算法详解与实现

树的直径计算:算法详解与实现 1. 引言2. 算法概述3. 伪代码实现4. C语言实现5. 算法分析6. 结论在图论中,树的直径是一个关键概念,它表示树中任意两点间最长路径的长度。对于给定的树T=(V,E),其中V是顶点集,E是边集,树的直径定义为所有顶点对(u,v)之间最短路径的最大值。…...

conda创建 、查看、 激活、删除 python 虚拟环境

1、创建 python 虚拟环境 ,假设该环境命名为 “name”。 conda create -n name python3.11 2、查看 python 虚拟环境。 conda info -e 3、激活使用 python 虚拟环境。 conda activate name 4、删除 python 虚拟环境 conda remove -n name --all ​​ 助力快速掌握数据集…...

vs2022搭建opencv开发环境

1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器,将OpenCV中lib库里的o…...

NVIDIA NIM 开发者指南:入门

NVIDIA NIM 开发者指南:入门 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息?加入 NVIDIA 开发者计划,即可免费访问任何基础设施云、数据中心或个人工作站上最多 16 个 GPU 上的自托管 NVIDIA NIM 和微服务。 加入免费的 NVIDIA 开发者计…...

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

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

学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着

ArcGIS水文分析实战教程(7)细说流域提取_汇流域栅格-CSDN博客 ArcGIS水文分析实战教程(6)河流提取与河网分级_arcgis的dem河流分级-CSDN博客 ArcGIS水文分析实战教程(5)细说流向与流量-CSDN博客 ArcGIS …...

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过,上架后却一直无法被搜索到。打开后,再在 QQ 上下拉查看 “最近使用”,发现他出现一下又马上消失。 上线是按正常流程走的,开发、备案、审核,没有任何违规&#xf…...

【C++】拷贝构造 和 赋值运算符重载

目录: 一、拷贝构造 (一)拷贝函数的特点 二、赋值运算符重载 (一)运算符重载 (二)赋值运算符重载 正文 一、拷贝构造 如果一个构造函数的第一个参数是自身类类型的引用,且任何…...

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档: 3.加载游戏,保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂,中间没有运行程序进行阶段性成果的验…...

「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号

本篇将继续讲解PTA平台上的题目 L1-005 考试座位号,通过考生准考证号与座位号的对应关系,掌握简单的数据查询与映射操作,进一步提升Cangjie编程语言的实际应用能力。 关键词 PTA刷题数据查询映射操作输入输出Cangjie语言 一、L1-005 考试座位…...

Vue3引用高德地图,进行位置标记获取标记信息

首先安装地图插件 cnpm i amap/amap-jsapi-loader --save封装地图子组件 <template><el-dialogtitle"选择地点"width"740px"class"select-map-dialog"v-model"dialogShow":close-on-click-modal"false":modal-or…...

成都做网站/线上营销推广方式有哪些

Entity Framework Code First 简称 EF CF也行&#xff0c;就是在开发的时候&#xff0c;以代码先行的原则&#xff0c;开发人员无需考虑 数据库端的一些问题&#xff08;开发过程中基本不需要在数据库管理器上操作&#xff09; 言归正传吧&#xff0c;最近刚刚入手MVC EF 的CF开…...

网站可做哪些服务/武汉seo推广优化

(精)最新c语言程序设计考试模拟题(v20090531)C语言程序设计期末考试模拟题0 课程成绩组成与考试环境(1)课程成绩&#xff1d;平时成绩(100分制)0.3&#xff0b;考试成绩(100分制)0.7。(2)平时成绩中&#xff0c;教师应考虑30分以上的成绩为团队互助与协作能力考核。(3)考试成绩…...

兼职刷客在哪个网站做/张雷明任河南省委常委

UDP1、将数据及源和目的地址封装成数据包中&#xff0c;不需要建立连接&#xff1b;2、每个数据报的大小限制在64k内&#xff1b;3、因无连接&#xff0c;是不可靠协议&#xff1b;4、不需要建立连接&#xff0c;速度快。 TCP1、建立连接&#xff0c;形成传输数据的通道&#x…...

北京市住房和城乡建设委员会官方网站/站长工具果冻传媒

构造函数的继承 现在有一个"动物"对象的构造函数 function Animal(){this.species "动物";} 还有一个"猫"对象的构造函数 function Cat(name,color){this.name name;this.color color;} 怎样才能使"猫"继承"动物"呢&…...

浏阳企业网站建设/营销网络怎么写

【单选题】图的深度优先 遍历 类似于二叉树的( )。【其它】泰罗的科学管理理论放在现在还适用么?【其它】实验三的内容见资料,必须按实验报告格式填写(有7个小标题),可组织成word格式提交或直接在答案框中提交。【单选题】下面关于图(网)的叙述,正确的是( ) 。【简答题】作业?…...

眉山市建设局网站/网站的seo方案

其实并不是无效&#xff0c;只是假如当你从php5.6切换到php7.0时&#xff0c;phpStudy版本是切换了&#xff0c;但你的环境变量还是你php5.6的环境变量&#xff0c;所以就导致始终指向的都是php5.6&#xff0c;所以才会感觉没有效果&#xff0c;此时你只需要在cmd下打印一下php…...