C语言----贪吃蛇(补充)

       各位看官好,我想大家应该已经看过鄙人的上一篇博客贪吃蛇了吧。鄙人在上一篇博客中只是着重的写了贪吃蛇的实现代码,但是前期的一些知识还没有具体的介绍,比如确认光标位置,句柄等。那么我这一篇博客就来补充上一篇博客所留下来的坑吧。

控制台

      长宽

       我们第一个就来写控制台的长和宽。但是大家需要注意的,这篇博客以及上一篇博客贪吃蛇都是在编译器win32的情况下实现的,大家记得改。

        相信看过上一篇博客的看官都知道,我们控制台其实就是一个xy轴坐标,只是y轴在下方而已,写法是与我们平常的认真一样的。那么改变控制台我们需要用到mode con cols=xx  lines=xx其中xx我们控制行和列大小。但是我们也不能直接给编译器写一个这个,不然编译器是会报错的。我们还需要在前面加一个system()这是我们接下来指令实现的关键。而且大家都知道这些库函数都是有一个头文件的,那么这些库函数的头文件的<stdio.h>。如果想知道这些是如何实现的话那可就难为鄙人,毕竟鄙人还学识商洽,回答不了这些高深的问题,现在大家知道有这么个东西和使用方法就可以了。那么接下里就直接给大家看看使用方法:

没有改变:

改变后:

int main()
{system("mode con cols=50 lines=50");return 0;
}

      大家可以清晰的看出当我们改变后控制台明显变窄了,但长度却变得很大。这也是我上一篇博客中写出来的y轴是x轴的两倍,也就是说x轴是只占一个字节,但是y轴是占两个字节的,这个大家应该都知道吧?并且还是在上一篇博客中我出了明显的图片,大家可以在上一篇博客看看。

名字

     好了,当我们讲过了控制台的长短问题后,接下来我们讲一下改变控制台的名字。但是改名字就比改控制台的长短就简单多了我们只需要将system后面的内容改为title+名字这样我们就能将控制台的名字改好了。

     没改前:

改变后:

int main()
{system("title YH");return 0;
}

     大家可以清晰的看到在我们没有更改名字之前是一串地址,但是当我们更改后就成为了我们更改后面的名字。并且更改名字的代码比更改控制台长短的代码简单很多少简单很多。那么上面那个代码就是上一篇博课中关于控制台的坑了。

光标

        那么当我们写了关于控制台的代码之后,我们就来写我们上一篇博课中出现最多次的光标问题。在上一篇补课中,我们都知道需要改变光标的位置,然后打印出提示。所以改变光标位置是很重要的。那么接下来就由我们先来看一下上一篇补课的坑。

COORD

       这一个指令大家可能会比较陌生,因为我们在现实写代码之前就知道需要多次的改变光标的位置,并且我们也不是很了解光标的位置,所以COORD就是给我们的坐标赋值的。并且这个指令是很简单的,这就是我们在Windows里面定义一个结构体。然后表示一个制服在控制台中的坐标起始位置是(0.0)然后当我们需要改变坐标位置就只需要写COORD pos = {xx,xx },但是大家如果直接写以上的代码的话会发现编译器报错的:

       那么报错是因为什么呢?不知道大家是否还记得上一篇博客中我们写过的句柄?我们当时说这就好比一口锅,我们需要炒菜的时候需要拿着锅柄,然后再翻炒菜。那么在这里也是如同这样的一个道理,我们需要改变光标的位置的话,就是需要先获得句柄。那么接下来我们就先为大家讲述一下句柄是如何获得的。这里大家先知道上面的代码是个什么意思,然后记得需要与一些代码一起使用就可以了。

GetStdHandle

       那么以上的制指令就是我们上一个小节讲的句柄了。但是大家可能会想,为什么要需要一个句柄?真的就只像一口锅一样需要一个锅柄吗?其实是不然的,因为我们大家都知道c语言的使用范围是很广的,使用地区也很广。所以对于每一个特定的地区,c语言的编译者设计出了这么一个指令,以此获得特定的标准设备。好了,那我们接下来讲句柄是如何获得,其中HANDLE hOutput = NULL可以不用写,我们直接将这个代码改为HANDLE houput = GetStdHandle(STD_OUTPUT_HANDLE);这样可能会觉得好看一点。

