第
30
讲
-
项
⽬
实
践
-
贪
吃
蛇
⽬
录
:
1.
游
戏
背
景
2.
游
戏
效
果
演
⽰
3.
课
程
⽬
标
4.
课
程
定
位
5.
技
术
要
点
6.
贪
吃
蛇
游
戏
设计
与
分
析
7.
贪
吃
蛇
游
戏
数
据
结
构
设计
8.
相
关
Win32API
介
绍
9.
参
考
代
码
正
⽂
开
始
1.
游
戏
背
景
贪
吃
蛇
是
久
负
盛
名
的
游
戏
,
它
也
和
俄
罗
斯⽅
块
,
扫
雷
等
游
戏
位
列
经
典
游
戏
的
⾏
列
。
在
编
程
语
⾔
的
教
学
中
,
我
们以
贪
吃
蛇
为
例
,
从
设计
到
代
码
实
现
来
提
升
学
⽣
的
编
程
能
⼒
和
逻
辑
能
⼒
。
2.
游
戏
效
果
演
⽰
比特就业课
比特就业课主页:https://m.cctalk.com/inst/s9yewhfr
比特就业课-专注IT大学生就业的精品课程
3.
课
程
⽬
标
使
⽤
C
语
⾔
在
Windows
环
境
的
控
制
台
中
模
拟
实
现
经
典
⼩
游
戏
贪
吃
蛇
实
现
基
本
的
功
能
:
•
贪
吃
蛇
地图
绘
制
•
蛇
吃
⻝
物
的
功
能
(
上
、
下
、
左
、
右
⽅
向
键
控
制
蛇
的
动
作
)
•
蛇
撞
墙
死
亡
•
蛇
撞
⾃
⾝
死
亡
•
计
算
得
分
•
蛇
⾝
加
速
、
减
速
•
暂
停
游
戏
4.
课
程
定
位
•
提
⾼
学
⽣
对
编
程
的
兴
趣
•
对
C
语
⾔
语
法
做
⼀个
基
本
的
巩
固
。
•
对
游
戏
开
发
有
兴
趣
的
同
学
做
⼀个
启
发
。
•
项
⽬
适
合
:
C
语
⾔
学完
的
同
学
,
有
⼀
定
的
代
码
能
⼒
,
初
步
解
除
数
据
结
构
链
表
。
5.
技
术
要
点
比特就业课
比特就业课主页:https://m.cctalk.com/inst/s9yewhfr
比特就业课-专注IT大学生就业的精品课程
C
语
⾔
、
数
据
结
构
(
链
表
)
、
枚
举
、
结
构
体
、
动
态
内
存
管
理
、
预
处
理
指
令
、
win32API
6. Win32API
介
绍
本
次
实
现
贪
吃
蛇
会使
⽤
到
的
⼀些
Win32API
知
识
,
那
么
就
学
习⼀下
6.1
Win32API
Windows
这
个
多
作
业
系
统
除
了
协
调
应
⽤
程
序
的
执
⾏
、
分
配
内
存
、
管
理
资
源
之
外
,
它
同
时
也
是
⼀个
很
⼤
的
服
务
中
⼼
,
调
⽤
这
个
服
务
中
⼼
的
各
种
服
务
(
每
⼀
种
服
务
就
是
⼀个
函
数
),
可
以
帮应
⽤
程
式
达
到
开
启
视
窗
、
描
绘
图
形
、
使
⽤
周
边
设
备
等
⽬
的
,
由
于
这
些
函
数
服
务
的
对
象
是
应
⽤
程
序
(Application)
,
所
以便
称
之为
ApplicationProgrammingInterface
,
简
称
API
函
数
。
WIN32API
也
就
是
MicrosoftWindows
32
位
平
台
的
应
⽤
程
序
编
程
接
⼝
。
6.2
控
制
台
程
序
平常
我
们
运
⾏
起
来
的
⿊
框
程
序
其
实
就
是
控
制
台
程
序
我
们
可
以使
⽤
cmd
命
令
来
设
置
控
制
台
窗
⼝
的
⻓
宽
:
设
置
控
制
台
窗
⼝
的
⼤
⼩
,
30
⾏
,
100
列
mode con cols=100 lines=30
1
也
可
以
通过
命
令
设
置
控
制
台
窗
⼝
的
名
字
:
title
贪
吃
蛇
1
6.3
控
制
台
屏
幕
上
的
坐
标
COORD
COORD
是
WindowsAPI
中
定
义
的
⼀
种
结
构
,
表
⽰
⼀个
字
符
在
控
制
台
屏
幕
上
的
坐
标
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, *PCOORD;
1
2
3
4
比特就业课
比特就业课主页:https://m.cctalk.com/inst/s9yewhfr
比特就业课-专注IT大学生就业的精品课程
给
坐
标
赋
值
:
COORD pos = { 10, 15 };
1
6.4
GetStdHandle
GetStdHandle
是
⼀个
Windows
API
函
数
。
它
⽤
于从⼀个
特
定
的
标
准
设
备
(
标
准
输
⼊
、
标
准
输
出
或
标
准
错
误
)
中
取
得
⼀个
句
柄
(
⽤
来
标
识
不
同
设
备
的
数
值
),
使
⽤
这
个
句
柄
可
以
操
作
设
备
。
HANDLE GetStdHandle(DWORD nStdHandle);
1
实
例
:
HANDLE hOutput = NULL;
//
获
取
标
准
输
出
的
句
柄
(
⽤
来
标
识
不
同
设
备
的
数
值
)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
1
2
3
4
6.5 GetConsoleCursorInfo
检
索
有
关
指
定
控
制
台
屏
幕
缓
冲
区
的
光
标
⼤
⼩
和可
⻅
性
的
信
息
BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
1
2
3
4
实
例
:
HANDLE hOutput = NULL;
//
获
取
标
准
输
出
的
句
柄
(
⽤
来
标
识
不
同
设
备
的
数
值
)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);
//
获
取
控
制
台
光
标
信
息
1
2
3
4
5
6
比特就业课
比特就业课主页:https://m.cctalk.com/inst/s9yewhfr
比特就业课-专注IT大学生就业的精品课程
6.5.1 CONSOLE_CURSOR_INFO
这
个
结
构
体
,
包
含
有
关
控
制
台
游
标
的
信
息
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize;
BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
1
2
3
4
•
dwSize
,
由
光
标
填
充
的
字
符
单
元
格
的百
分
⽐
。
此
值
介于
1
到
100
之
间
。
光
标
外
观
会
变
化
,
范
围
从
完
全
填
充
单
元
格
到
单
元
底
部
的
⽔
平
线
条
。
•
bVisible
,
游
标
的
可
⻅
性
。
如
果
光
标
可
⻅
,
则
此
成
员
为
TRUE
。
CursorInfo.bVisible = false;
//
隐
藏
控
制
台
光
标
1
6.6 SetConsoleCursorInfo
设
置
指
定
控
制
台
屏
幕
缓
冲
区
的
光
标
的
⼤
⼩
和可
⻅
性
。
BOOL WINAPI SetConsoleCursorInfo(
HANDLE hConsoleOutput,
const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);
1
2
3
4
实
例
:
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//
影
藏
光
标
操
作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);
//
获
取
控
制
台
光
标
信
息
CursorInfo.bVisible = false;
//
隐
藏
控
制
台
光
标
SetConsoleCursorInfo(hOutput, &CursorInfo);
//
设
置
控
制
台
光
标
状
态
1
2
3
4
5
6
7
6.7
SetConsoleCursorPosition
比特就业课
比特就业课主页:https://m.cctalk.com/inst/s9yewhfr
比特就业课-专注IT大学生就业的精品课程