基于C语言贪吃蛇游戏开发

贪吃蛇

项目介绍

image-20210104090505284

项目开发流程

- 需求分析
- 原型设计
- 概要设计
- 详细设计
- 编码开发
- 测试
- 上线部署
- 运行维护

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控制台窗口的尺寸为40100列。
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(); 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>