<强>一、设计思路强>
蛇身本质上就是个结构数组,数组里存储了坐标x, y的值,再通过一个循环把它打印出来,蛇的移动则是不断地刷新重新打印,所以撞墙,咬到自己只是数组x, y值的简单比较。
<强>二,用上的知识点强>
结构数组Windows API函数
<强>三,具体实现强>
先来实现静态页面,把地图,初始蛇身,食物搞定。
这里需要用到Windows API的知识,也就是对控制台上坐标的修改
//这段代码来自参考1 空白Pos (int x, int y) { COORD pos; 处理hOutput; pos.X=x; pos.Y=y; hOutput=GetStdHandle (STD_OUTPUT_HANDLE); SetConsoleCursorPosition (hOutput pos); } >之前COORD是Windows API中定义的一种结构,表示在控制台上的坐标
typedef struct _COORD { 短X;//水平坐标 短Y;//垂直坐标 }COORD;而代码中第七行则是获得屏幕缓冲区的句柄,第八行是直接修改光标位置的函数。
1。地图。
有了Pos()函数,打印一个框就不是问题了。假如我们用“-”作为上下边框,把“|”作为左右边框,这看起来没什么不妥,但其实我们已经掉进了坑里,直接上代码及实际效果图吧。
//长==60//宽度==30 空白CreateMap () { int我; (i=0; i<长;我+ +)//上下两行 { Pos(我,1); printf (“-”); Pos(我、宽度); printf (“-”); } (我=2;i<宽度;我+ +)//左右两列 { Pos (0, 1); printf (“|”); Pos(长1,); printf (“|”); } } >之前
发现了问题吗?这是一条正常的蛇,那为什么看起来不正常呢?我们把边框都换成“#”来看看…
这就清楚多了啊,要知道我们上下边框可是各有60个“#”的,长60宽30的长方形输出之后竟然成了个正方形。
原因在这
控制台上每个字符的长宽比例(像素点)是不同的,所以才会出现上图这种蛋疼的情况。
解决方法其实也很简单,我们需要引入一些特殊符号,比如“●”“■”“⊙”等,这些字符的特点是它占据两个普通字符的位置
所以上下边框就有60/2=30个符号,要让它仍然是个正方形的话,左右也可以设为30(28 + 2)个符号。
代码及效果图如下
空白CreateMap () { int我; (i=0; i<长;我+=2) { Pos (0); printf (“■”); Pos(我、宽度); printf (“■”); } (i=1; i<宽度;我+ +) { Pos (0, 1); printf (“■”); Pos(长2,我); printf (“■”); } } >之前
这样看就舒服多了,不过也让复杂度提升了一些,上边框每个符号的坐标分别是(0,0)(2,0)(4 0)…(2 * 2,0)这个在蛇的移动及食物的模块再提。
<强> 2。初始化一条蛇强>
因为蛇以及食物本质上都是一个坐标,所以我们可以定义一个新的数据类型节点,每一个节点都是一个存储了两个变量(x, y)的结构体,再通过节点来定义蛇和食物。
typedef结构节点{ int x; int y; }节点; 节点蛇[60]; >之前好了,我们现在定义了一条叫蛇的蛇。为了这条蛇肥胖适中长宽比例一致,我们用“⊙”代表蛇的每一节。刚开始我们令蛇出现在地图中间位置,蛇头在右,共3个节点,所以我们需要求得每个节点的坐标。
空白InitializeSnake () { int我; (i=0; i<3,我+ +) { 蛇[我]。x=(长/2 i * 2);//(30日15)(28日15)(26日15) 蛇[我]。y=宽/2; Pos(蛇[我]。x,蛇[我].y); printf (“⊙”); } }C语言结构数组实现贪吃蛇小游戏