贪吃蛇
项目介绍
项目开发流程
- 需求分析
- 原型设计
- 概要设计
- 详细设计
- 编码开发
- 测试
- 上线部署
- 运行维护
1.windows.h学习
windows.h是一个很重要的头文件,它包含了其他Windows头文件,比如 wingdi.h 图形设备接口函数。
1.1 GetStdHandle
该函数用于取得指定的标准设备的句柄(标准输入,标准输出或标准错误)。
HANDLE WINAPI GetStdHandle (_In_ DWORD nStdHandle);
nStdHandle 取值 | 含义 |
---|---|
STD_INPUT_HANDLE | 标准输入的句柄 |
STD_OUTPUT_HANDLE | 标准输出的句柄 |
STD_ERROR_HANDLE | 标准错误的句柄 |
具体使用:
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
1.2 SetConsoleTitle
作用:
设置当前控制台窗口的标题。
函数原型:
BOOL WINAPI SetConsoleTitle(
_In_ LPCTSTR lpConsoleTitle
);
lpConsoleTitle参数:
指向字符串常量的指针,用于指定控制台窗口的标题。
返回值:
如果函数操作成功,返回非零值。
如果函数操作失败,返回零。
具体使用:
SetConsoleTitle("贪吃蛇 - Briup - V1.0");
1.3 SetConsoleCursorPosition
函数原型:
BOOL SetConsoleCursorPosition(
HANDLE hout, //窗口句柄
COORD coord //控制台屏幕上的坐标
);
函数作用:
该方法用于定位光标位置。
成功返回非0值,失败返回0。
参数类型:
typedef struct _COORD {
SHORT X; // 水平坐标
SHORT Y; // 竖直坐标
} COORD;
具体使用:
// 定义坐标
COORD pos;
pos.X = 0;
pos.Y = 5;
// 设置光标位置
SetConsoleCursorPosition(GetStdHandle(STD_ERROR_HANDLE),pos);
printf("HelloWorld!\n");
1.4 SetConsoleTextAttribute
函数原型:
BOOL SetConsoleTextAttribute(
HANDLE hConsoleOutput, //窗口句柄
WORD wAttributes //用来设置颜色的参数,有三种写法,16进制 10进制 枚举常量
);
函数作用:
该函数用于设置窗口字体颜色和背景色。
参数取值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JTTgsvIG-1687953881347)(assets/image-20201228174353138.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jnoq8JcF-1687953881348)(assets/image-20201228174706349.png)]
具体使用:
//1、使用16进制参数
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x06);
printf("花狗\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x07);
printf("花狗\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x08);
printf("花狗\n");
//2、使用10进制参数
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 42);
printf("花狗\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 47);
printf("花狗\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 159);
printf("花狗\n");
//3、使用其他颜色参数
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_GREEN | FOREGROUND_RED);
printf("花狗\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_GREEN | FOREGROUND_BLUE);
printf("花狗\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_RED | BACKGROUND_GREEN);
printf("花狗\n");
颜色相关定义:
属性 | 含义 |
---|---|
FOREGROUND_BLUE | 文字颜色包含蓝色 |
FOREGROUND_GREEN | 文字颜色包含绿色 |
FOREGROUND_RED | 文字颜色包含红色 |
FOREGROUND_INTENSITY | 文字颜色加强 |
BACKGROUND_BLUE | 背景颜色包含蓝色 |
BACKGROUND_GREEN | 背景颜色包含绿色 |
BACKGROUND_RED | 背景颜色包含红色 |
BACKGROUND_INTENSITY | 背景颜色加剧 |
COMMON_LVB_LEADING_BYTE | 前导字节 |
COMMON_LVB_TRAILING_BYTE | 尾随字节 |
COMMON_LVB_GRID_HORIZONTAL | 顶部水平 |
COMMON_LVB_GRID_LVERTICAL | 左垂直 |
COMMON_LVB_GRID_RVERTICAL | 正确的垂直 |
COMMON_LVB_REVERSE_VIDEO | 反转前景和背景属性 |
COMMON_LVB_UNDERSCORE | 下划线 |
1.5 system
作用:
发出一个DOS命令。
函数原型:
int system(char *command);
具体使用:
system("pause")可以实现冻结屏幕,便于观察程序的执行结果;
system("CLS")可以实现清屏操作。
system("color 0A"); 其中color后面的0是背景色代号,A是前景色代号。
system("mode con cols=100 lines=40");设置cmd控制台窗口的尺寸为40行100列。
system("mode con cp select=437");设置cmd控制台窗口所用的代码页
system("title C语言贪吃蛇");设置cmd控制台窗口的标题。
system("taskkill /f /im cmd.exe");强行关闭cmd.exe进程
1.6 综合应用
static HANDLE hout; //窗口句柄
//初始化句柄
static void initStdHandle()
{
// 固定代码设置句柄
hout = GetStdHandle(STD_OUTPUT_HANDLE);
}
//初始化窗体-固定代码
static void initWindows()
{
//1.设置标题
SetConsoleTitle("贪吃蛇 - Briup V1.0");
// 个别电脑需要 代码配置 窗口大小
/*SMALL_RECT rect = {0, 0, 100-1, 30-1};
SetConsoleWindowInfo(hout, TRUE, &rect);
COORD pos = {100, 30};
SetConsoleScreenBufferSize(hout, pos);*/
//2.设置窗口大小 30行 100列
system("mode con cols=100 lines=30");
//3.光标信息,用于隐藏光标
CONSOLE_CURSOR_INFO cursor = {
1, FALSE};
SetConsoleCursorInfo(hout, &cursor);
//4.设置窗口大小不可更改 【以下操作是一个整体】
HWND hWnd = GetConsoleWindow(); //获得cmd窗口句柄【特殊句柄,不同以往】
//获得cmd窗口对应矩形
RECT rc;
GetWindowRect(hWnd, &rc);
//5.改变cmd窗口风格 [改变指定窗口的属性]
SetWindowLongPtr(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);
//因为风格涉及到边框改变,必须调用SetWindowPos,否则无效果
SetWindowPos(hWnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, 0);
}
//修改活动坐标
static void setCursorPos(short x, short y)
{
//Window.h中固定 结构体 类型
COORD coord = {
x * 2, y};
//固定代码,不用纠结
SetConsoleCursorPosition(hout, coord);
}
1.7 其他方法补充
SetConsoleCursorInfo
函数原型:
BOOL SetConsoleCursorInfo(
HANDLE hConsoleOutput, // 句柄
CONST CONSOLE_CURSOR_INFO * lpConsoleCursorInfo // 光标信息
);
作用:
设置光标信息
参数:
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize; // 光标百分比厚度(1~100)
BOOL bVisible; // 是否可见
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
具体使用:
//设置光标隐藏,不可见
CONSOLE_CURSOR_INFO cursor = {
1, FALSE};
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(hout, &cursor);
GetConsoleWindow
函数原型:
HWND WINAPI GetConsoleWindow(void);
作用:
该函数调用成功则返回和控制台关联的窗口句柄,失败则返回NULL。
窗口,都有其唯一的句柄(hWnd)。
具体使用:
HWND hWnd = GetConsoleWindow();
GetWindowRect
函数原型:
BOOL GetWindowRect(
HWND hWnd, // 参数1:目标窗口句柄
LPRECT lpRect // 参数2:窗口的坐标结构地址,指向一个RECT结构的指针
);
作用:
该函数返回指定窗口的边框矩形的大小。
参数:
typedef struct _RECT {
LONG left; //桌面窗口到目标窗口的左边距 左
LONG top; //桌面窗口到目标窗口的顶边距 顶
LONG right; //桌面窗口到目标窗口的右边距 宽
LONG bottom; //桌面窗口到目标窗口的底边距 高
} RECT,* LPRECT;
具体使用:
//获得cmd窗口句柄
HWND hWnd = GetConsoleWindow();
//准备cmd窗口对应矩形
RECT rc;
//给矩形设置值
GetWindowRect(hWnd, &rc);
SetWindowLongPtr
函数原型:
LONG_PTRSetWindowLongPtr(
HWND hWnd, //窗口句柄
int nIndex, //
LONG_PTR dwNewLong //指定的替换值
);
函数作用:
该函数用于改变指定窗口的属性。
参数说明:
nlndex | 说明 |
---|---|
GWL_EXSTYLE | 设定一个新的扩展风格。更多信息,请见CreateWindowEx。 |
GWL_STYLE | 设定一个新的窗口风格。 |
GWL_WNDPROC | 为窗口过程设置一个新的地址。 |
GWL_HINSTANCE | 设置一个新的应用程序实例句柄。 |
GWL_ID | 设置一个新的窗口标识符。 |
GWL_USERDATA | 设置与该窗口相关的用户数据。这些用户数据可以在程序创建该窗口时被使用。用户数据的初始值为0。 |
特殊情况: | 当hWnd参数标识一个对话框,也可使用下列值: |
DWL_DLGPROC | 设置对话框过程的新地址。 |
DWL_MSGRESULT | 设置对话框中的消息处理程序的返回值。 |
DWL_USER | 设置的应用程序所私有的新的额外信息,例如句柄或指针。 |
具体使用:
//获得cmd窗口句柄
HWND hWnd = GetConsoleWindow();
//改变cmd窗口风格 [改变指定窗口的属性]
SetWindowLongPtr(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);
SetWindowPos
函数原型:
BOOL SetWindowPos(
HWND hWnd,//窗口句柄
HWND hWndInsertAfter, //排列顺序的句柄
int X, //水平坐标
int Y, //垂直坐标
int cx, //宽
int cy, //高
UINT uFlags //窗口定位标识
);
函数作用:
这个函数能改变窗口的大小、位置和设置子窗口、弹出窗口或顶层窗口的排列顺序。
返回值:
如果返回值非零表示成功,返回零表示失败。
具体使用:
//获得cmd窗口句柄
HWND hWnd = GetConsoleWindow();