描述
贪吃蛇是一个带控制的基础游戏,有典型的算法,是验证一台设备的经典程序,于是我们尝试编写一个;
贪吃蛇的算法并不算复杂,但是在玩单片机硬件圈里来说,算法相对复杂,因此我们需要花篇幅来讲这个算法;
首先我们来计算一下布局:
预计显示区域 20X20,此时计算一下各分辨率尺寸:
模式 | 分辨率 | 方格点数 | 整个游戏区点数 |
---|---|---|---|
s | 320X240 | 10X10 | 200X200 |
m | 480X320 | 15X15 | 300X300 |
b | 854X480 | 20X20 | 400X400 |
算法
贪吃蛇主要的难点在于“画蛇”,而“画设”就需要在数据层面对蛇进行描述:
基础数据机构:
- 首先,我们需要记录蛇长xx点,当前蛇头的位置(x,y)
- 其次,需要记录蛇的身体,每个点一个字节,大致有下面几种情况:
相对于蛇头,第二个点的蛇身子有4种情况,分别是0、1、2、3;于是一个蛇可以用一个字符串来描述,比如:00000000 表示一只垂直向下跑的蛇;
蛇的前进:
- 四个按钮决定当前方向,0~3 表示4个方向,考虑到我们蛇头的方向,实际方向对应的数字:
- 因此得到前进一步的算法:
- 字符串左边+上新方向的字符串0~3
- 蛇头的位置按方向计算坐标
- 画蛇,循环字符串画出蛇身子,遇见最后一个点,清除那个点
- 右侧(后面)减掉1个字符
蛇吃豆
- 蛇的前进算法中,不删除最后一个字符,以及不清除最后那个点即可
碰撞检测
- 全部在画蛇算法中完成
- 蛇头的坐标不能x<0;y<0;x>=20;y>=20 有一项成立表示撞墙越界,游戏GAMEOVER
- 蛇头坐标==豆子坐标,则蛇吃豆,即不删除最后一个字符
- 画蛇身子每一个点的时候,判断当前身子点不等于蛇头坐标,如果相等,则表示蛇撞身子,GAMEOVER
优化:
- 由于蛇前进中,只有蛇头和蛇尾变化,因此蛇的中间点只做碰撞检测,而不做绘图
放豆子:
- 随机数产生豆子的坐标:
- 虚拟画蛇,判断豆子不在蛇身上;如果在,重新产生坐标,并继续判断,直到豆子不在蛇身上
总结:
以上算法明确后,我们可以设想一个大致的布局:
因此,左边我们认为做一个控件比较好