贪吃蛇代码实现与剖析(C语言)(中)

简介: 贪吃蛇代码实现与剖析(C语言)

一.Win32相关API的介绍

1.首先我们先介绍一下:什么是API?

也就是说我们Window系统给我们提供了很多函数,让我们可以通过调用这些函数去完成一些我们目前想要完成的任务

而这些函数服务的对象是应用程序

因此这些函数被称为API

1.控制台程序

1.什么是控制台程序

平常我们运⾏起来的⿊框程序其实就是控制台程序

就是这个Microsoft Visual Studio 调试控制台

在我们的Windows系统中,就有一个叫做命令提示符的工具

这个也是控制台程序

我们可以在Window系统中搜索cmd

然后打开,这个命令提示符就是控制台

我们要介绍的是:

2.命令提示符中设置控制台窗口的大小

我们可以设置控制台窗口的长宽:

比方说我现在想要让这个命令提示符的行数和列数设置为:

10行,50列

mode con cols=50 lines=10
• 1

我们输入这个命令,按下回车(就像是在Linux系统中输入命令行相同)

然后发现这个命令提示符变得特别小了

因此这就证明了我们是可以手动设置控制台大小的

3.控制台行和列的注意事项

然后我想让他变成一个正方形呢?

我们输入:让它行和列都变成30吧

mode con cols=30 lines=30
• 1

为什么不是一个正方形呢?

明明我输的是行30,列30啊

为什么会这样呢?

因为控制台中行的长度的基本单位和列的长度的基本单位不同

其实:

我们可以简单理解为:

控制台中每一行的长度==每一列的长度*2

那么我们想要构建一个正方形就可这样做了:

mode con cols=60 lines=30

这就是一个正方形了

4.VS2019中设置控制台窗口的大小

比方说我们想要一个15行,30列的一个正方形控制台窗口

mode con cols=30 lines=15

只需要包含Windows.h头文件

并且使用system函数

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

5.设置控制台名称

我们这个个界面还有一个贪吃蛇的名称

这个怎么设置呢?

跟刚才一样

只需要在VS代码里面加上

system("title 贪吃蛇");

不过我这里一开始的时候是无法修改这个控制台的名称

等到我写完贪吃蛇代码之后

控制台的名称就自然而然好了

所以大家如果在这一步无法修改名称的话,请先继续往后看

2.控制台屏幕坐标

COORD是Windows API中定义的一个结构体

它表示一个字符在控制台屏幕上的坐标

这个坐标系是这样的

typedef struct _COORD
{
  SHORT X;//X轴上的坐标
  SHORT Y;//Y轴上的坐标
}COORD,*PCOORD;
如果我们想要给这个控制台坐标赋值的话:
比方说我们给它的坐标赋值为:x轴:20,y轴:10
COORD pos = {20,10};
那么pos就是这个控制台上的对应位置的点

我们现在已经清楚了这个控制的坐标系的规则

但是还有一个问题:

这个控制台上的光标去哪了?

其实这个光标被我们隐藏了

那么我们该怎么样去隐藏这个光标呢?

别急,我们先来介绍一个函数:GetStdHandle

3.GetStdHandle

GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。

这是微软官方给的API的使用手册,大家可以看一下

Windows API索引

这个GetStdHandle函数的手册网址:GetStdHandle函数的手册网址

4.设置控制台光标状态

1.GetConsoleCursorInfo

2.CONSOLE_CURSOR_INFO

3.SetConsoleCursorInfo

也就是说我们想要隐藏光标,需要这样:

#include <stdio.h>
#include <Windows.h>
#include <stdbool.h>
int main()
{
  system("mode con cols=60 lines=20");
  HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//让handle具有能够操作控制台标准输出设备的能力/权限
  CONSOLE_CURSOR_INFO CursorInfo;//这个结构体就是定义光标信息的结构体
  GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
  CursorInfo.bVisible = false;//隐藏控制台光标的操作
  SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
  return 0;
}

