解释小部分分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,

相关推荐
yangfeipancc1 小时前
数据库-用户管理
android·数据库
字节流动1 小时前
Android Java 版本的 MSAA OpenGL ES 多重采样
android·java·opengles
xuanfengwuxiang1 小时前
安卓帧率获取
android·python·测试工具·adb·性能优化·pycharm
GesLuck5 小时前
C#开发实例1—彩票选号
开发语言·c#
柯南二号5 小时前
Task ‘wrapper‘ not found in project ‘:example‘. 报错解决
android·gradle·hippy
我又来搬代码了5 小时前
【Android】项目升级时报错 android:style/Holo.Widget
android·gitee
neter.asia7 小时前
C# 窗体应用程序嵌套web网页,基于谷歌浏览器内核(含源码)
开发语言·c#
小猪写代码8 小时前
C语言:递归函数(新增)
算法·c#
洞见不一样的自己8 小时前
android 常用方法
android
暗碳8 小时前
华为麦芒5(安卓6)termux记录 使用ddns-go,alist
android·linux