一、设计思路
蛇身本质上就是个结构数组,数组里存储了坐标x、y的值,再通过一个循环把它打印出来,蛇的移动则是不断地刷新重新打印。所以撞墙、咬到自己只是数组x、y值的简单比较。
二、用上的知识点
结构数组Windows API函数
三、具体实现
先来实现静态页面,把地图、初始蛇身、食物搞定。
这里需要用到Windows API的知识,也就是对控制台上坐标的修改
//这段代码来自参考1
void Pos(int x, int y)
{
COORD pos;
HANDLE hOutput;
pos.X = x;
pos.Y = y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, pos);
}
COORD是Windows API中定义的一种结构,表示在控制台上的坐标
typedef struct _COORD {
SHORT X; // horizontal coordinate
SHORT Y; // vertical coordinate
} COORD;
而代码中第七行则是获得屏幕缓冲区的句柄,第八行是直接修改光标位置的函数。
1.地图。
有了Pos()函数,打印一个框就不是问题了。假如我们用"-"作为上下边框,把"|"作为左右边框,这看起来没什么不妥,但其实我们已经掉进了坑里,直接上代码及实际效果图吧。
//LONG==60
//WIDTH==30
void CreateMap()
{
int i;
for(i=0;i<LONG;i++)//上下两行
{
Pos(i,1);
printf("-");
Pos(i,WIDTH-1);
printf("-");
}
for(i=2;i<WIDTH-1;i++)//左右两列
{
Pos(0,i);
printf("|");
Pos(LONG-1,i);
printf("|");
}
}

发现了问题吗?这是一条正常的蛇。。。那为什么看起来不正常呢?我们把边框都换成"#"来看看…

这就清楚多了啊,要知道我们上下边框可是各有60个"#"的,长60宽30的长方形输出之后竟然成了个正方形。
原因在这

控制台上每个字符的长宽比例(像素点)是不同的,所以才会出现上图这种蛋疼的情况。
解决方法其实也很简单,我们需要引入一些特殊符号,比如"●""■""⊙"等,这些字符的特点是它占据两个普通字符的位置
所以上下边框就有60/2=30个符号,要让它仍然是个正方形的话,左右也可以设为30(28+2)个符号.
代码及效果图如下










