C语言结构数组实现贪吃蛇小游戏

2020-01-06 17:22:41王旭

一、设计思路

蛇身本质上就是个结构数组,数组里存储了坐标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("|"); 
 } 
} 


C语言,贪吃蛇

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

C语言,贪吃蛇

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

原因在这

C语言,贪吃蛇

控制台上每个字符的长宽比例(像素点)是不同的,所以才会出现上图这种蛋疼的情况。

解决方法其实也很简单,我们需要引入一些特殊符号,比如"●""■""⊙"等,这些字符的特点是它占据两个普通字符的位置

所以上下边框就有60/2=30个符号,要让它仍然是个正方形的话,左右也可以设为30(28+2)个符号.

代码及效果图如下