> 文档中心 > 竟翻出高三用C语言写的贪吃蛇,分析一波

竟翻出高三用C语言写的贪吃蛇,分析一波

大家好,我是小杰。

背景

今天想起来QQ好久没有登录了,我默默的点开了我的QQ,熟练的输入账号,若有所思后输入了我的密码。密码错误?? 不慌,再试亿遍,终于登录成功了,泪目。点击了上面的微云,我看到了我的回忆与青春,看到了个压缩包,snake.zip。突然想起了我高考结束的假期自学了C语言,然后自己写了个贪吃蛇游戏 ··· ···

运行效果

可以先来看看它的运行效果,接着来以现在的眼光和水平来审视一下这个程序。

运行视频

程序分析

先来画个流程图,梳理一下它的流程是什么样的

竟翻出高三用C语言写的贪吃蛇,分析一波

这个是我根据源码画出来的流程图,下面我们着重来分析一下几个关键点

  1. 界面绘制究竟是怎么绘制的?
  2. 蛇是怎么存储的?
  3. 蛇是怎么进行移动的?

关键点一

根据下面的截图就可以看到,界面其实是预先定义好一个二位数组,然后根据我们要打印的内容。在相应的二维数组的对应位置上填好字符,最后遍历一下,把所有的字符都打印出来,未设置的都是空字符’ ‘,蛇是’*’,食物是’@’。

竟翻出高三用C语言写的贪吃蛇,分析一波

有人可能会好奇为什么左边是两层的墙,我认为应该是当时设置错了,墙应该是在右边的,我写这篇文章的时候并没有改,要的就是拿出原来真实的程序进行分析。

总体来说界面还是可以的唯一不足就是上下的间距和左右差距有点大,可以设置让上下的间距变小,这样就不会这么别扭了。

关键点二

蛇是怎么存储的?

//蛇struct SNAKE{int x;int y;struct SNAKE* next;};

可以看的出蛇的身体都是由一节一节的 struct SNAKE 来组成的,而一个完整的蛇是由链表连起来的,并且是一个带头节点的单链表,这种蛇的设计简单,也很简洁,最重要的是我们只要关心蛇头就可以了,不论怎么走,身体的任何一个部位都只不过会走蛇头走过的地方,所以只有蛇头不越界不撞到身体,就没问题

关键点三

蛇的移动是这个游戏里面设计最为复杂的一部分。

代码中的设计思路是:

  1. 首先遍历一遍蛇的每一个节点,然后把每一个’*’ 符号 打印成’ ’ 。
  2. 根据全局蛇现在的移动方向,然后进行下一步的移动,把头节点的位置更新,紧接着所有的节点位置复制前一个节点的位置
  3. 判断现在的状态,是否吃到食物,是否已经撞墙了
  4. 正常的话就把现在蛇的所有都打印出来,进行重绘,即打印’*’

总的来说思路还是可以的,但是还是有很多可以优化的思路,比如可以把第一步省去,只把最后一个的换成空字符就可以,代码方面优化的思路更多,因为那个时候毕竟是刚刚学,远没有现在代码水平和经验。

好了,今天就写到这儿,代码就不在这儿贴出来了,长度挺长的,翻起来不太好看,感兴趣的我会放到Github上。

ChineseCigarette