目录
1.项目背景
经典游戏贪吃蛇广为流传
2.游戏效果演⽰
3. ⽬标
使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇
实现基本的功能:
•
贪吃蛇地图绘制
•
蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作)
•
蛇撞墙死亡
•
蛇撞⾃⾝死亡
•
计算得分
•
蛇⾝加速、减速
•
暂停游戏
4. 技术要点
C语⾔函数、枚举、结构体、动态内存管理、链表、Win32 API等。
5. Win32 API介绍
本次实现贪吃蛇会使⽤到的⼀些Win32 API知识,那么就学习⼀下
5.1 Win32 API
Windows 这个多作业系统是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),来服务于应用程序(Application),帮助应⽤程序达到开启视窗、描绘图形、使⽤周边设备等⽬的,所以 称为 Application Programming Interface,简称 API 函数。
WIN32 API也就是Microsoft Windows 32位平台的应⽤程序编程接⼝
。
5.2 控制台程序
平常我们运⾏起来的⿊框程序其实就是控制台程序

我们可以使⽤cmd命令来设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩,30⾏,100列
1 mode con cols= 100 lines= 30
也可以通过命令设置控制台窗⼝的名字:
1 title 贪吃蛇

这些能在控制台窗⼝执⾏的命令,也可以调⽤C语⾔函数system来执⾏。例如:
# include <stdio.h>int main (){// 设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩, 30 ⾏, 100 列system( "mode con cols=100 lines=30" );// 设置 cmd 窗⼝名称system( "title 贪吃蛇" );return 0 ;}

5.3 控制台屏幕上的坐标COORD
COORD 是Windows API中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕上的坐标
typedef struct _ COORD {SHORT X;SHORT Y;} COORD, *PCOORD;
给坐标赋值:
COORD pos ={10,20};
5.4 GetStdHandle
GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。(类似水桶有把手,方便操作)
1 HANDLE GetStdHandle (DWORD nStdHandle);
可操作函数:

实例:
HANDLE hOutput = NULL ;// 获取标准输出的句柄 ( ⽤来标识不同设备的数值 )hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
5.5 GetConsoleCursorInfo
检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息
BOOL WINAPI GetConsoleCursorInfo (HANDLE hConsoleOutput,PCONSOLE_CURSOR_INFO lpConsoleCursorInfo);PCONSOLE_CURSOR_INFO是指向CONSOKE_CURSOR_INFO结构的指针,改活动接受关于主机游戏光标的信息
实例:
HANDLE hOutput = GetStdHandle (STD_OUTPUT_HANDLE);// 获取标准输出的句柄 ( ⽤来标识不同设备的数值 )GetConsoleCursorInfo (hOutput, &CursorInfo); // 获取控制台光标信息为什么是取地址符,因为cursor_info是指针
5.5.1 CONSOLE_CURSOR_INFO
这个结构体,包含有关控制台光标的信息
typedef struct _ CONSOLE_CURSOR_INFO {DWORD dwSize;BOOL bVisible;} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
•
dwSize,由光标填充的字符单元格的百分⽐。 此值介于1到100之间。 光标外观会变化,范围从完
全填充单元格到单元底部的⽔平线条。
•
bVisible,游标的可⻅性。 如果光标可⻅,则此成员为 TRUE。
1 CursorInfo.bVisible = false ; // 隐藏控制台光标
5.6 SetConsoleCursorInfo
设置指定控制台屏幕缓冲区的光标的⼤⼩和可⻅性。
BOOL WINAPI SetConsoleCursorInfo (HANDLE hConsoleOutput,const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo);
实例:
HANDLE hOutput = GetStdHandle (STD_OUTPUT_HANDLE);// 影藏光标操作CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo (hOutput, &CursorInfo); // 获取控制台光标信息CursorInfo.bVisible = false ; // 隐藏控制台光标SetConsoleCursorInfo (hOutput, &CursorInfo); // 设置控制台光标状态