不要忘了在C语言中使用bool类型的话需要包含stdbool.h头文件

这样我们就成功隐藏光标了

可是你这个控制台还能够在任意位置打印数据啊,

这肯定是通过设置光标位置做到的,那么如何才能设置光标位置呢?

4.SetConsoleCursorPosition

实例:

COORD pos = {30, 10};
 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
 //设置标准输出上光标的位置为pos
 SetConsoleCursorPosition(handle, pos);

成功在指定位置打印了hello world

5.SetPos函数的实现

那么既然我们需要很多次调整光标位置以便能够在任意位置写入数据

那么我们不妨设计一个函数SetPos来实现调整光标位置的操作呢?

于是我们就可以写出这样的函数

void SetPos(short x, short y)
{
  COORD pos = { x,y };
  HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleCursorPosition(handle, pos);
}

6.GetAsyncKeyState

下面的问题来了:

我们想要玩这个游戏,就一定要能够接收我们的输入

我们既然是在电脑上玩,那就需要使用键盘去玩

那么就一定需要编译器能够在游戏运行的时候获取按键情况

因此微软WIN32API中就给了这么一个函数GetAsyncKeyState

作用是:获取按键情况

SHORT GetAsyncKeyState(
 int vKey
);

因此我们就可以让这个返回值跟1进行按位与

如果得出来的值是1:那么就代表这个值的最低位是1,也就是说这个键被按过

如果得出来的值是0:那么就代表这个值的最低位是0,也就是说这个键没有被按过

因此我们可以写出如下的宏

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

7.打印宽字符的实现

我们现在能够在屏幕上的任意位置打印数据,还能够隐藏光标,还能检测哪些键是否被按过

那不就可以了吗?

我们还漏了一点:

这个黑色原点:也就是蛇身

这个黑色五角星,也就是食物

这个白色方块:也就是墙体

这个是怎么打印出来的呢?

键盘上也没有啊

我们可以通过

搜狗输入法->输入方式->符号大全->里面就有

然后那不就行了吗?

是不行的

因为这三个字符属于宽字符(一个宽字符占2个字节,一个普通字符占1个字节),在VS的默认情况下我们是无法单独打印这些字符的

那么如何才能打印呢?

我们的准备工作终于做完了

下面就可以开始我们贪吃蛇游戏的具体实现了

相关文章
|
2月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
2月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
2月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
3月前
|
定位技术 API C语言
C语言——实现贪吃蛇小游戏
本文介绍了一个基于Windows控制台的贪吃蛇游戏的实现方法。首先,需调整控制台界面以便更好地显示游戏。接着,文章详细描述了如何使用Win32 API函数如`COORD`、`GetStdHandle`、`GetConsoleCursorInfo`等来控制控制台的光标和窗口属性。此外,还介绍了如何利用`GetAsyncKeyState`函数实现键盘监听功能。文中还涉及了`&lt;locale.h&gt;`库的使用,以支持本地化字符显示。
62 1
C语言——实现贪吃蛇小游戏
|
2月前
|
C语言 定位技术 API
【C语言】实践:贪吃蛇小游戏(附源码)(二)
【C语言】实践:贪吃蛇小游戏(附源码)
【C语言】实践:贪吃蛇小游戏(附源码)(二)
|
3月前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
51 4
|
2月前
|
存储 定位技术 API
C语言项目实战:贪吃蛇
C语言项目实战:贪吃蛇
|
2月前
|
C语言
【C语言】实践:贪吃蛇小游戏(附源码)(三)
【C语言】实践:贪吃蛇小游戏(附源码)
|
2月前
|
存储 API C语言
【C语言】实践:贪吃蛇小游戏(附源码)(一)
【C语言】实践:贪吃蛇小游戏(附源码)
|
2月前
|
C语言
C语言练习题代码
C语言练习题代码