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

news2024/10/7 8:31:19

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

控制台

      长宽

       我们第一个就来写控制台的长和宽。但是大家需要注意的,这篇博客以及上一篇博客贪吃蛇都是在编译器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.coloradmin.cn/o/1639949.html

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

相关文章

笔试狂刷--Day9(模拟 + dp + 规律)

大家好,我是LvZi,今天带来笔试狂刷--Day9 一.添加逗号 题目链接:添加逗号 分析: 模拟 代码: import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);i…

社交媒体数据恢复:TT语音

TT语音数据恢复方法 1. 恢复聊天记录 如果您的TT语音聊天记录丢失&#xff0c;可以通过以下步骤尝试恢复&#xff1a; 登录TT语音&#xff1a;首先&#xff0c;您需要登录您的TT语音账户。如果您忘记了密码&#xff0c;可以通过点击登录页面的“忘记密码”链接&#xff0c;然…

【强训笔记】day7

NO.1 思路&#xff1a;双指针模拟&#xff0c;begin表示最长数字字符串最后一个字符&#xff0c;而len表示数字字符串的长度&#xff0c;i用来遍历&#xff0c;如果为数字&#xff0c;那么定义j变量继续遍历&#xff0c;直到不为数字&#xff0c;i-j如果大于len&#xff0c;就…

基于寄存器的STM32操作流程

寄存器点灯 寄存器操作STM32的好处是不需要依靠外部文件&#xff0c;自由度更高&#xff0c;更为底层&#xff0c;但也更加繁杂。 通过寄存器点灯&#xff0c;需要按照电路结构与手册配置寄存器&#xff1a; 电路结构如下&#xff1a;可知需配置的GPIO为GPIOB5与GPIOE5。 在…

机器学习之基于Jupyter中国环境治理投资数据分析及可视化

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 机器学习之基于Jupyter中国环境治理投资数据分析及可视化项目是一个结合了机器学习和数据可视化技术的项目&#xf…

SoapUI-x64-5.7.2安装教程

http://localhost:49652/Test.asmx?WSDL 双击请求&#xff1a;

Word技巧:3种方法快速重复上一步操作

在编辑Word文档的时候&#xff0c;我们经常需要重复上一步操作&#xff0c;如果重复性的操作很多&#xff0c;就会很耽误时间&#xff0c;那怎么可以快速重复上一步操作呢&#xff1f;下面分享3种方法&#xff0c;一起来看看吧&#xff01; 方法1&#xff1a;利用“格式刷”功能…

利用亚马逊云科技GenAI企业助手Amazon Q Business构建企业代码开发知识库

2024年五一节假日的前一天&#xff0c;亚马逊云科技正式重磅发布了云计算行业期待已久的服务——Amazon Q Business。Amazon Q Business是专为企业用户打造的一个开箱即用的完善而强大企业GenAI助手。企业用户只需要将Amazon Q Business连接到现有的企业内部数据源&#xff0c;…

【免费Java系列】大家好 ,给大家出一些今天学习内容的案例点赞收藏关注,持续更新作品 !

PS:每个内容块下都有教学博文的超链接,有需要可以点过去学习 ! 目录 匿名内部类 1. 实现接口 2. 继承抽象类 3. 实现事件处理 枚举 1. 定义一个简单的枚举类型 2. 枚举类型可以有属性和方法 3. 枚举类型可以实现接口 泛型 1. 定义一个泛型类 2. 使用泛型方法 3. 泛型…

华为手机 鸿蒙系统-android studio识别调试设备,开启adb调试权限

1.进入设置-关于手机-版本号&#xff0c;连续点击7次 认证&#xff1a;有锁屏密码需要输入密码&#xff0c; 开启开发者配置功能ok 进入开发者配置界面 打开调试功能 重新在androd studio查看可运行running devices显示了&#xff0c; 不行的话&#xff0c;重启一下android …

【Flask 系统教程 4】Jinjia2模版和语法

