再从倒数第二节开始,把前一节的坐标值赋给后一节,直到第二节得到了之前蛇头坐标。在食物被吃了之后,再调用随机出现食物函数。
如果没有吃到食物的话,先到之前最后一节的坐标处,输入空格,算是销毁它再对各节重新赋值。在蛇头后每节都赋值完成之后,根据输入值单独对蛇头赋值,如输入是'w',则往上,所以蛇头纵坐标减一。
对其余输入也是同样的道理,在snake数组各值都更新之后,再用一个函数把它打印出来。
这样移动部分就实现了,现在只需处理一些小模块就行。
5.移动后的处理。
这一部分相对简单,即对判断蛇是否撞墙、是否咬到自身,再对这种情况做处理,我们用两个函数搞定它
int ThroughWall()
{
if(snake[0].x==0 || snake[0].x==58 ||
snake[0].y==0 || snake[0].y==29)
{
Pos(25,15);
printf("撞墙 游戏结束");
return 1;
}
Pos(0,WIDTH);
printf(" ");
}
int BiteItself()
{
int i;
for(i=3;i<=2+length;i++)
if((snake[0].x==snake[i].x) && (snake[0].y==snake[i].y))
{
Pos(25,15);
printf("咬到自己 游戏结束");
return 1;
}
}
当返回值为1时,游戏也就GG了。
if(ThroughWall()==1)
{
Pos(25,WIDTH);
system("pause");
exit(0);
}
if(BiteItself()==1)
{
Pos(25,WIDTH);
system("pause");
exit(0);
}
最后再加一行Sleep()函数,对刷新时间(每次重新打印的时间间隔)做处理。speed是一个变量,在每次吃到食物后递减。
Sleep(speed);
源代码在这:结构数组实现_贪吃蛇源码
四、总结与反思。
首先从蛇的结构上来说,结构数组的实现直接无视了"效率"这个词,数组占用大量空间且有容量限制,并不是一种好办法。
其次是BUG的问题,在ThroughWall()函数中,在对蛇头坐标进行判断时在蛇头移动到(x,1)位置时,游戏直接结束,且没有任何提示。
但诡异的是,在判断后加入 Pos(0,WIDTH);printf(" "); 这两行不相干的语句后,这个问题解决了,而我对这两行语句的原有目的则只是想把闪烁不停光标放到地图外面去。
还有就是while()循环里代码行太多,特别是switch-case 里各项,蛇身的移动(结构数组个元素坐标值的变换)应该抽象成一个move()函数。
五、其他。
这是对我第一份代码(snakeV1.0)的重构,程序结构上有较大变化
重构期间研究了链表实现_贪吃蛇源码,在结构上采用了里面的部分思想。
个人空空如也的github:MagicXyxxx的github
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持ASPKU。