int main()
{HANDLE hOutput = NULL;//获取标准输出的句柄(⽤来标识不同设备的数值)hOutput = GetStdHandle(STD_OUTPUT_HANDLE);system("mode con cols=50 lines=50");COORD pos = { 10, 15 };return 0;
}

        要么当我们有了锅柄可以拿到锅之后,我们需要操作的话肯定不能拿手操作呀。我们炒菜都需要一个铲子的,那么我们就c语言里面肯定有专门的操作指令来改变这一些我们需要改变的信息。所以接下来我们就来讲解改变这些的信息的指令。

GetConsoleCursorInfo

         接下来的这个指令是检索有关指定控制台的光标大小和可见的信息。大家可能会想这个有什么用呢?我们应该大家可以想一下,我们在使用任何一个物品之前,它如果存在的话,那么它一定都会有一些基本信息吧。如果我们想要改变他,那最好的方法就是在他的基础上加以改变,那么我们这里需要改变光标的信息的话,肯定要先获得光标的信息。所以这个指令就是检索光标的大小和可见的信息。大家需要注意是检索。就是获得接收并不是可以直接拿来用的。大家可能会想这个有什么用呢?我们应该大家可以想一下,我们在使用任何一个物品之前,它如果存在的话,那么它一定都会有一些基本信息吧。如果我们想要改变他,那最好的方法就是在他的基础上加以改变,那么我们这里需要改变光标的信息的话,肯定要先获得光标的信息。所以这个指令就是检索光标的大小和可见的信息。大家需要注意是检索。就是获得接收并不是可以直接拿来用的。GetConsoleCursorInfo(hOutput, &CursorInfo);这个要与我们上一个指令一起连用。

        大家需要注意的是这其实是一个结构体,关于这个结构体里面有包含控制台的光标信息。这个歌结构体内部是这样的。

