解释小部分分WPI函数(由贪吃蛇游戏拓展)

文章目录

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)

  1. 使用cmd命令来控制窗口的长度和宽度,设置控制台窗口的大小,30行,100列
    代码如下

    mode con cols = 100 lines = 30

  1. 使用命令来控制窗口的名字
    代码如下:

    title 贪吃蛇

这些能在控制台窗口执行的命令,也可以调用c语言函数system来执行
代码如下:

复制代码
int main()
{
	//设置控制台的相关属性
	system("mode con cols=100 lines=30");
	return 0;
}

此时窗口的大小已经变成设置我们的大小了

3.3.1system函数

在vs里用于执行命令行指令
使用时需要包含头文件<stdlib.h>

3.3.2使窗口上方显示title

  1. getchar函数
    getchar函数需要获取一个字符,为了避免main函数过早结束而不显示title,所以我们在程序尾添加一个getchar函数

    system("mode con cols=100 lines=30");//设置控制窗口的长和宽
    system("title 贪吃蛇");//设置窗口的名字
    getchar();//getchar函数需要输入一个字符,为避免main函数过早结束显示不了title,所以使用一个getchar函数放置main函数过早结束
    //getchar();函数需要输入一个字符,不输入字符该main函数不会结束,会停留在getchar

  1. 使用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,

相关推荐
阿巴斯甜7 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker8 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95279 小时前
Andorid Google 登录接入文档
android
黄林晴10 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
xiezhr10 小时前
米哈游36岁程序员被曝复工当晚猝死出租屋内
游戏·程序员·游戏开发
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android