文章目录
1.实现的基本功能
1) 贪吃蛇地图绘制
2) 蛇吃食物的功能(上,下,左,右方向键控制蛇的动作)
3) 蛇撞墙死亡
4)蛇撞自身死亡
5)计算得分
6)蛇身加速,减速
7)暂停游戏
在控制台(cmd)命令行打开游戏并进行游戏
2.涉及到的技术要点
c语言函数,枚举,动态内存管理,预处理指令,链表,win32API等
3.win32API
Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外,它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application),所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API 也就是Microsoft Windows32位平台的应用程序编程接口。
3.1控制台程序(Console)
-
使用cmd命令来控制窗口的长度和宽度,设置控制台窗口的大小,30行,100列
代码如下:mode con cols = 100 lines = 30
-
使用命令来控制窗口的名字
代码如下:title 贪吃蛇
这些能在控制台窗口执行的命令,也可以调用c语言函数system来执行
代码如下:
int main()
{
//设置控制台的相关属性
system("mode con cols=100 lines=30");
return 0;
}
此时窗口的大小已经变成设置我们的大小了
3.3.1system函数
在vs里用于执行命令行指令
使用时需要包含头文件<stdlib.h>
3.3.2使窗口上方显示title
-
getchar函数
getchar函数需要获取一个字符,为了避免main函数过早结束而不显示title,所以我们在程序尾添加一个getchar函数system("mode con cols=100 lines=30");//设置控制窗口的长和宽
system("title 贪吃蛇");//设置窗口的名字
getchar();//getchar函数需要输入一个字符,为避免main函数过早结束显示不了title,所以使用一个getchar函数放置main函数过早结束
//getchar();函数需要输入一个字符,不输入字符该main函数不会结束,会停留在getchar
-
使用pause指令
system("pause");//使用pause指令,程序运行到该行停止,不再继续执行
3.2控制台屏幕上的坐标COORD
COORD是WindowsAPI中定义的一个结构体,表示一个字符在控制台屏幕幕缓冲区上的坐标,坐标系(0,0)的原点位于缓冲区的顶部左侧单元格。
COORD坐标系需要包含头文件<windows.h>
代码如下:
#include<windows.h>
int main()
{
COORD pos1 = { 0,0 };
COORD pos2 = { 10,20 };//随机定义坐标
return 0;
}
3.3GetStdHandle函数
GetStdHandle函数需要包含头文件<windows.h>
GetStdHandle 是一个Windows API函数。它用于从一个特定的标准设备(标准输入-键盘、标准输出-屏幕或标准错误-屏幕)中取得一个句柄(用来标识不同设备的数值),使用这个句柄可以操作设备。
代码如下:
//获得标准输出设备的句柄-屏幕
HANDLE houtput = NULL;//HANDLE是一种指针变量
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
3.4GetConsoleCursorinfo(参数一,参数二)函数
参数一:获得的句柄,参数二:光标的结构体指针
GetStdHandle函数需要包含头文件<windows.h>
检索有关指定控制台屏幕缓冲区的光标大小和可见性的信息
int main()
{
获得标准输出设备的句柄-屏幕
HANDLE houtput = NULL;//HANDLE是一种指针变量
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursor_info;//创建一个光标的结构体指针
//获取和houtput句柄相关的控制台上的光标信息,存放在cursor_info变量中
GetConsoleCursorInfo(houtput, &cursor_info);
printf("%d\n", cursor_info.dwSize);//打印光标的大小
return 0;
}
设置光标结构体的成员属性
- dwSize,由光标填充的字符单元格的百分比。此值介于1到100之间。光标外观会变化,范围从完
全填充单元格到单元底部的水平线条。 - bVisible,游标的可见性。如果光标可见,则此成员为TRUE。
3.5SetConsoleCursorInfo(参数一,参数二)函数
参数一:获得的句柄,参数二:光标的结构体指针
用来设置指定控制台屏幕缓冲区的光标大小和可见性
代码如下:
cursor_info.dwSize = 50;
SetConsoleCursorInfo(houtput, &cursor_info);//设置光标的属性(大小和是否显示)
设置光标的是否显示
把结构体指针内的设置光标的可见的成员属性改成false
flase需要包含头文件<stdbool.h>
cursor_info.bVisible = false;
![[PixPin_2024-12-22_19-51-02.gif]\
3.6SetConsoleCursorPosition(参数一,参数二)函数
参数一:句柄(需要操作的控制台),参数二:光标的位置
设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD的pos中,调用SetConsoleCursorPosition函数将光标位置设置到指定的位置
//获得标准输出设备的句柄-屏幕
HANDLE houtput = NULL;//HANDLE是一种指针变量
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//定位光标的位置
COORD pos = { 10,20 };//放到10行20列的位置
SetConsoleCursorPosition(houtput, pos);//参数一:句柄,参数二:光标的位置
getchar();
3.7GetAsyncKeyState函数
获取按键情况-将键盘上每个键的虚拟值传递给函数,函数通过返回值来分辨按键的状态
GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果 返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬 起;如果最低位被置为1则说明,该按键被按过,否则为0
//设置一个宏来判断按键是否被按下
//结果为1表示按过,结果为0表示没有按过
#define KEY_PRESS(VK) (GetAsyncKeyState(VK)&1) ? 1 : 0
4.贪吃蛇的地图
在地图中,打印墙体使用宽字符符:口,打印蛇使用宽字符●,打印食物使用★
普通话的字符是占一个字节的,这类宽字符占用两个字节
4.1<locale.h>
本地化
<locale.h>
提供的函数用于控制C标准库中对于不同的地区会产生不一样行为的部分。
在标准中,依赖地区的部分有以下几项:
- 数字量的格式
- 货币量的格式
- 字符集
- 日期和时间的表示形式
4.2类项
通过修改地区,程序可以改变它的行为来适应世界的不同区域。但地区的改变可能会影响库的许多部分,其中一部分可能是我们不希望修改的。所以C语言支持针对不同的类项进行修改,下面的一个宏,指定一个类项:
- LC_COLLATE:影响字符串比较函数 strcoll()和strxfrm()
- LC_CTYPE:影响字符处理函数的行为。
- LC_MONETARY:影响货币格式。
- LC_NUMERIC:影响 printf()的数字格式。
- LC_TIME:影响时间格式 strftime()和wcsftime()。
- LC_ALL-针对所有类项修改,将以上所有类别设置为给定的语言环境。
4.3setlocale函数
char* setlocale (int category, const char* locale);
setlocale函数用于修改当前地区,可以针对一个类项修改,也可以针对所有类项。
setlocale的第一个参数可以是前面说明的类项中的一个,那么每次只会影响一个类项,如果第一个参数是LC_ALL,就会影响所有的类项。
C标准给第二个参数仅定义了2种可能取值:"C"((正常模式)和""(本地模式)。
setlocale的返回值是一个字符串指针,表示已经设置好的格式。如果调用失败,则返回空指针
NULL
如果想要查询当前默认地区,就把函数的第二个参数设置成NULL就可以了
4.4宽字符的打印
宽字符的字面量必须加上前缀L
,否则C语言会把字面量当做窄字符类型处理,前缀L
在单引号前面表示宽字符,在双引号前面表示为宽字符串,宽字符的打印使用wprintf,对应wprintf()
占位符为%lc
,