typedef struct _CONSOLE_CURSOR_INFO {DWORD dwSize;BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

        其中dwSize,由光标填充的字符单元格的百分⽐。 此值介于1到100之间。 光标外观会变化,范围从完全填充单元格到单元底部的⽔平线条。而bVisible,游标的可⻅性。 如果光标可⻅,则此成员为 TRUE。已就是说dwSize是控制光标大小的,bVisble是控制能不能看见的

       大家可以看到我在代码中将光标设置为看不见,所以我们的控制台中也看不见了。这个在现在我们所学的知识里面是不怎么用的上的,但是我们只需要知道有这么一个东西对于后来做项目可能会有很大的帮助。就可以了。

       并且我们也可以看到在上一个代码中我们写出了一个SetConsoleCursorInfo ,当时在代码里面我只是为了将效果呈现出来,所以就提前写出来了。这个就是我当时在图片上写的,将仲裁屏幕的光标的大小可见性设置。至于用法就是像上面说的一样。我们将创建好的句柄和光标结构体给放进去,那么就可以实现我们当时设置的光标信息了。这个其实很简单,大家只需要知道我们需要将光标的信息设置好,并且实现出来的话,就需要在最后写一个这个就可以了。

SetConsoleCursorPosition

        那么接下来我们这个指令就是我们前期多次提到的将光标设置到我们指定的位置。它的用法其实也很简单,只是只需要我们在最开始是将我们的坐标赋值写好之后,我们然后再获取句柄,然后再用它来设置的就可以了。那么接下来我们就直接看一下代码吧。

       大家可以很明显的看到我们的光标位置确实发生改变了,不再是我们最开始的从(0.0)的位置开始了所以说这个指定是很简单的,我们只需要前期将COORD确定好并且获取句柄。写出我们想要的放置的坐标位置就可以了。

按键

GetAsyncKeyState

       当我们写了控制台和光标的指令之后,那么我们要解决我们上一篇补课中写到的按键的问题,大家都知道我们现在打游戏,打电脑游戏都需要上下左右控制的。电脑如何知道我们按是否按下了按键,这个就需要我们前期写好判断,是吧。那么接下来我们就来解决这个问题。

       但其实这个也是很简单的,因为早在我们使用之前c语言的编译者,他已经想到了这种情况,提前写好了一个函数。GetAsyncKeyState并且GetAsyncKeyState的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果 返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1. 

#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )

        但是大家需要注意的是这里的案件并不是与我们想象中的案件一模一样,因为我们需要写案件是否的话位置的话需要的虚拟键码。大家也知道我们代码键盘上的键是有很多的,还有包括鼠标这些,所以我们有一个完整的虚拟键代码,大家如果感兴趣的话可以点击一下这个链接。其中value就是我们是否按下的了,大家可以看一下简单的是如何实现的:

int main()
{ while (1){if (KEY_PRESS(0x30)){printf("0\n");}else if (KEY_PRESS(0x31)){printf("1\n");}else if (KEY_PRESS(0x32)){printf("2\n");}else if (KEY_PRESS(0x33)){printf("3\n");}else if (KEY_PRESS(0x34)){printf("4\n");}else if (KEY_PRESS(0x35)){printf("5\n");}else if (KEY_PRESS(0x36)){printf("6\n");}else if (KEY_PRESS(0x37)){printf("7\n");}else if (KEY_PRESS(0x38)){printf("8\n");}else if (KEY_PRESS(0x39)){printf("9\n");}}return 0;
}

        其实也很简单,我们只需要判断它传回来的值是零或者一就可以了,然后再做出按下键会引起了一系列操作。

        以上就是我认为上一篇补课中所留下来的坑,然后补充完了,希望大家可以和结合这一篇补课仔细理解上一篇贪吃蛇的所有内容。

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

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

相关文章

nacos2.3.x 修改登陆密钥

在使用nacos2.3.x的时候&#xff0c;启动之后&#xff0c;可以不用登陆&#xff0c;直接进入nacos的控制台&#xff0c;但是会提示去开启鉴权&#xff0c;开启的方式如下&#xff1a; 重启nacos之后&#xff0c;再次访问nacos时&#xff0c;就会跳到登陆页面&#xff0c;默认登…

JAVA面试专题-框架篇(Spring+Mybatis)

Spring Spring框架中的单例bean是线程安全的吗&#xff1f; bean上面可以加入注解Scope&#xff0c;如果是singleton&#xff08;默认&#xff09;&#xff0c;意味着bean在每个spring IOC容器中只有一个实例&#xff1b;如果是prototype&#xff0c;说明一个bean定义可以有多…

nginx--配置文件

组成 主配置文件&#xff1a;nginx.conf 子配置文件&#xff1a;include conf.d/*.conf 协议相关的配置文件&#xff1a;fastcgi uwsgi scgi等 mime.types&#xff1a;⽀持的mime类型&#xff0c;MIME(Multipurpose Internet Mail Extensions)多用途互联⽹网邮件扩展类型&…

NASA数据集——NASA 标准二级(L2)暗目标(DT)气溶胶产品每 6 分钟在全球范围内对陆地和海洋上空的气溶胶光学厚度(AOT)产品

VIIRS/NOAA20 Dark Target Aerosol 6-Min L2 Swath 6 km 简介 NOAA-20&#xff08;前身为联合极地卫星系统-1&#xff08;JPSS-1&#xff09;&#xff09;--可见红外成像辐射计套件&#xff08;VIIRS&#xff09;NASA 标准二级&#xff08;L2&#xff09;暗目标&#xff08;D…

NASA数据集——VIIRS每日 L3深蓝气溶胶网格产品(AERDB_D3_VIIRS_SNPP),以 1 x 1 度

VIIRS/SNPP Deep Blue Level 3 monthly aerosol data, 1 degree x1 degree grid 简介 美国国家航空航天局&#xff08;NASA&#xff09;的可见红外成像辐射计套件&#xff08;VIIRS&#xff09;标准三级&#xff08;L3&#xff09;每月深蓝气溶胶产品来自苏米国家极轨伙伴关系…

机器学习:基于Sklearn、XGBoost,使用逻辑回归、支持向量机和XGBClassifier预测股票价格

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

推开通用人工智能大门,多模态大模型是新一代人工智能技术范式

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

C——双向链表

一.链表的概念及结构 链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。什么意思呢&#xff1f;意思就是链表在物理结构上不一定是连续的&#xff0c;但在逻辑结构上一定是连续的。链表是由一个一个的节点连…

【15】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

windows 驱动开发-DMA技术(三)

在早期&#xff0c;是按照基于包或者基于流的方式来描述DMA的&#xff0c;不过这个描述可能不准确&#xff0c;故在Vista之后修改为使用数据包/使用公共缓冲区的系统DMA。 简单的解释一下基于包和基于流的说法的原因&#xff0c;数据包是指一个个基于一定大小的数据块&#xf…

IDA pro动态调试so层初级教程

一、开启服务 adb push D:\MyApp\IDA_Pro_7.7\dbgsrv\android_server64 /data/local/tmpadb shell cd /data/local/tmp chmod 777 android_server64 ./android_server64二、IDA附加进程 十万个注意&#xff1a;IDA打开的so文件路径不能有中文 手机打开要调试的app 附加成功

讯飞星火大模型赋能教育,引领教育实现数字化转型 | 最新快讯

&#xff08;原标题&#xff1a;讯飞星火大模型赋能教育&#xff0c;引领教育实现数字化转型&#xff09; 随着人工智能的发展&#xff0c;大模型正成为人们获取知识、学习知识的“超级助手”&#xff0c;是解放生产力、释放想象力的“好帮手”。随着大模型在多个领域大放异彩…

guidance - Microsoft 推出的编程范式

文章目录 一、关于 guidance安装 二、加载模型llama.cppTransformersVertex AIOpenAI 三、基本生成四、限制的生成选择&#xff08;基本&#xff09;正则表达正则表达式来限制生成正则表达式作为停止标准 上下文无关语法 五、状态控制生成1、不可变对象中的状态2、有状态的 gui…

Nodejs 第六十九章(杀毒)

杀毒 杀毒&#xff08;Antivirus&#xff09;是指一类计算机安全软件&#xff0c;旨在检测、阻止和清除计算机系统中的恶意软件&#xff0c;如病毒、蠕虫、木马、间谍软件和广告软件等。这些恶意软件可能会对计算机系统和用户数据造成损害&#xff0c;包括数据丢失、系统崩溃、…

基于ROS从零开始构建自主移动机器人:仿真和硬件

书籍&#xff1a;Build Autonomous Mobile Robot from Scratch using ROS&#xff1a;Simulation and Hardware 作者&#xff1a;Rajesh Subramanian 出版&#xff1a;Apress 书籍下载-《基于ROS从零开始构建自主移动机器人&#xff1a;仿真和硬件》您将开始理解自主机器人发…

(1)从头搞懂 Transformer模型(图解)

1、Transformer简介 GPT回答&#xff1a;&#xff08;面试被问到可以这么介绍&#xff09; Transformer是一种用于处理序列数据的深度学习模型架构&#xff0c;最初由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它在处理序列到序列&#xff08;seq2seq&…

2024年Q1葡萄酒行业线上电商(京东天猫淘宝)销售排行榜

五一聚餐不可缺少饮品——葡萄酒。鲸参谋监测的线上电商平台&#xff08;某东&#xff09;Q1季度葡萄酒行业销售数据已揭晓&#xff01; 从鲸参谋的数据中&#xff0c;我们可以明显看到今年Q1季度在线上电商平台&#xff08;某东&#xff09;葡萄酒行业的销售情况呈现出积极的…

Java面试八股之int和Integer有什么区别

int和Integer有什么区别 基本类型与包装类&#xff1a; int&#xff1a;int是Java中的一个基本数据类型&#xff08;primitive type&#xff09;&#xff0c;用于表示整数。它直接存储数值&#xff0c;没有独立的对象实例&#xff0c;不涉及内存管理。 Integer&#xff1a;I…

WebGL渲染引擎优化方向 -- 加载性能优化

作者&#xff1a;caven chen 前言 WebGL 是一种强大的图形渲染技术&#xff0c;可以在浏览器中快速渲染复杂的 3D 场景。但是&#xff0c;由于 WebGL 的高性能和高质量要求&#xff0c;如果不注意性能优化&#xff0c;它可能会消耗大量的 CPU 和 GPU 资源&#xff0c;导致应用…

使用 VLC Media Player 播放 RTSP 流媒体

VLC 是一款自由、开源的跨平台多媒体播放器及框架&#xff0c;可播放大多数多媒体文件&#xff0c;以及 DVD、音频 CD、VCD 及各类流媒体协议&#xff0c;也可以播放 RTSP 流媒体。 一、简介&#xff1a; VLC Media Player 是一款功能强大且开源的跨平台多媒体播放器。 支持…