Jinjia2 模板 模板的介绍 Jinja2 是一种现代的、设计优雅的模板引擎&#xff0c;它是 Python 的一部分&#xff0c;由 Armin Ronacher 开发。Jinja2 允许你在 HTML 文档中嵌入 Python 代码&#xff0c;以及使用变量、控制结构和过滤器来动态生成内容。它的语法简洁清晰&#…

U盘未初始化?别慌,数据还有救!

当我们将U盘插入电脑&#xff0c;期待地打开“我的电脑”或文件管理器&#xff0c;却发现U盘显示为未初始化&#xff0c;这种心情无异于一盆冷水浇头。但先别急着慌张&#xff0c;这篇文章将带你了解U盘未初始化的原因&#xff0c;并提供有效的数据恢复方案&#xff0c;让你在遭…

24.5.2数据结构|顺序表实现

主要是记笔记&#xff0c;留着以后复习回来看的&#xff0c;有些内容解释的并不清晰。也就稍微可以借鉴借鉴。 目录 一、如何定义结构&#xff1f; 二、看书搞清楚顺序表实现流程 三、使用clion写代码 实现代码过程中的错误代码 一、如何定义结构&#xff1f; 应该有的部…

AI与电力

好多写AI会导致电力匮乏的消息,不绝于耳。然而大部分只能知其然,却不能知其所以然,为什么缺,怎么缺,缺多少,没什么答案也没什么可参考的。 我关注一个事情,一般先了解一下论点,然后重点看论据,最后再自己论证合理不。今天这篇文章主要聊一下数据层面上是谈一谈AI如何导…

微信小程序+esp8266温湿度读取

本文主要使用微信小程序显示ESP8266读取的温湿度并通过微信小程序控制LED灯。小程序界面如下图所示 原理讲解 esp8266 通过mqtt发布消息,微信小程序通过mqtt 订阅消息,小程序订阅后,就可以实时收到esp8266 传输来的消息。 个人可免费注册五个微信小程序账号,在微信小程序官…

Python_GUI框架 Pyside6的信号与槽应用

Python_GUI框架 Pyside6的信号与槽应用 在Pyside6框架中&#xff0c;信号与槽&#xff08;Signals and Slots&#xff09;机制是连接用户界面元素与响应功能的核心机制。我们可以把信号想象成一根电线&#xff0c;而槽就是电线的另一端连接的灯泡。当电线&#xff08;信号&…

ubuntu 小工具

随着在专业领域待得越久&#xff0c;发现总会遇到各种奇怪的需求。因此&#xff0c;这里介绍一些ubuntu上的一些小工具。 meld 对比文件 sudo apt-get install meld sudo apt --fix-broken install # maybeHow to compare two files

量子城域网建设设备系列(二):量子密钥管系统(KMS)

在上文介绍光量子交换机的文章中我们提到&#xff0c;量子保密通信网络的通道切换是由量子密钥管理系统&#xff08;Key Management System&#xff0c;KMS&#xff09;给光量子交换机下发信道切换指令&#xff0c;实现整个网络中任意两对量子密钥分发终端的量子信道互联互通&a…

buuctf-misc-23.FLAG

23.FLAG 题目&#xff1a;stegsolve得出PK-zip文件&#xff0c;改后缀名为zip,解压后查看文件类型为ELF 使用kali-strings或者ida获取flag 点击Save Bin将其另存为一个zip文件 而后解压我们另存的这个1234.zip文件后&#xff0c;可以得到 我们用ida打开它&#xff0c;打开后就…

从零开始搭建一个vue项目

从零开始搭建一个vue项目 一、环境准备 1.1 安装node.js 选择合适的LTS版本&#xff0c;然后下载安装&#xff0c;安装地址&#xff1a;https://nodejs.org/en/download 在命令行中查看已安装的node.js版本 node -v v14.14.01.2 切换为淘宝的镜像源 解决国内下载慢的问题,…